From 5cf8d9c6ba270302adeab3e99bff7b369b8e7386 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 18 Jan 2023 14:26:56 +0100 Subject: [PATCH 001/428] wip: prototyping a spec for the bank --- examples/cosmos-bank/bank.qnt | 345 ++++++++++++++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 examples/cosmos-bank/bank.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt new file mode 100644 index 000000000..11f900ad8 --- /dev/null +++ b/examples/cosmos-bank/bank.qnt @@ -0,0 +1,345 @@ +/** + * This is a work-in-progress protocol specification of the bank module + * that includes: + * + * 1. External behavior (via messages), and + * 2. Internal behavior (via Keeper calls). + * + * The main goal of this specification is to highlight the essential behavior + * of the bank module, while keeping the specification faithful to the + * implementation. Since it would not make a lot of sense to duplicate + * the implementation in the specification language, we naturally omit + * low-level implementation details: + * + * - All errors are replaced with a Boolean value, e.g., `false` or `true`. + * The actual error code is less important for understanding the protocol. + * + * - Low-level panics are ommitted, unless they are related to the logic + * of the bank module. In the latter case, they are replaced with Boolean + * error flags. + * + * WARNING: This spec is work in progress. It is by no means complete or correct. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // TODO: these type definitions should be defined in a general Cosmos module + type Addr = str + // TODO: specify 64-bit and 256-bit integers later, in separate modules + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are bags that are implemented via sorted arrays. + // We are simply using maps in Quint. + type Coins = str -> Int256 + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + // TODO: introduce constants, when #528 is done: + // https://github.com/informalsystems/quint/issues/528 + // all possible addresses + //const ADDR: Set[Addr] + // blocked addresses + //const BLOCKED: Set[Addr] + + /// All possible addresses. + // Fixed to a constant value for now, until #528 is closed. + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, set directly in code. + // Fixed to a constant value for now, until #528 is closed. + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or wrote by the bank. + // In contrast to the Golang version, we encapsulate the view of the context + // available to the bank in this special record. + type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // an output produced by stateful computations + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // TODO: introduce a separate module, when the modules are fixed: + // https://github.com/informalsystems/quint/issues/523 + // we isolate the keeper interface in a separate namespace + //module keeper { + + // module ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + // SKIPPED: Coins.IsValid does more tests, including the denominations format + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + + /// `GetBalance` returns the balance of a specific denomination + /// for a given account by address. + /// SDK: `func (k BaseViewKeeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin` + pure def getBalance(ctx: BankCtx, addr: Addr, denom: str): Int256 = { + if (ctx.balances.keys().contains(addr) + and ctx.balances.get(addr).keys().contains(denom)) { + ctx.balances.get(addr).get(denom) + } else { + 0 + } + } + + /// `HasBalance` returns whether or not an account has at least amt balance. + /// SDK: `func (k BaseViewKeeper) HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool` + pure def hasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + getBalance(ctx, addr, coin.denom) >= coin.amount + } + + /// `GetAccountsBalances` returns all the accounts balances from the store. + /// SDK: `func (k BaseViewKeeper) GetAccountsBalances(ctx sdk.Context) []types.Balance` + pure def getAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) + } + + // SKIPPED: not dealing with vesting accounts + // LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + + // SKIPPED: not dealing with vesting accounts + // SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + + // SKIPPED: It is simply another version of `getAllBalances` that uses an iterator. + // SDK: func (k BaseViewKeeper) + // IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(sdk.Coin) bool) + + // SKIPPED: It is simply another version of `getAccountBalances` that uses an iterator. + // IterateAllBalances iterates over all the balances of all accounts and + // denominations that are provided to a callback. If true is returned from the + // callback, iteration is halted. + // } // ViewKeeper + + // module SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, + /// `sendCoins` does not update the context in place, but it returns a new context. + /// The value `false` is returned in case of error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // SKIPPED: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// `GetParams` returns the total set of bank parameters. + /// SDK: `GetParams(ctx sdk.Context) types.Params` + pure def getParams(ctx: BankCtx): Params = ctx.params + + /// `SetParams` sets the total set of bank parameters. + /// In our specification, + /// `setParams` does not update the context in place, but returns a new context. + /// SDK: SetParams(ctx sdk.Context, params types.Params) + pure def setParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + ctx.params.sendEnabled.exists(p => p.enabled and coin.denom == p.denom) + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + coins.forall(c => isSendEnabledCoin(ctx, c)) + } + + /// `BlockedAddr` checks if a given address is restricted from receiving funds. + /// SDK: `BlockedAddr(addr sdk.AccAddress) bool` + pure def blockedAddr(addr: Addr): bool = { + addr.in(BLOCKED) + } + + // } // SendKeeper + + // module BankKeeper { + // } // BankKeeper + + // TODO: types.QueryServer + + // THE STATE MACHINE + // TODO: we should introduce the state machine in a separate module, maybe in a separate file + // module machine { + // An interesting point here. Although we specify the state machine + // of the bank module here, we could enrich its behavior by having + // more state variables. The minimal required state is encapsulated in BankCtx. + // + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function. It indicates the user's intent to write a precondition. + def when(cond) = cond + + // TODO: introduce constants for balances, accounts, and params + // when #528 is done: + // https://github.com/informalsystems/quint/issues/528 + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // when #528 is done, this will be gone + val DENOMS = Set("atom", "proton", "photon") + + // Until #528 is closed, this initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } + all { + when(accs.forall(a => validateBalance(bankIn, a))), + // set the initial state + accounts' = accs, + balances' = bals, + } + } + + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + blockTime: 0, accounts: accounts, balances: balances, params: PARAMS + } + // send the coins via the keeper + // TODO: add the validation that is done by the message handler + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + when(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a call for more than one denomination + nondet denom = oneOf(DENOMS) + nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // UNIT TESTS + // TODO: the tests should be done in a separate module, maybe in a separate file + + // all addresses but "null" have an associated account in the key/value store + // TODO: this definition is used by tests and it should be used there + val ACCOUNTS = ADDR.exclude(Set("null")) + // a simple context for testing + val CONTEXT = { + blockTime: 10, + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 1, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + assert(validateBalance(CONTEXT, "alice")) + .then(assert(not(validateBalance(CONTEXT, "null")))) + } + + // TODO: SDK does not contain test for GetBalance +} \ No newline at end of file From d096ce9e8c0fe35dfe4aac95fc469e0711aaccec Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 18 Jan 2023 22:57:28 +0100 Subject: [PATCH 002/428] add validation and require --- examples/cosmos-bank/bank.qnt | 37 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 11f900ad8..0fc8aae40 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -224,8 +224,13 @@ module bank { /// any of the coins are not configured for sending. Returns `nil` if sending is enabled /// for all provided coin. /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { - coins.forall(c => isSendEnabledCoin(ctx, c)) + pure def isSendEnabledCoins(ctx: BankCtx, coins: Coins): str = { + val asRecords = coins.keys().map(d => { denom: d, amount: coins.get(d) }) + if (asRecords.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } } /// `BlockedAddr` checks if a given address is restricted from receiving funds. @@ -253,8 +258,10 @@ module bank { // managed by the bank keeper var balances: Addr -> Coins - // A helper function. It indicates the user's intent to write a precondition. - def when(cond) = cond + // A helper function. + // It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond // TODO: introduce constants for balances, accounts, and params // when #528 is done: @@ -280,7 +287,7 @@ module bank { // validate the balances at the genesis time val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } all { - when(accs.forall(a => validateBalance(bankIn, a))), + require(accs.forall(a => validateBalance(bankIn, a))), // set the initial state accounts' = accs, balances' = bals, @@ -291,13 +298,21 @@ module bank { val oldCtx = { blockTime: 0, accounts: accounts, balances: balances, params: PARAMS } - // send the coins via the keeper - // TODO: add the validation that is done by the message handler - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. all { - when(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, coins) == ""), + require(blockedAddr(toAddr)), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts + } } } From 326b5a49073aa7c2d7be75c5f979d531d7a1acc9 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 19 Jan 2023 09:05:28 +0100 Subject: [PATCH 003/428] add a few comments --- examples/cosmos-bank/bank.qnt | 63 ++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 0fc8aae40..dad1c4178 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -24,19 +24,22 @@ */ module bank { // TODO: these type definitions should be defined in a general Cosmos module - type Addr = str - // TODO: specify 64-bit and 256-bit integers later, in separate modules - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are bags that are implemented via sorted arrays. - // We are simply using maps in Quint. - type Coins = str -> Int256 + // module cosmobits { + type Addr = str + // TODO: specify 64-bit and 256-bit integers later, in separate modules + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are bags that are implemented via sorted arrays. + // We are simply using maps in Quint. + type Coins = str -> Int256 + // } + // Account balances type Balance = { address: Addr, coins: Coins } @@ -62,9 +65,9 @@ module bank { // Fixed to a constant value for now, until #528 is closed. val BLOCKED = Set("eve") - // The part of the key-value store read by the bank or wrote by the bank. - // In contrast to the Golang version, we encapsulate the view of the context - // available to the bank in this special record. + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. type BankCtx = { // block time (needed by vesting accounts) blockTime: Int64, @@ -76,7 +79,10 @@ module bank { params: Params, } - // an output produced by stateful computations + // An output produced by stateful computations. + // This looks very much like Either[L, R] or Result[T, E] in Rust, + // which we should use in the future. See: + // https://github.com/informalsystems/quint/issues/539 type BankOut = { isError: bool, ctx: BankCtx, @@ -84,8 +90,6 @@ module bank { // TODO: introduce a separate module, when the modules are fixed: // https://github.com/informalsystems/quint/issues/523 - // we isolate the keeper interface in a separate namespace - //module keeper { // module ViewKeeper { /// `GetAllBalances` returns all the account balances for the given account address. @@ -217,16 +221,20 @@ module bank { /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - ctx.params.sendEnabled.exists(p => p.enabled and coin.denom == p.denom) + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } } /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if /// any of the coins are not configured for sending. Returns `nil` if sending is enabled /// for all provided coin. /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Coins): str = { - val asRecords = coins.keys().map(d => { denom: d, amount: coins.get(d) }) - if (asRecords.forall(c => isSendEnabledCoin(ctx, c))) { + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { "" } else { "ErrSendDisabled" @@ -305,13 +313,14 @@ module bank { // In the future, we may want to save failed transactions. all { require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, coins) == ""), - require(blockedAddr(toAddr)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(blockedAddr(toAddr))), val result = sendCoins(oldCtx, fromAddr, toAddr, coins) all { require(not(result.isError)), balances' = result.ctx.balances, - accounts' = result.ctx.accounts + accounts' = result.ctx.accounts, } } } @@ -357,4 +366,4 @@ module bank { } // TODO: SDK does not contain test for GetBalance -} \ No newline at end of file +} From 4709725f374dc41b89d27a1dd79bbaabd0d8d148 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 19 Jan 2023 12:45:01 +0100 Subject: [PATCH 004/428] add tests --- examples/cosmos-bank/bank.qnt | 111 ++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index dad1c4178..bb4e23d7f 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -282,10 +282,14 @@ module bank { defaultSendEnabled: false } - // when #528 is done, this will be gone + // When #528 is done, this will be gone. + // Tests will instantiate module constants with fixed values. val DENOMS = Set("atom", "proton", "photon") + // Initialize the state machine // Until #528 is closed, this initializer is a mock. + // When #528 is closed, we will use constants to initializes the genesis, + // and specific tests will initialize these constants to the values they need. action init = { val accs = ADDR.exclude(Set("null")) val bals = Map( @@ -296,12 +300,14 @@ module bank { val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } all { require(accs.forall(a => validateBalance(bankIn, a))), - // set the initial state + // initialize the state accounts' = accs, balances' = bals, } } + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { val oldCtx = { blockTime: 0, accounts: accounts, balances: balances, params: PARAMS @@ -327,8 +333,11 @@ module bank { action step = { // at the moment, we execute only one action, so no "any" is used - // TODO: make a call for more than one denomination + // TODO: make a case for more than one denomination nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). nondet amount = oneOf((-(2^256)).to(2^256 - 1)) nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) @@ -347,9 +356,9 @@ module bank { blockTime: 10, accounts: ACCOUNTS, balances: Map( - "alice" -> Map("atom" -> 1, "nonatom" -> 2), + "alice" -> Map("atom" -> 17, "nonatom" -> 2), "bob" -> Map("atom" -> 0) - ), + ), params: { sendEnabled: Set( { denom: "atom", enabled: true }, @@ -365,5 +374,95 @@ module bank { .then(assert(not(validateBalance(CONTEXT, "null")))) } - // TODO: SDK does not contain test for GetBalance + // An auxilliary action that keeps all variables unchanged. + // In the future, such change would be computed automatically: + // https://github.com/informalsystems/quint/discussions/70 + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + //.fail() + // TODO: if `send` above passes, the run should fail. + // If `send` fails, the test should pass. + // We need an operator that flips the expected behavior. + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank.qnt + // import bank.* + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") } From 1a06f51261f6a19ac9ab02cc1fd6a9a3527aa566 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Fri, 20 Jan 2023 09:58:45 +0100 Subject: [PATCH 005/428] use fail --- examples/cosmos-bank/bank.qnt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index bb4e23d7f..08d450d6d 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -397,10 +397,7 @@ module bank { run sendNotEnabledErrTest = { init .then(send("alice", "bob", Map("photon" -> 3))) - //.fail() - // TODO: if `send` above passes, the run should fail. - // If `send` fails, the test should pass. - // We need an operator that flips the expected behavior. + .fail() } // test that multiple denominations can be sent at once From ef15729d27ec356bbae11a069ceac84525f85dce Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 23 Jan 2023 20:57:42 +0100 Subject: [PATCH 006/428] prepare a minimal version of the bank demo --- examples/cosmos-bank/bank-mini.qnt | 352 +++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 examples/cosmos-bank/bank-mini.qnt diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt new file mode 100644 index 000000000..a1af89a63 --- /dev/null +++ b/examples/cosmos-bank/bank-mini.qnt @@ -0,0 +1,352 @@ +/** + * This is a minimized protocol specification of the bank module + * that is tuned for an efficient presentation. For a more detailed version, + * see bank.qnt. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // namespace bits { + type Addr = str + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are sorted arrays. We simply use Quint maps. + type Coins = str -> Int256 + // } + + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + /// All possible addresses, a small set for testing. + /// In Q1, it will be a parameter! + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, a small set for testing (a parameter in a full spec). + /// In Q1, it will be a parameter! + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. + type BankCtx = { + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // An output produced by Keeper computations. + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + // } // ViewKeeper + + // SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, `sendCoins` does not update the context in place, + /// but it returns a new context. + /// `isError == true` on error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + pure def getOr0(coins: Coins, d: str): int = { + if (d.in(coins.keys())) coins.get(d) else 0 + } + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // return the result + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } + } + // } // SendKeeper + + // THE STATE MACHINE + // machine { + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function: It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond + + // Tests instantiate parameters with fixed values (later, parameterized). + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // Tests instantiate denominations with fixed values (later, parameterized). + val DENOMS = Set("atom", "proton", "photon") + + // Initialize the state machine. Atm, the initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { accounts: accs, balances: bals, params: PARAMS } + all { + require(accs.forall(a => validateBalance(bankIn, a))), + // initialize the state + accounts' = accs, + balances' = bals, + } + } + + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + accounts: accounts, balances: balances, params: PARAMS + } + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. + all { + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(BLOCKED.contains(toAddr))), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts, + } + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a case for more than one denomination + nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). + nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // UNIT TESTS + + // all addresses but "null" have an associated account in the key/value store + val ACCOUNTS = ADDR.exclude(Set("null")) + + // a simple context for testing + val CONTEXT = { + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 17, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + assert(validateBalance(CONTEXT, "alice")) + .then(assert(not(validateBalance(CONTEXT, "null")))) + } + + // An auxilliary action that keeps all variables unchanged. + // In the future, such a change would be computed automatically. + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + .fail() + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank-mini.qnt::bank + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") +} From dd2345ebe3c9139f9a350d5bd26f634f1b24b2ca Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 24 Jan 2023 09:59:44 +0100 Subject: [PATCH 007/428] fix the example for the presentation --- examples/cosmos-bank/bank-mini.qnt | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index a1af89a63..5b4d2a236 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -50,16 +50,20 @@ module bank { params: Params, } - // An output produced by Keeper computations. + // An output produced by Keeper computations type BankOut = { isError: bool, ctx: BankCtx, } + // FUNCTIONAL LAYER + // ViewKeeper { /// `GetAllBalances` returns all the account balances for the given account address. /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code + // Cognitive overload? if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) } else { @@ -157,7 +161,13 @@ module bank { } // } // SendKeeper - // THE STATE MACHINE + // END OF THE FUNCTIONAL LAYER + + // STATE MACHINE + /* + ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... + */ + // machine { // managed by the account keeper var accounts: Set[Addr] @@ -229,14 +239,16 @@ module bank { // Note that the probability of randomly picking an amount that // will not fail in `send` is quite small. // Hence, we need more targeted tests (see below). - nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet amount = (-(2^256)).to(2^256 - 1).oneOf() nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) send(fromAddr, toAddr, Map(denom -> amount)) } // } - // UNIT TESTS + // END OF THE STATE MACHINE + + // UNIT TESTS + PBT TESTS // all addresses but "null" have an associated account in the key/value store val ACCOUNTS = ADDR.exclude(Set("null")) @@ -257,12 +269,6 @@ module bank { } } - // test that validateBalance is working as expected - run validateBalanceTest = { - assert(validateBalance(CONTEXT, "alice")) - .then(assert(not(validateBalance(CONTEXT, "null")))) - } - // An auxilliary action that keeps all variables unchanged. // In the future, such a change would be computed automatically. action keepVars = all { @@ -270,6 +276,16 @@ module bank { accounts' = accounts, } + // test that validateBalance is working as expected + run validateBalanceTest = { + init + .then(all { + assert(validateBalance(CONTEXT, "alice")), + assert(not(validateBalance(CONTEXT, "null"))), + keepVars, + }) + } + // test that a simple `send` goes through run sendOkTest = { init From 5fbeef5ad21a1d409d8217ea6e278530f4674b3d Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 24 Jan 2023 15:38:56 +0100 Subject: [PATCH 008/428] update the spec after the dry run --- examples/cosmos-bank/bank-mini-sdk.qnt | 368 +++++++++++++++++++++++++ examples/cosmos-bank/bank-mini.qnt | 11 +- 2 files changed, 370 insertions(+), 9 deletions(-) create mode 100644 examples/cosmos-bank/bank-mini-sdk.qnt diff --git a/examples/cosmos-bank/bank-mini-sdk.qnt b/examples/cosmos-bank/bank-mini-sdk.qnt new file mode 100644 index 000000000..5b4d2a236 --- /dev/null +++ b/examples/cosmos-bank/bank-mini-sdk.qnt @@ -0,0 +1,368 @@ +/** + * This is a minimized protocol specification of the bank module + * that is tuned for an efficient presentation. For a more detailed version, + * see bank.qnt. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // namespace bits { + type Addr = str + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are sorted arrays. We simply use Quint maps. + type Coins = str -> Int256 + // } + + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + /// All possible addresses, a small set for testing. + /// In Q1, it will be a parameter! + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, a small set for testing (a parameter in a full spec). + /// In Q1, it will be a parameter! + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. + type BankCtx = { + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // An output produced by Keeper computations + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // FUNCTIONAL LAYER + + // ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code + // Cognitive overload? + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + // } // ViewKeeper + + // SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, `sendCoins` does not update the context in place, + /// but it returns a new context. + /// `isError == true` on error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + pure def getOr0(coins: Coins, d: str): int = { + if (d.in(coins.keys())) coins.get(d) else 0 + } + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // return the result + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } + } + // } // SendKeeper + + // END OF THE FUNCTIONAL LAYER + + // STATE MACHINE + /* + ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... + */ + + // machine { + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function: It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond + + // Tests instantiate parameters with fixed values (later, parameterized). + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // Tests instantiate denominations with fixed values (later, parameterized). + val DENOMS = Set("atom", "proton", "photon") + + // Initialize the state machine. Atm, the initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { accounts: accs, balances: bals, params: PARAMS } + all { + require(accs.forall(a => validateBalance(bankIn, a))), + // initialize the state + accounts' = accs, + balances' = bals, + } + } + + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + accounts: accounts, balances: balances, params: PARAMS + } + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. + all { + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(BLOCKED.contains(toAddr))), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts, + } + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a case for more than one denomination + nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). + nondet amount = (-(2^256)).to(2^256 - 1).oneOf() + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // END OF THE STATE MACHINE + + // UNIT TESTS + PBT TESTS + + // all addresses but "null" have an associated account in the key/value store + val ACCOUNTS = ADDR.exclude(Set("null")) + + // a simple context for testing + val CONTEXT = { + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 17, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // An auxilliary action that keeps all variables unchanged. + // In the future, such a change would be computed automatically. + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + init + .then(all { + assert(validateBalance(CONTEXT, "alice")), + assert(not(validateBalance(CONTEXT, "null"))), + keepVars, + }) + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + .fail() + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank-mini.qnt::bank + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") +} diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index 5b4d2a236..7b8a6921a 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -62,8 +62,6 @@ module bank { /// `GetAllBalances` returns all the account balances for the given account address. /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code - // Cognitive overload? if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) } else { @@ -86,8 +84,7 @@ module bank { /// An error is returned upon failure. /// /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. - /// `isError == true` on error or panic. + /// but it returns a new context. `isError == true` on error or panic. /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` pure def sendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { @@ -164,11 +161,8 @@ module bank { // END OF THE FUNCTIONAL LAYER // STATE MACHINE - /* - ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - */ + // ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - // machine { // managed by the account keeper var accounts: Set[Addr] // managed by the bank keeper @@ -244,7 +238,6 @@ module bank { nondet toAddr = oneOf(ADDR) send(fromAddr, toAddr, Map(denom -> amount)) } - // } // END OF THE STATE MACHINE From b889ea545cf1434e19a7831da7f285efee1b6b42 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 14 Feb 2023 18:42:24 +0100 Subject: [PATCH 009/428] add code screenshots for comparison and update the roadmap --- README.md | 57 +++++++++++++++++++++----------- doc/img/validate-quint.png | Bin 0 -> 102116 bytes doc/img/validate-tla-vscode.png | Bin 0 -> 99527 bytes doc/img/validate-tla.png | Bin 0 -> 246016 bytes 4 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 doc/img/validate-quint.png create mode 100644 doc/img/validate-tla-vscode.png create mode 100644 doc/img/validate-tla.png diff --git a/README.md b/README.md index 84530cd5b..e95911308 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,25 @@ distributed systems and blockchain protocols. It combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] (TLA) with state-of-the-art static analysis and development tooling. +This is how a typical Quint code looks like in the [Quint VSCode Plugin][]: + +

+ +

+ +If you would to see the same code in TLA+, here is how it looks like +in the [TLA+ VSCode Plugin][]: + +

+ Code snippet in TLA+ +

+ Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in TLA. The most important feature of our syntax is that it -is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [Design Principles][]). +specifying systems in the logic TLA. The most important feature of our syntax +is that it is minimal and regular, making Quint an easy target for advanced +developer tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: @@ -26,7 +41,7 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] +TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin @@ -50,7 +65,7 @@ documentation for built-in operators](./doc/builtin.md). ### Examples :musical_score: We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. +Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). @@ -97,34 +112,34 @@ completely implementing every pass. | :--------------- | :----: | :-------------: | :-----: | :----------: | :-------: | :---------: | :-------: | | [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [234][] | :x: | :x: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark:/:x: [238][] | :x: | :x: | -| [Guess][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Nondet][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Discriminated unions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [244][] | :x: [233][] | :x: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :question: | :x: | :x: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [237][] | :x: | :x: | | [Multiple files][] | :x: [8][] | :x: | :x: | :x: | :x: | :x: | :x: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :x: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :white_check_mark: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: [235][] | :x: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| Invariant checking | - | - | | | :white_check_mark: | :x: | :x: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| Invariant checking | - | - | | | :white_check_mark: | :x: | :white_check_mark: | | [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [221][] | :x: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :x: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | | [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | @@ -146,7 +161,7 @@ completely implementing every pass. [Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions [Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions [if-then-else]: ./doc/lang.md#condition -[Guess]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice [Maps]: ./doc/lang.md#maps-aka-functions [Records]: ./doc/lang.md#records [Discriminated unions]: ./doc/lang.md#discriminated-unions @@ -176,4 +191,6 @@ completely implementing every pass. [TLA+]: https://lamport.azurewebsites.net/tla/tla.html [TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions [Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[Quint VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[TLA+ VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=alygin.vscode-tlaplus [Tutorials]: ./tutorials/README.md diff --git a/doc/img/validate-quint.png b/doc/img/validate-quint.png new file mode 100644 index 0000000000000000000000000000000000000000..691f35b690f0c9a8db4ad0368ef2c6a4a599ac86 GIT binary patch literal 102116 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ß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 z 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 Date: Tue, 14 Feb 2023 18:48:42 +0100 Subject: [PATCH 010/428] Revert "add code screenshots for comparison and update the roadmap" This reverts commit b889ea545cf1434e19a7831da7f285efee1b6b42. --- README.md | 57 +++++++++++--------------------- doc/img/validate-quint.png | Bin 102116 -> 0 bytes doc/img/validate-tla-vscode.png | Bin 99527 -> 0 bytes doc/img/validate-tla.png | Bin 246016 -> 0 bytes 4 files changed, 20 insertions(+), 37 deletions(-) delete mode 100644 doc/img/validate-quint.png delete mode 100644 doc/img/validate-tla-vscode.png delete mode 100644 doc/img/validate-tla.png diff --git a/README.md b/README.md index e95911308..84530cd5b 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,10 @@ distributed systems and blockchain protocols. It combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] (TLA) with state-of-the-art static analysis and development tooling. -This is how a typical Quint code looks like in the [Quint VSCode Plugin][]: - -

- -

- -If you would to see the same code in TLA+, here is how it looks like -in the [TLA+ VSCode Plugin][]: - -

- Code snippet in TLA+ -

- Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in the logic TLA. The most important feature of our syntax -is that it is minimal and regular, making Quint an easy target for advanced -developer tooling and static analysis (see our [Design Principles][]). +specifying systems in TLA. The most important feature of our syntax is that it +is minimal and regular, making Quint an easy target for advanced developer +tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: @@ -41,7 +26,7 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] +TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin @@ -65,7 +50,7 @@ documentation for built-in operators](./doc/builtin.md). ### Examples :musical_score: We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. +Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). @@ -112,34 +97,34 @@ completely implementing every pass. | :--------------- | :----: | :-------------: | :-----: | :----------: | :-------: | :---------: | :-------: | | [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [234][] | :x: | :x: | | [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark:/:x: [238][] | :x: | :x: | -| [Nondet][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Guess][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Discriminated unions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [244][] | :x: [233][] | :x: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :question: | :x: | :x: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [237][] | :x: | :x: | | [Multiple files][] | :x: [8][] | :x: | :x: | :x: | :x: | :x: | :x: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :white_check_mark: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :x: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: [235][] | :x: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| Invariant checking | - | - | | | :white_check_mark: | :x: | :white_check_mark: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| Invariant checking | - | - | | | :white_check_mark: | :x: | :x: | | [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [221][] | :x: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :x: | | [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | @@ -161,7 +146,7 @@ completely implementing every pass. [Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions [Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions [if-then-else]: ./doc/lang.md#condition -[Nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Guess]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice [Maps]: ./doc/lang.md#maps-aka-functions [Records]: ./doc/lang.md#records [Discriminated unions]: ./doc/lang.md#discriminated-unions @@ -191,6 +176,4 @@ completely implementing every pass. [TLA+]: https://lamport.azurewebsites.net/tla/tla.html [TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions [Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[Quint VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[TLA+ VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=alygin.vscode-tlaplus [Tutorials]: ./tutorials/README.md diff --git a/doc/img/validate-quint.png b/doc/img/validate-quint.png deleted file mode 100644 index 691f35b690f0c9a8db4ad0368ef2c6a4a599ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102116 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ßpt4E+$~?J3E+p1ypHZf$_Wc17rI+VaYFqo3>I9UD-6Xs1eU$ho>>qv z0b~y9p79DQ)GElHV{%3}SEm@xB#^G#QFmCkugyptX!_C!}n;uy((LP)FfIJKBMVXKJRha3l!zP94*q9M~*_L zm$P3yWq?61h&nd}th9AnYddGJw)OGf02pyFT%3^}2+Ob^A;F@OK|0|v{SShS&y$kB<-p|ZW1Z6f7S9RCOGUSZ z13=!WQaVs>o{!#-7EFVa(ne|P-59Q$m{#cYw|bLusLY8&S`d)TUy(lH*T)peFlXOP zb!;l}ZG9B03!IAJ$P0~j(-maf=U_)&E7yJU+%y=<#Ih9cCQroJ|OxmO<@nS<$( zF3a%o!%swu3*NU935B2&Y*)eT$IO{gIZ2FPvzR9BB$n%S`;Ig3%OGX;V!quZC|PRQ8H zKFmw|d&0rwd(RC4;$p-E{W~b3V&k6ne!^e%5o=MyNkmlPzGf5NeQ9;hNM3HjaT&8u z^O}t8#JM@Epij?bmbuay>MBm(4lauaw+$=l8_U}9Jwpxo?E5yh*DDd)^6cn+nc7Ei z(XC;|!t2piV_H{WT!ZKewVd~X=|>SV3BJ( zbGi8duQ|u|9aqvFTZL!=7>yNOn*f+?Fo*g(7un1hss(N(33G6QBaKJ+vq?F)R1#K} z3iB&JPe@s<6c&ox;|s8JaqIeI+IGr2xad|}E}w~)N&(p;^FQ^KvilC)2Le`3Lb8VJ z#b>xGUqHREwuG|L7%6cY>r=0vZ4W&(ntxHrx?`7QV#$mg`(!5jmMkR`Y>`*dtG#Kx z$f~9Gz8xK+U^iDK_4uF_Qyi(ZGvQ6-IW^s@`Mk4yyHOdqxa?V#7x?60a|(#4AnGRr zC*T*K?(cU3NmZ?nkTTZLW*Umyw!&FCj(Uz{m6x~nJBzD=sSf*!tBLta1~8LD0OGgK zb(X0e(sY+@GTfa!*36&bll4uGRl~Oqt@6yESBl5BG52cv#!g#IZIa;EDxwfy& zEjzd?5l%OGTN8%#DCirvvdihDnd>PtCMX62Ju(AF?$@^<**{J1@*67&mW|NF<_L8| z@Q~i7Nn+|br^sc_6dGs|^<2`IKsA5*_%ML2cyMPCTFgYazjT>?!)JjtpyG5$GYN>} zNE^LT3r!bIV{Ux7Z;tJoiV}4Dh!M@SGzG>5{ z>I{dS1q{xjn7~BOi8E;0=1T8;`7|7*N>1w#SZ*&UV6v#ZMcxkXVBIN!(h!n!GBNIJ zdHg=Av(`{&>Sn*{C|7b+p?O6nv^Uc6xBdteB0%f{GQL;t^kza}0u>77p0MSG9NHcN zyZFcF;nf&we95tEqazf@D~I8jixXlikW9`~|xC`@(Pu0nzlZ>vH`4TNjRkoPD*+aPL%6WP8Bj_HC~xnG4i-KQCQ z_DhjH_rQ>&J8#^v0D=@CSn2o0JHL$HXFp0TMeD+HRs=T7wlBq|6$mfCGr?y<0JOD4{3&}yW0HrhX> z)k4b=X43fpZwm|4d-}tDF?YymcJtTV`-_@)LLKD=QO&K_>o||w%_&8ziFY)x0L=d7 z`!7;g@pi~hX zi-pZUk{e{g;rB(sO;`-6WtX?R2tM+O5KBvCR9x$iJ#@!Bt^JrFK4jNp@qJP-Lz}
BMbMRuF{I*9JzFxGykcycSd4= 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 z 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 Date: Fri, 24 Feb 2023 15:07:09 +0100 Subject: [PATCH 011/428] update the example --- examples/cosmos-bank/bank-mini.qnt | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index 7b8a6921a..7655280a7 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -182,7 +182,7 @@ module bank { } // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon") + val DENOMS = Set("atom", "proton", "photon", "foocoin") // Initialize the state machine. Atm, the initializer is a mock. action init = { @@ -326,15 +326,18 @@ module bank { // custom send that picks some randomly picks some tokens to transfer action sendBoxed = { // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) + // FIXME: Sometimes, denoms is still empty: + // https://github.com/informalsystems/quint/issues/545 + nondet denoms = DENOMS.powerset().exclude(Set()).oneOf() + all { + denoms.size() > 0, + // pick some amounts + nondet coins = denoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } } // this is one of the basic invariants of the bank module @@ -354,6 +357,20 @@ module bank { }) } + // The test sendNotEnoughBalanceTest from: + // https://github.com/cosmos/cosmos-sdk/blob/497dc2cb78bb8df597fd63555f97b2f98cc7f2d0/x/bank/app_test.go#LL135 + run sendNotEnoughBalanceTest = { + val addrs = Set("addr1") + action myInit = all { + accounts' = addrs, + balances' = addrs.mapBy(a => Map("foocoin" -> 67)), + } + + init + .then(send("addr1", "addr2", Map("foocoin" -> 100))) + .fail() + } + // If you'd like to run this test for multiple data points, // you can do it in REPL as follows: // .load bank-mini.qnt::bank From 260a0182f32ab01d7e9e885dfd28385250b8a97d Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:40:51 +0100 Subject: [PATCH 012/428] describing the banking spec in the literate style --- examples/cosmos-bank/bank.qnt | 562 +++++++--------------------- examples/cosmos-bank/cosmos-bank.md | 520 +++++++++++++++++++++++++ 2 files changed, 652 insertions(+), 430 deletions(-) create mode 100644 examples/cosmos-bank/cosmos-bank.md diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 08d450d6d..34042db2d 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,73 +1,31 @@ -/** - * This is a work-in-progress protocol specification of the bank module - * that includes: - * - * 1. External behavior (via messages), and - * 2. Internal behavior (via Keeper calls). - * - * The main goal of this specification is to highlight the essential behavior - * of the bank module, while keeping the specification faithful to the - * implementation. Since it would not make a lot of sense to duplicate - * the implementation in the specification language, we naturally omit - * low-level implementation details: - * - * - All errors are replaced with a Boolean value, e.g., `false` or `true`. - * The actual error code is less important for understanding the protocol. - * - * - Low-level panics are ommitted, unless they are related to the logic - * of the bank module. In the latter case, they are replaced with Boolean - * error flags. - * - * WARNING: This spec is work in progress. It is by no means complete or correct. - * - * Igor Konnov, Informal Systems, 2023 - */ +// An executable specification of the bank module module bank { - // TODO: these type definitions should be defined in a general Cosmos module - // module cosmobits { - type Addr = str - // TODO: specify 64-bit and 256-bit integers later, in separate modules - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are bags that are implemented via sorted arrays. - // We are simply using maps in Quint. - type Coins = str -> Int256 - // } - + // TYPES + // Addresses are just strings. + type Addr = str + // Denominations are simply strings. + type Denom = str + // The module operates over 64-bit and 256-bit integers. + type Int64 = int + type Int256 = int + + // the maximum value for Int256 in Golang + pure val MAX_INT256 = 2^256 - 1 + + // A coin is a record that contains a denomination and an amount + type Coin = { denom: Denom, amount: Int256 } + // Coins is a map from denominations to amounts. + type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, + // An input of a multiparty transfer + type Input = { + address: str, + coins: Coins, } - - // TODO: introduce constants, when #528 is done: - // https://github.com/informalsystems/quint/issues/528 - // all possible addresses - //const ADDR: Set[Addr] - // blocked addresses - //const BLOCKED: Set[Addr] - - /// All possible addresses. - // Fixed to a constant value for now, until #528 is closed. - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, set directly in code. - // Fixed to a constant value for now, until #528 is closed. - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. + // An input of a multiparty transfer + type Output = Input + // the portion of the context that is accessed by the bank module type BankCtx = { // block time (needed by vesting accounts) blockTime: Int64, @@ -79,387 +37,131 @@ module bank { params: Params, } - // An output produced by stateful computations. - // This looks very much like Either[L, R] or Result[T, E] in Rust, - // which we should use in the future. See: - // https://github.com/informalsystems/quint/issues/539 - type BankOut = { - isError: bool, - ctx: BankCtx, + // Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, } - // TODO: introduce a separate module, when the modules are fixed: - // https://github.com/informalsystems/quint/issues/523 - - // module ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - // SKIPPED: Coins.IsValid does more tests, including the denominations format - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis + // FUNCTIONAL LAYER, e.g., keepers + pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() } - - /// `GetBalance` returns the balance of a specific denomination - /// for a given account by address. - /// SDK: `func (k BaseViewKeeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin` - pure def getBalance(ctx: BankCtx, addr: Addr, denom: str): Int256 = { - if (ctx.balances.keys().contains(addr) - and ctx.balances.get(addr).keys().contains(denom)) { - ctx.balances.get(addr).get(denom) + } + pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts + } + pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.contains(denom)) { + { denom: denom, amount: accountBal.get(denom) } } else { - 0 + // Implementation: panic here? + { denom: denom, amount: 0 } } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } } + } + pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + // Implementation: panic if the address or denomination are not stored? + ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + } + pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) + } - /// `HasBalance` returns whether or not an account has at least amt balance. - /// SDK: `func (k BaseViewKeeper) HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool` - pure def hasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { - getBalance(ctx, addr, coin.denom) >= coin.amount - } - - /// `GetAccountsBalances` returns all the accounts balances from the store. - /// SDK: `func (k BaseViewKeeper) GetAccountsBalances(ctx sdk.Context) []types.Balance` - pure def getAccountsBalances(ctx: BankCtx): Set[Balance] = { - ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) - } - - // SKIPPED: not dealing with vesting accounts - // LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - - // SKIPPED: not dealing with vesting accounts - // SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - - // SKIPPED: It is simply another version of `getAllBalances` that uses an iterator. - // SDK: func (k BaseViewKeeper) - // IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(sdk.Coin) bool) - - // SKIPPED: It is simply another version of `getAccountBalances` that uses an iterator. - // IterateAllBalances iterates over all the balances of all accounts and - // denominations that are provided to a callback. If true is returned from the - // callback, iteration is halted. - // } // ViewKeeper - - // module SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, - /// `sendCoins` does not update the context in place, but it returns a new context. - /// The value `false` is returned in case of error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. - // SKIPPED: checking LockedCoins that deal with vested coins. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } + pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + (false, ctx) + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // Implementation: panic! + (false, ctx) } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) } - } + // succeed with a new balance + (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) } } - - /// `GetParams` returns the total set of bank parameters. - /// SDK: `GetParams(ctx sdk.Context) types.Params` - pure def getParams(ctx: BankCtx): Params = ctx.params - - /// `SetParams` sets the total set of bank parameters. - /// In our specification, - /// `setParams` does not update the context in place, but returns a new context. - /// SDK: SetParams(ctx sdk.Context, params types.Params) - pure def setParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - - /// `BlockedAddr` checks if a given address is restricted from receiving funds. - /// SDK: `BlockedAddr(addr sdk.AccAddress) bool` - pure def blockedAddr(addr: Addr): bool = { - addr.in(BLOCKED) - } - - // } // SendKeeper - - // module BankKeeper { - // } // BankKeeper - - // TODO: types.QueryServer - - // THE STATE MACHINE - // TODO: we should introduce the state machine in a separate module, maybe in a separate file - // module machine { - // An interesting point here. Although we specify the state machine - // of the bank module here, we could enrich its behavior by having - // more state variables. The minimal required state is encapsulated in BankCtx. - // - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function. - // It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // TODO: introduce constants for balances, accounts, and params - // when #528 is done: - // https://github.com/informalsystems/quint/issues/528 - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // When #528 is done, this will be gone. - // Tests will instantiate module constants with fixed values. - val DENOMS = Set("atom", "proton", "photon") - - // Initialize the state machine - // Until #528 is closed, this initializer is a mock. - // When #528 is closed, we will use constants to initializes the genesis, - // and specific tests will initialize these constants to the values they need. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - blockTime: 0, accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(blockedAddr(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = oneOf((-(2^256)).to(2^256 - 1)) - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - // } - - // UNIT TESTS - // TODO: the tests should be done in a separate module, maybe in a separate file - - // all addresses but "null" have an associated account in the key/value store - // TODO: this definition is used by tests and it should be used there - val ACCOUNTS = ADDR.exclude(Set("null")) - // a simple context for testing - val CONTEXT = { - blockTime: 10, - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } } - - // test that validateBalance is working as expected - run validateBalanceTest = { - assert(validateBalance(CONTEXT, "alice")) - .then(assert(not(validateBalance(CONTEXT, "null")))) - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such change would be computed automatically: - // https://github.com/informalsystems/quint/discussions/70 - action keepVars = all { - balances' = balances, - accounts' = accounts, + pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), + pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled } } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) + pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) + // STATE + // Total supply of coins per denomination + var Supply: Denom -> Int256 + // Balances for each address + var Balances: Addr -> Coins + + // INVARIANTS + // sum up amounts over all balances for a given denomination + def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) + sum + coins.get(denom) + else + sum + }) } - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank.qnt - // import bank.* - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") + // The total Supply of the network is equal to the sum of all coins from the account + val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + } } diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md new file mode 100644 index 000000000..ab7ec2f72 --- /dev/null +++ b/examples/cosmos-bank/cosmos-bank.md @@ -0,0 +1,520 @@ +# Onboarding to the module `x/bank` of Cosmos SDK + +Written for Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). + +## Abstract + +This document shows how we could turn an inanimate piece of documentation into +an executable specification. We are using the [bank module][] of Cosmos SDK as +an example. In the following, all of the quoted text belongs to the original +description on the [bank module][] page, unless specified otherwise. To obtain +a Quint module, run [lmt][] against this document. We follow the same +order of exposition, as in the original document. + +Importantly, this description is tuned towards ease of exposition, not for +implementation or verification. Remember that we do not want to make protocols +as complex as their implementation! These are the most differences: + + - We use abstract data types whenever possible, e.g., big integers, sets, and maps. + + - We abstract error codes to `true` (no error) and `false` (error). The actual + error codes belong to the implementation details. They are written in comments. + +> The bank module is responsible for handling multi-asset coin transfers +> between accounts and tracking special-case pseudo-transfers which must work +> differently with particular kinds of accounts (notably +> delegating/undelegating for vesting accounts). It exposes several interfaces +> with varying capabilities for secure interaction with other modules which +> must alter user balances. +> +> In addition, the bank module tracks and provides query support for the total +> supply of all assets used in the application. + +From the protocol perspective, the bank module looks as follows: + +```bluespec bank.qnt += +// An executable specification of the bank module +module bank { + // TYPES + <<>> + + // FUNCTIONAL LAYER, e.g., keepers + <<>> + + // STATE + <<>> + + // INVARIANTS + <<>> +} +``` + +## Basic protocol types + +These are the types that we are using in the protocol specification. +The actual implementation uses different types. **This is not a bug, but a +feature!** By using more abstract types, we make the protocol description +much easier to read and understand. + +```bluespec "types" += +// Addresses are just strings. +type Addr = str +// Denominations are simply strings. +type Denom = str +// The module operates over 64-bit and 256-bit integers. +type Int64 = int +type Int256 = int + +// the maximum value for Int256 in Golang +pure val MAX_INT256 = 2^256 - 1 + +// A coin is a record that contains a denomination and an amount +type Coin = { denom: Denom, amount: Int256 } +// Coins is a map from denominations to amounts. +type Coins = Denom -> Int256 +// Account balances +type Balance = { address: Addr, coins: Coins } +``` + +**Implementation details.** There are a few important points to be made about +the implementation of the above types in Cosmos SDK: + + - The type `Addr` is implemented with `AccAddress` in + [address.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/address.go), which is `byte[]`. + It must be a + [bech32 address](https://docs.cosmos.network/main/spec/addresses/bech32). + + - The type `Denom` is implemented in + [denom.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/denom.go). It must match the regular expression `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}`. + + - The type `Coin` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). It must be non-negative. + + - The type `Coins` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + The implementation stores `Coins` as an array `[]Coin`. + Since an array is not a set, the implementation contains non-trivial + validation logic in [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) to make sure that: + + - The amount assigned to every denomination is positive (that is, `amount > 0`). + - Coins are sorted in the order of their denominations. + - There are no duplicate denominations. + +## Supply + +> The supply functionality: +> +> passively tracks the total supply of coins within a chain, provides a pattern +> for modules to hold/interact with Coins, and introduces the invariant check to +> verify a chain's total supply. + +### Total Supply + +> The total Supply of the network is equal to the sum of all coins from the +> account. The total supply is updated every time a Coin is minted (eg: as part +> of the inflation mechanism) or burned (eg: due to slashing or if a governance +> proposal is vetoed). + +This is a perfect opportunity to define a state invariant: + +```bluespec "invariants" += +// sum up amounts over all balances for a given denomination +def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) + sum + coins.get(denom) + else + sum + }) +} + +// The total Supply of the network is equal to the sum of all coins from the account +val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) +} +``` + +## Module Accounts + +SKIPPED, see [Module +accounts](https://docs.cosmos.network/v0.45/modules/bank/#module-accounts). + +## State + +> The x/bank module keeps state of three primary objects, account balances, +> denom metadata and the total supply of all balances. + +The hex value represents the key in the key-value store, that is, +instead of using an ASCIIZ string, Cosmos SDK developers are using a single +byte as a key. + +> - Supply: `0x0 | byte(denom) -> byte(amount)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Total supply of coins per denomination +var Supply: Denom -> Int256 +``` + +> - Denom Metadata: `0x1 | byte(denom) -> ProtocolBuffer(Metadata)` + +> - Balances: `0x2 | byte(address length) | []byte(address) | []byte(balance.Denom) -> ProtocolBuffer(balance)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Balances for each address +var Balances: Addr -> Coins +``` + +## Keepers + +> The bank module provides these exported keeper interfaces that can be passed +> to other modules that read or update account > balances. Modules should use +> the least-permissive interface that provides the functionality they require. +> +> Best practices dictate careful review of bank module code to ensure that +> permissions are limited in the way that you expect. + +### Blocklisting Addresses + +> The x/bank module accepts a map of addresses that are considered blocklisted +> from directly and explicitly receiving funds through means such as MsgSend +> and MsgMultiSend and direct API calls like SendCoinsFromModuleToAccount. +> +> Typically, these addresses are module accounts. If these addresses receive +> funds outside the expected rules of the state machine, invariants are likely +> to be broken and could result in a halted network. +> +> By providing the x/bank module with a blocklisted set of addresses, an error +> occurs for the operation if a user or client attempts to directly or +> indirectly send funds to a blocklisted account, for example, by using IBC. + +**TODO: figure out how blocklisting should be described in the protocol** + +### Common Types + +#### Input + +> An input of a multiparty transfer + +The type in Quint: + +```bluespec "types" += +// An input of a multiparty transfer +type Input = { + address: str, + coins: Coins, +} +``` + +The type in protobuf: + +```protobuf +// Input models transaction input. +message Input { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +#### Output + +An output of a multiparty transfer. + +The type in Quint: + +```bluespec "types" += +// An input of a multiparty transfer +type Output = Input +``` + +The type in protobuf: + +```protobuf +// Output models transaction outputs. +message Output { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +### ViewKeeper, SendKeeper, and BaseKeeper + +> The base keeper provides full-permission access: the ability to arbitrary +> modify any account's balance and mint or burn coins. +> +> Restricted permission to mint per module could be achieved by using +> baseKeeper with WithMintCoinsRestriction to give specific restrictions to +> mint (e.g. only minting certain denom). + +`BaseKeeper` includes plenty of methods. It extends two other interfaces +as follows: + +```mermaid +classDiagram + direction LR + BaseKeeper <|-- SendKeeper + SendKeeper <|-- ViewKeeper +``` + +We define the part of the SDK context that is touched by the bank module: + +```bluespec "types" += +// the portion of the context that is accessed by the bank module +type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, +} + +``` + +#### ViewKeeper + +`ViewKeeper` is extended by `SendKeeper`, extended by `BaseKeeper`. +Its code can be found in [view.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/view.go). + + - `getAllBalances` returns all the account balances for the given account + address: + +```bluespec "functional" += +pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } +} +``` + + - `validateBalance` validates all balances for a given account address + returning an error if any balance is invalid. It checks for vesting + account types and validate the balances against the original vesting + balances. CONTRACT: ValidateBalance should only be called upon genesis + state. In the case of vesting accounts, balances may change in a valid + manner that would otherwise yield an error from this call. + +```bluespec "functional" += +pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts +} +``` + + - `getBalance` returns the balance of a specific denomination + for a given account by address: + +```bluespec "functional" += +pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.contains(denom)) { + { denom: denom, amount: accountBal.get(denom) } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } + } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } + } +} +``` + + - `HasBalance` returns whether or not an account has at least amt balance: + +```bluespec "functional" += +pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + // Implementation: panic if the address or denomination are not stored? + ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount +} +``` + + - `GetAccountsBalances` returns all the accounts balances from the store: + +```bluespec "functional" += +pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) +} + +``` + + - `LockedCoins` returns all the coins that are not spendable + (i.e. locked) for an account by address. For standard accounts, the + result will always be no coins. For vesting accounts, LockedCoins is + delegated to the concrete vesting account type. + + - `SpendableCoins` returns the total balances of spendable coins for an + account by address. If the account has no spendable coins, an empty + Coins slice is returned. + + - `IterateAccountBalances` iterates over the balances of a single account + and provides the token balance to a callback. If true is returned from + the callback, iteration is halted. + + - `IterateAllBalances` iterates over all the balances of all accounts and + denominations that are provided to a callback. If true is returned from + the callback, iteration is halted. + +#### SendKeeper + +`SendKeeper` extends `ViewKeeper` and is extended by `BaseKeeper`. +Its code can be found in +[send.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/send.go). + + - `SendCoins` transfers amt coins from a sending account to a receiving account. + An error is returned upon failure. At the protocol level, `sendCoins` does not + update the context in place, but it returns a new context. + The value `false` is returned in case of error or panic. + +
+ Click to see how SendCoins works + +```bluespec "functional" += +pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + (false, ctx) + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // Implementation: panic! + (false, ctx) + } else { + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // succeed with a new balance + (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + } + } +} +``` +
+ + - `InputOutputCoins` performs multi-send functionality. It accepts a series of + inputs that correspond to a series of outputs. It returns an error if the + inputs and outputs don't lineup or if any single transfer of tokens fails. + + - `GetParams` returns the total set of bank parameters. + +```bluespec "functional" += +pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params +``` + + - `SetParams` sets the total set of bank parameters. + +```bluespec "functional" += +pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) +} +``` + + - `IsSendEnabledCoin` returns the current SendEnabled status of the provided + coin's denom. + +```bluespec "functional" += +pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } +} +``` + + - `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + any of the coins are not configured for sending. Returns `nil` if sending is enabled + for all provided coin. + +```bluespec "functional" += +pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) +} +``` + + - `BlockedAddr` checks if a given address is restricted from receiving funds. + + +#### BaseKeeper + +`BaseKeeper` extends `SendKeeper`. Its code can be found in +[keeper.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/keeper.go). + +**TODO: add the description** + +## Parameters + +> The bank module contains the following parameters: + +| Key | Type | Example | +| -------------------- | --------------- | ------------------------------------ | +| `SendEnabled` | `[]SendEnabled` | `[{denom: "stake", enabled: true }]` | +| `DefaultSendEnabled` | `bool` | `true` | + +### SendEnabled + +The send enabled parameter is an array of `SendEnabled` entries mapping coin +denominations to their send_enabled status. Entries in this list take precedence +over the `DefaultSendEnabled` setting. + +### DefaultSendEnabled + +The default send enabled value controls send transfer capability for all coin denominations unless specifically included in the array of SendEnabled parameters. + +### Parameters in Quint + +We pack `SendEnabled` and `DefaultSendEnabled` in the record `Params`: + +```bluespec "types" += +// Parameters of the bank module +type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, +} +``` + + + +[bank module]: https://docs.cosmos.network/v0.45/modules/bank/# +[lmt]: https://github.com/driusan/lmt \ No newline at end of file From 3bb7b4641c36ebe440c0d9f7b70ce86fedc98bf3 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:43:24 +0100 Subject: [PATCH 013/428] add a link to the spec --- examples/cosmos-bank/cosmos-bank.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index ab7ec2f72..e7b31b287 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -8,8 +8,9 @@ This document shows how we could turn an inanimate piece of documentation into an executable specification. We are using the [bank module][] of Cosmos SDK as an example. In the following, all of the quoted text belongs to the original description on the [bank module][] page, unless specified otherwise. To obtain -a Quint module, run [lmt][] against this document. We follow the same -order of exposition, as in the original document. +a Quint module, run [lmt][] against this document. Check the executable +specification in [bank.qnt](./bank.qnt). We follow the same order of exposition, +as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols @@ -33,6 +34,7 @@ as complex as their implementation! These are the most differences: From the protocol perspective, the bank module looks as follows: ```bluespec bank.qnt += +// -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { // TYPES From b70d9a62860e2c496168eff3705b4d86b3e50a65 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:43:50 +0100 Subject: [PATCH 014/428] update the generated spec --- examples/cosmos-bank/bank.qnt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 34042db2d..797e4959e 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,3 +1,4 @@ +// -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { // TYPES From 0f321dec98bb95c7ef96907bb04df1d4c626ee92 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:45:01 +0100 Subject: [PATCH 015/428] update the diagram --- examples/cosmos-bank/cosmos-bank.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index e7b31b287..3d97b2301 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -258,8 +258,8 @@ as follows: ```mermaid classDiagram direction LR - BaseKeeper <|-- SendKeeper - SendKeeper <|-- ViewKeeper + ViewKeeper <|-- SendKeeper + SendKeeper <|-- BaseKeeper ``` We define the part of the SDK context that is touched by the bank module: @@ -519,4 +519,4 @@ type Params = { [bank module]: https://docs.cosmos.network/v0.45/modules/bank/# -[lmt]: https://github.com/driusan/lmt \ No newline at end of file +[lmt]: https://github.com/driusan/lmt From 7b37cc6a64c3789e22bf610317686b5217947ad1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 12:05:53 +0100 Subject: [PATCH 016/428] fix a bug in GetBalance --- examples/cosmos-bank/bank.qnt | 2 +- examples/cosmos-bank/cosmos-bank.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 797e4959e..53264b0ce 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -64,7 +64,7 @@ module bank { pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) - if (accountBal.contains(denom)) { + if (accountBal.keys().contains(denom)) { { denom: denom, amount: accountBal.get(denom) } } else { // Implementation: panic here? diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index 3d97b2301..1a44b1cde 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -321,7 +321,7 @@ pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) - if (accountBal.contains(denom)) { + if (accountBal.keys().contains(denom)) { { denom: denom, amount: accountBal.get(denom) } } else { // Implementation: panic here? From 4b78634f942095d4a34be06baa14f2118ec0dd89 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 5 Apr 2023 14:18:02 +0200 Subject: [PATCH 017/428] the first version of ADR007 --- doc/adr007-foreign-calls.md | 223 ++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 doc/adr007-foreign-calls.md diff --git a/doc/adr007-foreign-calls.md b/doc/adr007-foreign-calls.md new file mode 100644 index 000000000..f046954d9 --- /dev/null +++ b/doc/adr007-foreign-calls.md @@ -0,0 +1,223 @@ +# ADR007: Design of foreign calls in Quint + +| Revision | Date | Author | +| :------- | :--------- | :--------------- | +| 1 | 2023-04-05 | Igor Konnov | + +## 1. Summary + +In this ADR, we discuss potential solutions for integrating the Quint simulator +with other execution environments. This would enrich the simulator with +computations that cannot be expressed in Quint itself, e.g., rich string +manipulation and parsing. Additionally, it would give us another path for more +interactive integration of the Quint simulator with systems under test. + +## 2. Context + +Quint is a specification language with the following features that are important +in the context of this ADR: + + - Quint has a relatively small standard library, and + - Quint has formal semantics, thanks to its transpilation to TLA+. + +Thanks to these features, Quint is an easier target for static analysis and +verification tools than general-purpose programming languages. At the same time, +these nice features are somewhat in conflict with the expressivity and usability +of the language, from the systems engineer's point of view. Even though Quint is +obviously Turing-complete (for example, quantifiers over integers and integer +arithmetic make many properties undecidable), this does not mean that all of the +typical engineering tasks are easy to do in Quint. + +In the following, we introduce several examples that motivate the need for this +ADR. + +### Example 1: Strings + +From the systems engineer's point of view, the most glaring omission in the +language is the absence of string manipulation. From the verification engineer's +point of view strings are nothing else but lists of constants, which are +normally represented with bytes or sequences of bytes in programming languages. +While this is true, it is simply hard for humans to read expressions in this +representation. Compare the two expressions: + +```js +["I", " ", "a", "m", " ", "a" , " ", "s", "t", "r", "i", "n", "g"] +"I am a string" +``` + +Although, string operations are typically used to format the output and process +the input, they open a room for hard verification problems. We should not +introduce hard problems, if they are caused by non-functional features such as +the user interface. + +Yet, it would be nice to have a nice user interface in REPL, while keeping the +specifications amenable for verification. This shows a need for a clear +boundary between the "essential" computations and "non-essential" computations. + +One concrete example of this usability issue is the string representation of +[IBC denominations][]. For instance, IBC operates over strings such as +`transfer/channelToA/denom`. In a Quint specification, we would prefer to +operate over lists such as `["transfer", "channelToA", "denom"]`. How can we +make Quint consume and produce the human-readable form of denominations, while +operating over lists? This problem calls for a serialization solution, which +would be typically done via a standard interface such as `toString` and +`parseFrom` in programming languages. For instance, it would be quite easy to +write such functions in JavaScript. + +*Desired state: We would to input and output strings in a human-readable +form without impairing the verification tools.* + +### Example 2: Hashing and encryption + +Related to Example 1, blockchain projects heavily rely on the standard hashing +and encryption functions such as [SHA-2][] and ed25519, see [Cosmos Accounts][]. +Not only it would be hard to express these algorithms in Quint, it would also +introduce enormous complexity to the verification tasks. To perform functional +verification, we would usually need high-level properties of these algorithms. +Actually, assuming perfect hashing and perfect encryption is often sufficient to +reason about non-cryptographic properties of distributed algorithms. + +Again, while this is mostly irrelevant for verification, systems engineers +would like to call the actual hashing and encryption functions at some point, +for instance, to generate realistic data. + +*Desired state: We should be able to use the standard hashing/encryption +functions in the simulator. We do not have to verify these functions, assuming +that they are in the trusted core of our system.* + +### Example 3: Testing + +Testing is probably the most obvious example that would require an integration +between the simulator and the system under test. Our current approach to this +problem is to produce traces in the [ITF Format][]. For instance, the following +command would save a trace found by the simulator into `foo.itf.json`, see +the [Quint manual][] for details: + +```sh +quint run --out-itf=foo.itf.json foo.qnt +``` + +This approach assumes that the simulator (or a verification tool) is called +once, and its output is consumed by the system under test. However, this makes +it hard to integrate the simulator/verifier and the system under test into a +feedback loop. For example, see [Issue 2453][]. + +*Desired state: We should be able to call a system under test from a Quint +specification, in order to get interactive feedback from the system under test.* + +### Example 4: Interactive trace visualization + +Visualization is another example of where we could benefit from an integration +with non-Quint code. Whereas it should be easy to visualize ITF traces, we could +go further and visualize interactive computations, e.g., in Quint REPL. We have +discussed this approach once, and it was not clear to us, why should we call +foreign code from Quint to do that, see [Issue 143][]. So this is probably not +the strongest motivator for this ADR. + +*Desired state: We should be able to inform an external visualization tool +about a change in the system state, while running the simulator, or doing +interactive exploration in REPL. Visualization should not compromise the +formal specification.* + +## 3. Options + +We are discussing the choice of a good technology, given the following +constraints: + + - Ideally, the simulator should be able to integration with codebases + written in Rust and Golang, as these are the implementation languages + of the Cosmos ecosystem. + + - We emphasize ease of use over performance. + +### Option 1: Dynamic integration with JavaScript via eval + +The most obvious solution that first came to my mind is to introduce a special +Quint operator such as `unsafe { ... }` and place JavaScript code inside. We +could evaluate the JavaScript code with `eval`. + +Although this solution is quite simple, it has a very bad security smell: + + - Many execution environments disable `eval`, see [eval][]. + + - Security analysis tools may complain about Quint, if we place `eval` in its + code. + + - Ironically, placing `eval` into a formal spec may lead to vulnerabilities. + +It looks like poisoning formal specs with `eval` is a very bad idea. +Additionally, it limits the integration point to JavaScript. + +### Option 2: Node vm sandbox + +A slightly better option would be to use [NodeJS VM][]. + +Pros: + + - It would still interpret JavaScript code, but in a sandboxed environment. + +Cons: + + - We would depend on NodeJS, so transferring REPL to the web will be harder. + + - It limits the integration point to JavaScript and NodeJS. + +### Option 3: JSON-RPC + +We would like to execute the non-Quint code outside of the Quint tooling itself. +[JSON-RPC][] would allow us to implement such a loosely-coupled integration. + +Pros: + + - Quint is written in TypeScript and submitting JSON is no brainer, especially + given that we are using [ITF Format][] for serialization. + + - Language agnostic. Non-Quint code may be writte in JavaScript, Golang, and + Rust. + + - Relatively easy to implement in Quint. + + - Does not require `.proto` files, in contrast to gRPC. + +Cons: + + - Not the best performance. If we aim at high-performance integration loops, + e.g., when doing fuzzing, JSON-RPC may become a bottleneck. + +### Option 4: Compile-time integration + +Another option to explore is to link against dynamic libraries that are written +in other languages, e.g., Rust and Golang. + +Pros: + + - This would probably give us the best performance. + + - This may give us bonus points from the people who like low-level languages. + +Cons: + + - Serialization would be painful. + + - External libraries would have compilation-time dependencies. It would not + pose serious problems to use, but it would make integration harder. + +## 4. Solution + +Given the analysis, we opt for using JSON-RPC. We still have to figure out the +right interface on the Quint side. This is the subject of the follow up work on +this ADR. Since we are already serializing Quint data structures into [ITF +Format][], we could use the same approach to serialization/deserialization of +Quint values. + + +[IBC denominations]: https://github.com/cosmos/ibc/blob/main/spec/app/ics-020-fungible-token-transfer/README.md#data-structures +[SHA-2]: https://en.wikipedia.org/wiki/SHA-2 +[Cosmos Accounts]: https://docs.cosmos.network/v0.45/basics/accounts.html#signatures +[ITF Format]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[Quint manual]: https://github.com/informalsystems/quint/blob/main/doc/quint.md +[Issue 2453]: https://github.com/informalsystems/apalache/issues/2453 +[Issue 143]: https://github.com/informalsystems/quint/issues/143 +[eval]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval +[NodeJS VM]: https://nodejs.org/api/vm.html +[JSON-RPC]: https://en.wikipedia.org/wiki/JSON-RPC#Implementations \ No newline at end of file From 0df6ea73074c0264988eb0979f0e4b6dc43671f1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 6 Apr 2023 17:37:46 +0200 Subject: [PATCH 018/428] rename ADR to RFC --- ...foreign-calls.md => rfc007-foreign-calls.md} | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) rename doc/{adr007-foreign-calls.md => rfc007-foreign-calls.md} (94%) diff --git a/doc/adr007-foreign-calls.md b/doc/rfc007-foreign-calls.md similarity index 94% rename from doc/adr007-foreign-calls.md rename to doc/rfc007-foreign-calls.md index f046954d9..2b4d7470d 100644 --- a/doc/adr007-foreign-calls.md +++ b/doc/rfc007-foreign-calls.md @@ -1,4 +1,4 @@ -# ADR007: Design of foreign calls in Quint +# RFC007: Design space of foreign calls in Quint | Revision | Date | Author | | :------- | :--------- | :--------------- | @@ -6,7 +6,7 @@ ## 1. Summary -In this ADR, we discuss potential solutions for integrating the Quint simulator +In this RFC, we discuss potential solutions for integrating the Quint simulator with other execution environments. This would enrich the simulator with computations that cannot be expressed in Quint itself, e.g., rich string manipulation and parsing. Additionally, it would give us another path for more @@ -15,7 +15,7 @@ interactive integration of the Quint simulator with systems under test. ## 2. Context Quint is a specification language with the following features that are important -in the context of this ADR: +in the context of this RFC: - Quint has a relatively small standard library, and - Quint has formal semantics, thanks to its transpilation to TLA+. @@ -29,7 +29,7 @@ arithmetic make many properties undecidable), this does not mean that all of the typical engineering tasks are easy to do in Quint. In the following, we introduce several examples that motivate the need for this -ADR. +RFC. ### Example 1: Strings @@ -112,7 +112,7 @@ with non-Quint code. Whereas it should be easy to visualize ITF traces, we could go further and visualize interactive computations, e.g., in Quint REPL. We have discussed this approach once, and it was not clear to us, why should we call foreign code from Quint to do that, see [Issue 143][]. So this is probably not -the strongest motivator for this ADR. +the strongest motivator for this RFC. *Desired state: We should be able to inform an external visualization tool about a change in the system state, while running the simulator, or doing @@ -204,11 +204,8 @@ Cons: ## 4. Solution -Given the analysis, we opt for using JSON-RPC. We still have to figure out the -right interface on the Quint side. This is the subject of the follow up work on -this ADR. Since we are already serializing Quint data structures into [ITF -Format][], we could use the same approach to serialization/deserialization of -Quint values. +We have to figure out a good solution, or maybe several solutions. The problem +space outlined by the four examples is quite large. [IBC denominations]: https://github.com/cosmos/ibc/blob/main/spec/app/ics-020-fungible-token-transfer/README.md#data-structures From e003e0db83c2c08cd6f66830b23787a7564339f2 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Fri, 11 Aug 2023 14:12:11 +0200 Subject: [PATCH 019/428] Add toSet and toList spells --- examples/spells/rareSpells.qnt | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index f5a829403..f00ebddf2 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -23,4 +23,30 @@ module rareSpells { assert(2.to(5).mapBy(i => i * 2).mapValuesSum() == 28), assert(Map(2 -> -4, 4 -> 2).mapValuesSum() == -2), } -} \ No newline at end of file + + //// Returns a list of all elements of a set. + //// The ordering will be arbitrary. + //// + //// - @param __set a set + //// - @returns a list of all elements of __set + pure def toList(__set: Set[a]): List[a] = { + __set.fold(List(), (__l, __e) => __l.append(__e)) + } + + //// Returns a set of the elements in the list. + //// + //// - @param __list a list + //// - @returns a set of the elements in __list + pure def toSet(__list: List[a]): Set[a] = { + __list.foldl(Set(), (__s, __e) => __s.union(Set(__e))) + } + + run toListAndSetTest = + all { + assert(Set(3, 2, 1).toList().toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == List(3,2,1).toSet()), + assert(toList(Set()) == List()), + assert(toSet(List()) == Set()) + } +} From e3e4bdcd15057600be3fe6b39e26d7da23fcb409 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 10:46:04 +0100 Subject: [PATCH 020/428] Add `debug` utility function The `debug` function is a utility designed to aid in debugging specifications by allowing the spec developer to print out a contextual message while executing a specification, whether in a run or in a test, along with a formatted representation of a value. This can be useful when trying to understand the state of variables at specific points during the spec execution or while tracking down issues. The `debug` function has the following signature: ``` def debug(header: str, value: a) -> a ``` The `debug` function prints both header and the value on the same line, preceded by a `>` character, and then returns the given value, which makes it easy to debug nested expressions without having the extract them into a variable first. Example usage in the REPL: ``` >>> debug("a number:", 42) > a number: 42 42 >>> debug("a record:", { foo: 32, bar: true }) > a record: { bar: true, foo: 32 } { bar: true, foo: 32 } >>> debug("large record:", largeRecord) > large record: { hello: { world: { foo: { bar: { baz: 42 }, toto: { tata: { tutu: "Hello, World" } } } } } } { hello: { world: { foo: { bar: { baz: 42 }, toto: { tata: { tutu: "Hello, World" } } } } } } >>> if (a * debug("nested", a + b) == 10) true else false > nested 5 true ``` --- quint/src/effects/builtinSignatures.ts | 1 + quint/src/ir/quintIr.ts | 1 + quint/src/names/base.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 12 ++++++++++++ quint/src/types/builtinSignatures.ts | 1 + quint/test/runtime/compile.test.ts | 11 +++++++++++ 6 files changed, 27 insertions(+) diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index eab9e8d72..70f561b47 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -223,6 +223,7 @@ const otherOperators = [ { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, + { name: 'debug', effect: propagateComponents(['read'])(2) }, { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index 937804de2..c7ba00761 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -140,6 +140,7 @@ export const builtinOpCodes = [ 'chooseSome', 'concat', 'contains', + 'debug', 'enabled', 'eq', 'eventually', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 7d3c75f01..fc26943ef 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -196,6 +196,7 @@ export const builtinNames = [ 'reps', 'fail', 'assert', + 'debug', 'orKeep', 'mustChange', 'enabled', diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 3848e35c2..df9d625c1 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -36,7 +36,10 @@ import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './run import { ErrorCode, QuintError } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' +import { prettyQuintEx, terminalWidth } from '../../graphics' +import { format } from '../../prettierimp' import { unreachable } from '../../util' +import { zerog } from '../../idGenerator' import { chunk } from 'lodash' // Internal names in the compiler, which have special treatment. @@ -914,6 +917,15 @@ export class CompilerVisitor implements IRVisitor { this.translateAllOrThen(app) break + case 'debug': + this.applyFun(app.id, 2, (header, value) => { + let columns = terminalWidth() + let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) + console.log('>', header.toStr(), valuePretty.toString()) + return just(value) + }) + break + case 'fail': this.applyFun(app.id, 1, result => { return just(rv.mkBool(!result.toBool())) diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 9ed5fb65d..37aa21e2f 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -125,6 +125,7 @@ const otherOperators = [ { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, + { name: 'debug', type: '(str, a) => a' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 28d9a2ebd..733d3fe4e 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,6 +978,17 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) + it('debug', () => { + // `debug(s, a)` returns `a` + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(n' = debug("n plus one", n + 1)) + ` + ) + + assertVarAfterCall('n', '2', 'run1', input) + }) + it('unsupported operators', () => { assertResultAsString('allLists(1.to(3))', undefined) From 3a85316dbe9adb883ce246a9cc495f8167724741 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:09:50 +0100 Subject: [PATCH 021/428] Add changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18f06b195..4155a30ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- When an input file only one module, it will be inferred as the main module (#1260) +- When an input file only one module, it will be inferred as the main module (#1260) +- Add a `debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated From f2aa734abbd1adba29ba9066b484bef669e269b6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:52:58 +0100 Subject: [PATCH 022/428] Add REPL test for `debug` --- quint/io-cli-tests.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 51a4e7759..22ca0d3f9 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -992,6 +992,22 @@ exit $exit_code >>> ``` +### Invoking `debug` in REPL prints values to stdout + + + +``` +echo 'debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 +``` + + +``` +>>> > value: { bar: "Hello, World!", foo: 42 } +{ bar: "Hello, World!", foo: 42 } +>>> +``` + + ### Errors are reported in the right file File `ImportFileWithError.qnt` has no error, but it imports a module from file `FileWithError.qnt`, which has a type error. The error should be reported only in `FileWithError.qnt`. From 5e57cb4e599acb66a4691273b8051dacda49dacf Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:53:05 +0100 Subject: [PATCH 023/428] Rename `header` to `msg` --- quint/src/runtime/impl/compilerImpl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index df9d625c1..4d0100add 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -918,10 +918,10 @@ export class CompilerVisitor implements IRVisitor { break case 'debug': - this.applyFun(app.id, 2, (header, value) => { + this.applyFun(app.id, 2, (msg, value) => { let columns = terminalWidth() let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) - console.log('>', header.toStr(), valuePretty.toString()) + console.log('>', msg.toStr(), valuePretty.toString()) return just(value) }) break From b4557aa960309dc03f4f1b30ab2fc13a88508108 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:53:15 +0100 Subject: [PATCH 024/428] Add documentation for `debug` built-in --- quint/src/builtin.qnt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index f11a0bfc4..e38fa4203 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -823,7 +823,7 @@ module builtin { /// /// ``` /// var x: int - /// run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) + /// run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) /// ``` /// /// ``` @@ -835,6 +835,24 @@ module builtin { /// ``` action assert(p): (bool) => bool + /// `debug(msg, value)` prints the given message and value to the console, + /// separated by a space. + /// + /// It also returns the given value unchanged, + /// so that it can be used directly within expressions. + /// + /// ### Examples + /// + /// ``` + /// var x: int + /// >>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) + /// > new x: 1 + /// > new x: 2 + /// > new x: 3 + /// true + /// ``` + pure def debug(msg, value): (str, a) => a + // /// `List(e0, ..., en)` is a list of values `e0`, ..., `en`. // /// // /// This is the list constructor. From 5877cdd9989731f35e47a16c837004f3ef9818e6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:57:34 +0100 Subject: [PATCH 025/428] Update generated documentation --- doc/builtin.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/builtin.md b/doc/builtin.md index 4ed2c6eec..fbc2c3726 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -897,7 +897,7 @@ It does not change the state. ``` var x: int -run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) +run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) ``` ``` @@ -907,3 +907,22 @@ action Next = x' = x + 1 run test = Init.then(all { Next, assert(x > 0) }) ``` + +## `pure def debug: (str, a) => a` + +`debug(msg, value)` prints the given message and value to the console, +separated by a space. + +It also returns the given value unchanged, +so that it can be used directly within expressions. + +### Examples + +``` +var x: int +>>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) +> new x: 1 +> new x: 2 +> new x: 3 +true +``` From a7e8a0203854001532c070ecf7af23ce3e132267 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 12:06:38 +0100 Subject: [PATCH 026/428] update the markdown description --- examples/cosmos-bank/bank.qnt | 36 +++------------- examples/cosmos-bank/bankTest.qnt | 27 ++++++++++++ examples/cosmos-bank/cosmos-bank.md | 67 ++++++++++++++++++++--------- 3 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 examples/cosmos-bank/bankTest.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 53264b0ce..d9b7f027c 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,12 +1,13 @@ // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // TYPES - // Addresses are just strings. + // type declarations + // Addresses are simply strings type Addr = str - // Denominations are simply strings. + // Denominations are simply strings too type Denom = str - // The module operates over 64-bit and 256-bit integers. + // 64-bit and 256-bit integers are a special case of big integers. + // We have to take care of the bit width where it matters. type Int64 = int type Int256 = int @@ -46,7 +47,7 @@ module bank { defaultSendEnabled: bool, } - // FUNCTIONAL LAYER, e.g., keepers + // the module logic, that is, the logic of keepers pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -86,7 +87,7 @@ module bank { pure def SendKeeper::SendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { // Implementation: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. + // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. // Safely subtract the coins from fromAddr and add them to toAddr. val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) @@ -142,27 +143,4 @@ module bank { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - - // STATE - // Total supply of coins per denomination - var Supply: Denom -> Int256 - // Balances for each address - var Balances: Addr -> Coins - - // INVARIANTS - // sum up amounts over all balances for a given denomination - def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) - if (denom.in(coins.keys())) - sum + coins.get(denom) - else - sum - }) - } - - // The total Supply of the network is equal to the sum of all coins from the account - val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) - } } diff --git a/examples/cosmos-bank/bankTest.qnt b/examples/cosmos-bank/bankTest.qnt new file mode 100644 index 000000000..dbb256680 --- /dev/null +++ b/examples/cosmos-bank/bankTest.qnt @@ -0,0 +1,27 @@ +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic + // Total supply of coins per denomination + var Supply: Denom -> Int256 + // Balances for each address + var Balances: Addr -> Coins + + // protocol invariants + // sum up amounts over all balances for a given denomination + def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) { + sum + coins.get(denom) + } else { + sum + } + }) + } + + // The total Supply of the network is equal to the sum of all coins from the account + val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + } +} diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index 1a44b1cde..21a75cc98 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -1,6 +1,8 @@ # Onboarding to the module `x/bank` of Cosmos SDK -Written for Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). +**Author**: Igor Konnov, Informal Systems, 2023 + +**Version**: Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). ## Abstract @@ -14,7 +16,7 @@ as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols -as complex as their implementation! These are the most differences: +as complex as their implementation! These are the most illuminating differences: - We use abstract data types whenever possible, e.g., big integers, sets, and maps. @@ -31,22 +33,31 @@ as complex as their implementation! These are the most differences: > In addition, the bank module tracks and provides query support for the total > supply of all assets used in the application. -From the protocol perspective, the bank module looks as follows: +From the engineer's perspective, the bank module looks as follows: ```bluespec bank.qnt += // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // TYPES + // type declarations <<>> - // FUNCTIONAL LAYER, e.g., keepers + // the module logic, that is, the logic of keepers <<>> +} +``` + +From the protocol designer's point of view, the bank module alone could be +tested by introducing the following non-deterministic state machine: - // STATE +```bluespec bankTest.qnt += +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic <<>> - // INVARIANTS + // protocol invariants <<>> } ``` @@ -59,11 +70,12 @@ feature!** By using more abstract types, we make the protocol description much easier to read and understand. ```bluespec "types" += -// Addresses are just strings. +// Addresses are simply strings type Addr = str -// Denominations are simply strings. +// Denominations are simply strings too type Denom = str -// The module operates over 64-bit and 256-bit integers. +// 64-bit and 256-bit integers are a special case of big integers. +// We have to take care of the bit width where it matters. type Int64 = int type Int256 = int @@ -85,18 +97,24 @@ the implementation of the above types in Cosmos SDK: [address.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/address.go), which is `byte[]`. It must be a [bech32 address](https://docs.cosmos.network/main/spec/addresses/bech32). + We omit the validation logic in this specification, as it is not relevant + to the understanding of the banking module. - The type `Denom` is implemented in [denom.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/denom.go). It must match the regular expression `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}`. + Again, we omit the validation logic in the Quint specification - The type `Coin` is implemented in - [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). It must be non-negative. + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + Coins must carry non-negative amounts. - The type `Coins` is implemented in [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). The implementation stores `Coins` as an array `[]Coin`. - Since an array is not a set, the implementation contains non-trivial - validation logic in [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) to make sure that: + Since an array is not a set, the implementation contains additional + non-trivial validation logic in + [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) + to make sure that: - The amount assigned to every denomination is positive (that is, `amount > 0`). - Coins are sorted in the order of their denominations. @@ -124,10 +142,11 @@ This is a perfect opportunity to define a state invariant: def SumForDenom(denom: Denom): Int256 = { Balances.keys().fold(0, (sum, addr) => { val coins = Balances.get(addr) - if (denom.in(coins.keys())) + if (denom.in(coins.keys())) { sum + coins.get(denom) - else + } else { sum + } }) } @@ -140,7 +159,7 @@ val TotalSupplyInv = { ## Module Accounts SKIPPED, see [Module -accounts](https://docs.cosmos.network/v0.45/modules/bank/#module-accounts). +accounts](https://docs.cosmos.network/v0.46/modules/bank/#module-accounts). ## State @@ -174,7 +193,7 @@ var Balances: Addr -> Coins ## Keepers > The bank module provides these exported keeper interfaces that can be passed -> to other modules that read or update account > balances. Modules should use +> to other modules that read or update account balances. Modules should use > the least-permissive interface that provides the functionality they require. > > Best practices dictate careful review of bank module code to ensure that @@ -357,18 +376,26 @@ pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { result will always be no coins. For vesting accounts, LockedCoins is delegated to the concrete vesting account type. + **TODO** + - `SpendableCoins` returns the total balances of spendable coins for an account by address. If the account has no spendable coins, an empty Coins slice is returned. + **TODO** + - `IterateAccountBalances` iterates over the balances of a single account and provides the token balance to a callback. If true is returned from the callback, iteration is halted. + **TODO** + - `IterateAllBalances` iterates over all the balances of all accounts and denominations that are provided to a callback. If true is returned from the callback, iteration is halted. + **TODO** + #### SendKeeper `SendKeeper` extends `ViewKeeper` and is extended by `BaseKeeper`. @@ -387,7 +414,7 @@ Its code can be found in pure def SendKeeper::SendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { // Implementation: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. + // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. // Safely subtract the coins from fromAddr and add them to toAddr. val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) @@ -516,7 +543,5 @@ type Params = { } ``` - - -[bank module]: https://docs.cosmos.network/v0.45/modules/bank/# +[bank module]: https://docs.cosmos.network/v0.46/modules/bank/# [lmt]: https://github.com/driusan/lmt From 8ebaabb75d81bf7c6cf45fc463369ba65a0419a1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 12:07:35 +0100 Subject: [PATCH 027/428] move files around --- examples/{cosmos-bank => cosmos/bank}/bank-mini-sdk.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bank-mini.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bank.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bankTest.qnt | 0 examples/{cosmos-bank => cosmos/bank}/cosmos-bank.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename examples/{cosmos-bank => cosmos/bank}/bank-mini-sdk.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bank-mini.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bank.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bankTest.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/cosmos-bank.md (100%) diff --git a/examples/cosmos-bank/bank-mini-sdk.qnt b/examples/cosmos/bank/bank-mini-sdk.qnt similarity index 100% rename from examples/cosmos-bank/bank-mini-sdk.qnt rename to examples/cosmos/bank/bank-mini-sdk.qnt diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos/bank/bank-mini.qnt similarity index 100% rename from examples/cosmos-bank/bank-mini.qnt rename to examples/cosmos/bank/bank-mini.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos/bank/bank.qnt similarity index 100% rename from examples/cosmos-bank/bank.qnt rename to examples/cosmos/bank/bank.qnt diff --git a/examples/cosmos-bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt similarity index 100% rename from examples/cosmos-bank/bankTest.qnt rename to examples/cosmos/bank/bankTest.qnt diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md similarity index 100% rename from examples/cosmos-bank/cosmos-bank.md rename to examples/cosmos/bank/cosmos-bank.md From e0d2c591c19788a9a445f28412e1807cdb0bc244 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 14:55:33 +0100 Subject: [PATCH 028/428] update types and comments --- examples/cosmos/bank/bank.qnt | 88 ++++++++++++++++++++++------ examples/cosmos/bank/cosmos-bank.md | 90 +++++++++++++++++++++++------ 2 files changed, 144 insertions(+), 34 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index d9b7f027c..124c8c379 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -1,7 +1,7 @@ // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // type declarations + //----------------------- type declarations ------------------------- // Addresses are simply strings type Addr = str // Denominations are simply strings too @@ -14,12 +14,31 @@ module bank { // the maximum value for Int256 in Golang pure val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + // A coin is a record that contains a denomination and an amount type Coin = { denom: Denom, amount: Int256 } - // Coins is a map from denominations to amounts. + // Coins is a map from denominations to amounts type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } + + // A result that is produced by the functions that update the context + type BankResult = + | BankErr(str) + | BankOk(BankCtx) + + // A result that is produced by the functions that return a coin or panic + type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + + // A result that is produced by the functions that return a Boolean or panic + type BoolResult = + | BoolErr(str) + | BoolOk(bool) + // An input of a multiparty transfer type Input = { address: str, @@ -47,7 +66,10 @@ module bank { defaultSendEnabled: bool, } - // the module logic, that is, the logic of keepers + //------- the module logic, that is, the logic of keepers ----------- + + /// `GetAllBalances` returns all the account balances for the given account address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -55,6 +77,9 @@ module bank { Map() } } + + /// `ValidateBalance` should only be called upon genesis state. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { ctx.accounts.contains(addr), val coins = ViewKeeper::GetAllBalances(ctx, addr) @@ -62,30 +87,45 @@ module bank { coins.keys().forall(denom => coins.get(denom) > 0), // TODO: add validation logic for the vesting accounts } - pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + + /// GetBalance returns the balance of a specific denomination for a given account by address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 + pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) if (accountBal.keys().contains(denom)) { - { denom: denom, amount: accountBal.get(denom) } + CoinOk({ denom: denom, amount: accountBal.get(denom) }) } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } - pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + + /// HasBalance returns whether or not an account has at least amt balance.\ + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 + pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { // Implementation: panic if the address or denomination are not stored? - ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } } + + /// GetAccountsBalances returns all the accounts balances from the store. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) } + /// SendCoins transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 pure def SendKeeper::SendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { // Implementation: if Coins are constructed with NewCoins, they must be positive. // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. @@ -94,7 +134,7 @@ module bank { if (amt.keys().exists(d => not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { // some denominations do not exist on fromAddr, or there is not enough funds - (false, ctx) + BankErr("invalid coins or insufficient funds") } else { // x/bank invariants prohibit persistence of zero balances // clean zero balances @@ -108,8 +148,7 @@ module bank { // since toCoins and amt held positive values, their sums must be positive too val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // Implementation: panic! - (false, ctx) + BankErr("overflow") } else { // add toAddr to the accounts, if it did not exist val newAccounts = ctx.accounts.union(Set(toAddr)) @@ -123,14 +162,23 @@ module bank { newBalancesSub.put(toAddr, addCoins) } // succeed with a new balance - (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) } } } + + /// GetParams returns the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + + /// SetParams sets the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) + { ...ctx, params: params } } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) if (found != Set()) { @@ -139,8 +187,14 @@ module bank { ctx.params.defaultSendEnabled } } + + /// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if + /// any of the coins are not configured for sending. Returns nil if sending is enabled + /// for all provided coin. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } + } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 21a75cc98..382490b37 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -39,10 +39,11 @@ From the engineer's perspective, the bank module looks as follows: // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // type declarations + //----------------------- type declarations ------------------------- <<>> - // the module logic, that is, the logic of keepers + //------- the module logic, that is, the logic of keepers ----------- + <<>> } ``` @@ -82,12 +83,31 @@ type Int256 = int // the maximum value for Int256 in Golang pure val MAX_INT256 = 2^256 - 1 +// the range of 256-bit integers in the SDK +pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + // A coin is a record that contains a denomination and an amount type Coin = { denom: Denom, amount: Int256 } -// Coins is a map from denominations to amounts. +// Coins is a map from denominations to amounts type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } + +// A result that is produced by the functions that update the context +type BankResult = + | BankErr(str) + | BankOk(BankCtx) + +// A result that is produced by the functions that return a coin or panic +type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + +// A result that is produced by the functions that return a Boolean or panic +type BoolResult = + | BoolErr(str) + | BoolOk(bool) + ``` **Implementation details.** There are a few important points to be made about @@ -307,6 +327,8 @@ Its code can be found in [view.go](https://github.com/cosmos/cosmos-sdk/blob/v0. address: ```bluespec "functional" += +/// `GetAllBalances` returns all the account balances for the given account address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -314,6 +336,7 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } + ``` - `validateBalance` validates all balances for a given account address @@ -324,6 +347,8 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { manner that would otherwise yield an error from this call. ```bluespec "functional" += +/// `ValidateBalance` should only be called upon genesis state. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { ctx.accounts.contains(addr), val coins = ViewKeeper::GetAllBalances(ctx, addr) @@ -331,41 +356,53 @@ pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { coins.keys().forall(denom => coins.get(denom) > 0), // TODO: add validation logic for the vesting accounts } + ``` - `getBalance` returns the balance of a specific denomination for a given account by address: ```bluespec "functional" += -pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { +/// GetBalance returns the balance of a specific denomination for a given account by address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 +pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) if (accountBal.keys().contains(denom)) { - { denom: denom, amount: accountBal.get(denom) } + CoinOk({ denom: denom, amount: accountBal.get(denom) }) } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } + ``` - `HasBalance` returns whether or not an account has at least amt balance: ```bluespec "functional" += -pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { +/// HasBalance returns whether or not an account has at least amt balance.\ +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 +pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { // Implementation: panic if the address or denomination are not stored? - ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } } + ``` - `GetAccountsBalances` returns all the accounts balances from the store: ```bluespec "functional" += +/// GetAccountsBalances returns all the accounts balances from the store. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) } @@ -411,8 +448,11 @@ Its code can be found in Click to see how SendCoins works ```bluespec "functional" += +/// SendCoins transfers amt coins from a sending account to a receiving account. +/// An error is returned upon failure. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 pure def SendKeeper::SendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { // Implementation: if Coins are constructed with NewCoins, they must be positive. // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. @@ -421,7 +461,7 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, if (amt.keys().exists(d => not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { // some denominations do not exist on fromAddr, or there is not enough funds - (false, ctx) + BankErr("invalid coins or insufficient funds") } else { // x/bank invariants prohibit persistence of zero balances // clean zero balances @@ -435,8 +475,7 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, // since toCoins and amt held positive values, their sums must be positive too val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // Implementation: panic! - (false, ctx) + BankErr("overflow") } else { // add toAddr to the accounts, if it did not exist val newAccounts = ctx.accounts.union(Set(toAddr)) @@ -450,10 +489,11 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, newBalancesSub.put(toAddr, addCoins) } // succeed with a new balance - (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) } } } + ``` @@ -461,24 +501,34 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, inputs that correspond to a series of outputs. It returns an error if the inputs and outputs don't lineup or if any single transfer of tokens fails. + **TODO** + - `GetParams` returns the total set of bank parameters. ```bluespec "functional" += +/// GetParams returns the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + ``` - `SetParams` sets the total set of bank parameters. ```bluespec "functional" += +/// SetParams sets the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) + { ...ctx, params: params } } + ``` - `IsSendEnabledCoin` returns the current SendEnabled status of the provided coin's denom. ```bluespec "functional" += +/// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) if (found != Set()) { @@ -487,6 +537,7 @@ pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { ctx.params.defaultSendEnabled } } + ``` - `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if @@ -494,10 +545,15 @@ pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { for all provided coin. ```bluespec "functional" += +/// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if +/// any of the coins are not configured for sending. Returns nil if sending is enabled +/// for all provided coin. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } + ``` - `BlockedAddr` checks if a given address is restricted from receiving funds. From c581ec71a6131c5eda58a93b2649470e9f7f241f Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 14:53:11 -0300 Subject: [PATCH 029/428] Add two phase commit example --- .../TwoPhaseCommit/two_phase_commit.qnt | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt new file mode 100644 index 000000000..5f7f0d18c --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -0,0 +1,135 @@ +module two_phase_commit { + /// "working", "prepared", "committed" or "aborted" + type ResourceManagerState = str + var resourceManagerStates: str -> ResourceManagerState + + /// "init" or "done" + type TransactionManagerState = str + var transactionManagerState: TransactionManagerState + + var preparedResourceManagers: Set[str] + + /// kind "commit", "abort" or "prepared" + type Message = { kind: str, resourceManager: str } + var messages: Set[Message] + + const resourceManagers: Set[str] + + action init = all { + resourceManagerStates' = resourceManagers.mapBy(r => "working"), + transactionManagerState' = "init", + preparedResourceManagers' = Set(), + messages' = Set(), + } + + /* Transaction Manager actions */ + + action addPreparedResourceManager(resourceManager: str): bool = all { + transactionManagerState == "init", + messages.contains({ kind: "prepared", resourceManager: resourceManager }), + preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) + } + + action decideOnCommit = all { + transactionManagerState == "init", + preparedResourceManagers == resourceManagers, + transactionManagerState' = "done", + messages' = messages.union(Set({ kind: "commit", resourceManager: "" })) + } + + action decideOnAbort = all { + transactionManagerState == "init", + transactionManagerState' = "done", + messages' = messages.union(Set({ kind: "abort", resourceManager: "" })) + } + + /* Resource Manager actions */ + + action prepare(resourceManager: str): bool = all { + resourceManagerStates.get(resourceManager) == "working", + resourceManagerStates' = resourceManagerStates.set(resourceManager, "prepared"), + messages' = messages.union(Set({ kind: "prepared", resourceManager: resourceManager })) + } + + action abort(resourceManager: str): bool = all { + or { + // Resource manager chooses to abort + resourceManagerStates.get(resourceManager) == "working", + // Resource manager receives an abort message from the transaction manager + messages.contains({ kind: "abort", resourceManager: "" }), + }, + resourceManagerStates' = resourceManagerStates.set(resourceManager, "aborted"), + // There is no need to let others know that this resource manager aborted + messages' = messages + } + + action commit(resourceManager: str): bool = all { + messages.contains({ kind: "commit", resourceManager: "" }), + resourceManagerStates' = resourceManagerStates.set(resourceManager, "commited"), + messages' = messages.union(Set({ kind: "commited", resourceManager: resourceManager })) + } + + action step = any { + all { + nondet rm = resourceManagers.oneOf() + any { prepare(rm), abort(rm), commit(rm) }, + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }, + all { + any { decideOnCommit, decideOnAbort }, + preparedResourceManagers' = preparedResourceManagers, + resourceManagerStates' = resourceManagerStates, + }, + all { + nondet rm = resourceManagers.oneOf() + addPreparedResourceManager(rm), + transactionManagerState' = transactionManagerState, + resourceManagerStates' = resourceManagerStates, + messages' = messages, + } + } + + action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => + not(resourceManagerStates.get(r1) == "commited" and resourceManagerStates.get(r2) == "aborted") + ) +} + +module two_phase_commit_3 { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + run preparation(rm) = (all { + prepare(rm), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + addPreparedResourceManager(rm), + transactionManagerState' = transactionManagerState, + resourceManagerStates' = resourceManagerStates, + messages' = messages, + }) + + run commitment = (all { + decideOnCommit, + preparedResourceManagers' = preparedResourceManagers, + resourceManagerStates' = resourceManagerStates, + }).then(all { + commit("rm1"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + commit("rm2"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + commit("rm3"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }) + + run successTest = init + .then(preparation("rm1")) + .then(preparation("rm2")) + .then(preparation("rm3")) + .then(commitment) +} From a6f5f52ab0ca362d3aad63e2c04b3b9c90decfba Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:32:48 -0300 Subject: [PATCH 030/428] Use sum types --- .../TwoPhaseCommit/two_phase_commit.qnt | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 5f7f0d18c..9c805a4c1 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,23 +1,25 @@ module two_phase_commit { - /// "working", "prepared", "committed" or "aborted" - type ResourceManagerState = str + type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState - /// "init" or "done" - type TransactionManagerState = str + type TransactionManagerState = Init | Done var transactionManagerState: TransactionManagerState var preparedResourceManagers: Set[str] - /// kind "commit", "abort" or "prepared" - type Message = { kind: str, resourceManager: str } + type Message = + | Abort + | Commit + | RMPrepared(str) + | RMCommitted(str) + var messages: Set[Message] const resourceManagers: Set[str] action init = all { - resourceManagerStates' = resourceManagers.mapBy(r => "working"), - transactionManagerState' = "init", + resourceManagerStates' = resourceManagers.mapBy(r => Working), + transactionManagerState' = Init, preparedResourceManagers' = Set(), messages' = Set(), } @@ -25,48 +27,48 @@ module two_phase_commit { /* Transaction Manager actions */ action addPreparedResourceManager(resourceManager: str): bool = all { - transactionManagerState == "init", - messages.contains({ kind: "prepared", resourceManager: resourceManager }), + transactionManagerState == Init, + messages.contains(RMPrepared(resourceManager)), preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) } action decideOnCommit = all { - transactionManagerState == "init", + transactionManagerState == Init, preparedResourceManagers == resourceManagers, - transactionManagerState' = "done", - messages' = messages.union(Set({ kind: "commit", resourceManager: "" })) + transactionManagerState' = Done, + messages' = messages.union(Set(Commit)) } action decideOnAbort = all { - transactionManagerState == "init", - transactionManagerState' = "done", - messages' = messages.union(Set({ kind: "abort", resourceManager: "" })) + transactionManagerState == Init, + transactionManagerState' = Done, + messages' = messages.union(Set(Abort)) } /* Resource Manager actions */ action prepare(resourceManager: str): bool = all { - resourceManagerStates.get(resourceManager) == "working", - resourceManagerStates' = resourceManagerStates.set(resourceManager, "prepared"), - messages' = messages.union(Set({ kind: "prepared", resourceManager: resourceManager })) + resourceManagerStates.get(resourceManager) == Working, + resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), + messages' = messages.union(Set(RMPrepared(resourceManager))) } action abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort - resourceManagerStates.get(resourceManager) == "working", + resourceManagerStates.get(resourceManager) == Working, // Resource manager receives an abort message from the transaction manager - messages.contains({ kind: "abort", resourceManager: "" }), + messages.contains(Abort), }, - resourceManagerStates' = resourceManagerStates.set(resourceManager, "aborted"), + resourceManagerStates' = resourceManagerStates.set(resourceManager, Aborted), // There is no need to let others know that this resource manager aborted messages' = messages } action commit(resourceManager: str): bool = all { - messages.contains({ kind: "commit", resourceManager: "" }), - resourceManagerStates' = resourceManagerStates.set(resourceManager, "commited"), - messages' = messages.union(Set({ kind: "commited", resourceManager: resourceManager })) + messages.contains(Commit), + resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), + messages' = messages.union(Set(RMCommitted(resourceManager))) } action step = any { @@ -91,7 +93,7 @@ module two_phase_commit { } action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => - not(resourceManagerStates.get(r1) == "commited" and resourceManagerStates.get(r2) == "aborted") + not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) } From 0ff004fa8d6da8fb189aa2f06d2c89ad847f500b Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:33:08 -0300 Subject: [PATCH 031/428] Update examples dashboard --- examples/.scripts/run-example.sh | 15 +++++++++++---- examples/README.md | 5 +++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index debf9d86c..8d0b2aa51 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -15,6 +15,7 @@ result () { # Skip tests for parameterized modules if [[ "$cmd" == "test" && ( + "$file" == "classic/distributed/Paxos/Voting.qnt" || "$file" == "cosmos/tendermint/Tendermint.qnt" || "$file" == "cosmos/tendermint/TendermintTest.qnt" || "$file" == "cosmos/lightclient/Blockchain.qnt" || @@ -46,10 +47,12 @@ result () { fi # Print additional explanations - if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && ( "$cmd" == "test" || "$cmd" == "verify" )]] ; then - printf "https://github.com/informalsystems/quint/issues/244" - elif [[ "$file" == "classic/distributed/Paxos/Voting.qnt" && ( "$cmd" == "test" || "$cmd" == "verify" )]] ; then - printf "https://github.com/informalsystems/quint/issues/244" + if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" + elif [[ "$file" == "classic/distributed/Paxos/Voting.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then printf "https://github.com/informalsystems/quint/issues/244" elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then @@ -66,6 +69,10 @@ get_main () { main="--main=ReadersWriters_5" elif [[ "$file" == "classic/distributed/ewd840/ewd840.qnt" ]] ; then main="--main=ewd840_3" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" ]] ; then + main="--main=two_phase_commit_3" + elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" ]] ; then + main="--main=Paxos_val2_accept3_quorum2" elif [[ "$file" == "classic/sequential/BinSearch/BinSearch.qnt" ]] ; then main="--main=BinSearch10" elif [[ "$file" == "cosmos/ics20/bank.qnt" ]] ; then diff --git a/examples/README.md b/examples/README.md index e1326368e..821137730 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,9 +51,10 @@ listed without any additional command line arguments. | [classic/distributed/ClockSync/clockSync3.qnt](./classic/distributed/ClockSync/clockSync3.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/ewd840/ewd840.qnt](./classic/distributed/ewd840/ewd840.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/LamportMutex/LamportMutex.qnt](./classic/distributed/LamportMutex/LamportMutex.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | :x:https://github.com/informalsystems/quint/issues/244 | -| [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | :x:https://github.com/informalsystems/quint/issues/244 | +| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :x: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | :x:https://github.com/informalsystems/quint/issues/1034 | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From 33199d118923aae43ff848c4cb99397c9187fbb0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:34:09 -0300 Subject: [PATCH 032/428] Fix invariant mode --- .../classic/distributed/TwoPhaseCommit/two_phase_commit.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 9c805a4c1..bfbf76d8d 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -92,7 +92,7 @@ module two_phase_commit { } } - action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => + val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) } From 6389fd30bc68b670ce6ce9b79a6d98ebff0f67db Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 28 Nov 2023 10:36:43 -0300 Subject: [PATCH 033/428] Apply suggestions from code review Co-authored-by: Thomas Pani Co-authored-by: Igor Konnov --- examples/.scripts/run-example.sh | 2 +- .../classic/distributed/TwoPhaseCommit/two_phase_commit.qnt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 8d0b2aa51..6472d58a8 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -54,7 +54,7 @@ result () { elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/244" + printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1019" fi diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index bfbf76d8d..6a111a302 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,3 +1,4 @@ +// -*- mode: Bluespec; -*- module two_phase_commit { type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState From 839974aa0c20e181e2b01e0f53ac7a5597795d4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 28 Nov 2023 10:55:42 -0300 Subject: [PATCH 034/428] Add comments --- .../TwoPhaseCommit/two_phase_commit.qnt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 6a111a302..4d2bf1076 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,4 +1,10 @@ // -*- mode: Bluespec; -*- + +/* This specification stems from the specification of the two phase protocol + by Leslie Lamport: + + https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ + module two_phase_commit { type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState @@ -6,6 +12,8 @@ module two_phase_commit { type TransactionManagerState = Init | Done var transactionManagerState: TransactionManagerState + /// The set of resource managers from which the transaction manager has + /// received RMPrepared messages var preparedResourceManagers: Set[str] type Message = @@ -27,12 +35,16 @@ module two_phase_commit { /* Transaction Manager actions */ + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm action addPreparedResourceManager(resourceManager: str): bool = all { transactionManagerState == Init, messages.contains(RMPrepared(resourceManager)), preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) } + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. action decideOnCommit = all { transactionManagerState == Init, preparedResourceManagers == resourceManagers, @@ -40,6 +52,7 @@ module two_phase_commit { messages' = messages.union(Set(Commit)) } + /// The transaction manager spontaneously aborts the transaction action decideOnAbort = all { transactionManagerState == Init, transactionManagerState' = Done, @@ -48,12 +61,14 @@ module two_phase_commit { /* Resource Manager actions */ + /// A resource manager prepares action prepare(resourceManager: str): bool = all { resourceManagerStates.get(resourceManager) == Working, resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), messages' = messages.union(Set(RMPrepared(resourceManager))) } + /// A resource manager aborts, either spontaneously or because of an Abort message action abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort @@ -66,6 +81,7 @@ module two_phase_commit { messages' = messages } + // A resource manager commits due to a Commit message action commit(resourceManager: str): bool = all { messages.contains(Commit), resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), @@ -73,17 +89,20 @@ module two_phase_commit { } action step = any { + // Resource manager actions all { nondet rm = resourceManagers.oneOf() any { prepare(rm), abort(rm), commit(rm) }, transactionManagerState' = transactionManagerState, preparedResourceManagers' = preparedResourceManagers, }, + // Transaction manager decisions (commit or abort) all { any { decideOnCommit, decideOnAbort }, preparedResourceManagers' = preparedResourceManagers, resourceManagerStates' = resourceManagerStates, }, + // Transaction managers message consumption all { nondet rm = resourceManagers.oneOf() addPreparedResourceManager(rm), @@ -93,6 +112,7 @@ module two_phase_commit { } } + /// Two resource managers have not arrived at conflicting decisions val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) @@ -101,6 +121,8 @@ module two_phase_commit { module two_phase_commit_3 { import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager run preparation(rm) = (all { prepare(rm), transactionManagerState' = transactionManagerState, @@ -112,6 +134,8 @@ module two_phase_commit_3 { messages' = messages, }) + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message run commitment = (all { decideOnCommit, preparedResourceManagers' = preparedResourceManagers, From dcc3a6283a2600aed6b41960d2a53b848c8ac78a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 28 Nov 2023 10:57:58 -0300 Subject: [PATCH 035/428] Update examples dashboard --- examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index 821137730..24b904b71 100644 --- a/examples/README.md +++ b/examples/README.md @@ -81,7 +81,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 87bdb10b9100c2c655c9bd52e6c67e8afdaed4fa Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Wed, 29 Nov 2023 15:16:37 -0300 Subject: [PATCH 036/428] Apply suggestions from code review Co-authored-by: Shon Feder --- CHANGELOG.md | 2 +- quint/src/ir/IRprinting.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a61543d89..6b4f1b35a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Topological sorting of modules (#1268) - The effect checker will now check for consistency of updates across different cases inside `match` (#1272) -- Fix problems in the integration of sum types in `run` and `test` commands (#1276) +- Fix problems in the integration of sum types in `run`, `test`, and `verify` commands (#1276) - Fix some corner cases with the usage of complex expressions inside `assume` and `import (...)` (#1276) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f90012752..5319d77f4 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -222,6 +222,8 @@ function sumFieldsToString(r: ConcreteRow): string { return `${f.fieldName}(${typeToString(f.fieldType)})` } }) + // We are not exposing open rows in sum types currently + // So we do not show show row variables. .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) .join(' | ') } From f45cf156843e0c721683365bfd16ecb99ef6bf68 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 30 Nov 2023 08:48:25 -0300 Subject: [PATCH 037/428] Reference issue #1279 on definitionDepth initializations --- quint/src/effects/inferrer.ts | 2 ++ quint/src/ir/IRprinting.ts | 26 ++++++++++++++------------ quint/src/names/collector.ts | 4 ++++ quint/src/names/resolver.ts | 4 ++++ quint/src/runtime/impl/compilerImpl.ts | 2 ++ 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index 0338a593e..b176087fe 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -87,6 +87,8 @@ export class EffectInferrer implements IRVisitor { private freeNames: { effectVariables: Set; entityVariables: Set }[] = [] // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 enterExpr(e: QuintEx) { diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 5319d77f4..f2ea096f6 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -214,18 +214,20 @@ export function sumToString(s: QuintSumType): string { } function sumFieldsToString(r: ConcreteRow): string { - return r.fields - .map((f: RowField) => { - if (isUnitType(f.fieldType)) { - return `${f.fieldName}` - } else { - return `${f.fieldName}(${typeToString(f.fieldType)})` - } - }) - // We are not exposing open rows in sum types currently - // So we do not show show row variables. - .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) - .join(' | ') + return ( + r.fields + .map((f: RowField) => { + if (isUnitType(f.fieldType)) { + return `${f.fieldName}` + } else { + return `${f.fieldName}(${typeToString(f.fieldType)})` + } + }) + // We are not exposing open rows in sum types currently + // So we do not show show row variables. + .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) + .join(' | ') + ) } /** diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index bb1708f72..52e8dc054 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -54,6 +54,10 @@ export class NameCollector implements IRVisitor { definitionsByModule: DefinitionsByModule = new Map() errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 private currentModuleName: string = '' diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 3d0bf3397..826c51efe 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -43,6 +43,10 @@ class NameResolver implements IRVisitor { collector: NameCollector errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor() { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 5acb5886c..13ca70d79 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -161,6 +161,8 @@ export class CompilerVisitor implements IRVisitor { // execution listener private execListener: ExecutionListener // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor( From e981b914daa4311d505f0db00f8405ad68d618cc Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 30 Nov 2023 08:51:22 -0300 Subject: [PATCH 038/428] Explain the reason for the -1 initialization --- quint/src/ir/IRVisitor.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 2cc9245a6..609b62105 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -23,7 +23,10 @@ import { unreachable } from '../util' */ export interface IRVisitor { /* Keeps track of the depth of the current definition, to be updated by the - * walk* functions and used by implementations of the interface */ + * walk* functions and used by implementations of the interface. Should be + * initialized to -1, so if `walkDefinition` is called from a different place + * than `walkDeclaration` (which does set this to -1), the increments and + * decrements work as expected. */ definitionDepth?: number enterModule?: (_module: ir.QuintModule) => void From b0024f49b20c6f24820d4fbdb47c8266f6b7aa78 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 28 Nov 2023 22:18:13 -0500 Subject: [PATCH 039/428] Add regression test for 1275 --- quint/test/types/inferrer.test.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 9a79b415c..7cd903bc6 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,16 +2,20 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { errorTreeToString } from '../../src/errorTree' +import { ErrorTree, errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' describe('inferTypes', () => { - function inferTypesForDefs(defs: string[]): TypeInferenceResult { - const text = `module wrapper { ${defs.join('\n')} }` + function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) const inferrer = new TypeInferrer(table) - return inferrer.inferTypes(modules[0].declarations) + return inferrer.inferTypes(modules.flatMap(m => m.declarations)) + } + + function inferTypesForDefs(defs: string[]): TypeInferenceResult { + const text = `module wrapper { ${defs.join('\n')} }` + return inferTypesForModules(text) } it('infers types for basic expressions', () => { @@ -159,6 +163,21 @@ describe('inferTypes', () => { ]) }) + it('infers types for different sum type declarations with the same label but different values', () => { + const text = ` +module A { + type T1 = | A(int) +} + +module B { + type T2 = | A(bool) +} +` + + const [errors, _] = inferTypesForModules(text) + assert.deepEqual([...errors.entries()], []) + }) + it('infers types for match expression', () => { const defs = ['type T = A(int) | B', 'val a = variant("A", 3)', 'val nine = match a { A(n) => n * n | B => 9 }'] From bedd361341edbb23da90c37bccc0551c8b2fa267 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 10:10:05 -0500 Subject: [PATCH 040/428] Improve comments --- quint/src/parsing/ToIrListener.ts | 4 ++-- quint/src/types/constraintSolver.ts | 1 - quint/test/types/inferrer.test.ts | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f758bd424..e684c355e 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -414,8 +414,8 @@ export class ToIrListener implements QuintListener { // We will generate // // ``` - // def A(__AParam) = variant("A", __AParam) - // val B = {} + // def A(__AParam: int) : T = variant("A", __AParam) + // val B : T = {} // ``` // // Allowing users to write: diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 9e4258f07..2fe22f661 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -66,7 +66,6 @@ export function solveConstraint( const subst = unify(table, def.type, constraint.type) if (subst.isRight()) { // We found a defined type unifying with the given schema - // (unwrap the vaule since the left of `unify` doesn't match our needs and isn't relevent) return right(subst.unwrap()) } } diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 7cd903bc6..1e90e27f1 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -164,6 +164,7 @@ describe('inferTypes', () => { }) it('infers types for different sum type declarations with the same label but different values', () => { + // See https://github.com/informalsystems/quint/issues/1275 const text = ` module A { type T1 = | A(int) From 3158e29802fc7916bb48cbe9776ecd6255cb4d5e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 12:22:49 -0500 Subject: [PATCH 041/428] Fix variant constructor IDs Our parser and IR has the convention that the declaration def f(x) = y Gets represented as def f = (x) => y And in the IR, we expect both the representation of the declaration and the representation of the lambda to have the same source ID. We had not been following this convention in the generation of variant constructors, and that is corrected here. --- quint/src/parsing/ToIrListener.ts | 8 ++++++-- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index e684c355e..7247a067d 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -430,6 +430,10 @@ export class ToIrListener implements QuintListener { // This shouldn't be visible to users const paramName = `__${fieldName}Param` + // def declarations and the lambdas they are associated with should share + // the same ID + const declarationId = this.getId(variantCtx) + let qualifier: OpQualifier let expr: QuintEx let typeAnnotation: QuintType @@ -476,10 +480,10 @@ export class ToIrListener implements QuintListener { } typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } - expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } + expr = { id: declarationId, kind: 'lambda', params, qualifier, expr: variant } } - return { id: this.getId(variantCtx), kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } + return { id: declarationId, kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } } ) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index e8ae27239..4e367b3c5 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"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":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"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":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"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":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"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":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","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":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":507,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"imul","args":[{"id":98,"kind":"int","value":2},{"id":99,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"idiv","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"imod","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"ipow","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"iuminus","args":[{"id":114,"kind":"int","value":100}]}},{"id":120,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"igt","args":[{"id":117,"kind":"int","value":2},{"id":118,"kind":"int","value":3}]}},{"id":124,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igte","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"ilt","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilte","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"eq","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"neq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":146,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":145,"kind":"app","opcode":"eq","args":[{"id":143,"kind":"app","opcode":"iadd","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":2}]},{"id":144,"kind":"int","value":4}]}},{"id":150,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"in","args":[{"id":147,"kind":"int","value":1},{"id":148,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":162,"kind":"def","name":"withType","qualifier":"val","expr":{"id":161,"kind":"app","opcode":"Set","args":[{"id":159,"kind":"int","value":1},{"id":160,"kind":"int","value":2}]},"typeAnnotation":{"id":158,"kind":"set","elem":{"id":157,"kind":"int"}}},{"id":163,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},{"id":171,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":170,"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":208,"kind":"int"},"id":209},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":230,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":229,"kind":"app","opcode":"and","args":[{"id":227,"kind":"bool","value":false},{"id":228,"kind":"bool","value":true}]}},{"id":234,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":233,"kind":"app","opcode":"or","args":[{"id":231,"kind":"bool","value":false},{"id":232,"kind":"bool","value":true}]}},{"id":238,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":237,"kind":"app","opcode":"implies","args":[{"id":235,"kind":"bool","value":false},{"id":236,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":267,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"bool","value":false},{"id":264,"kind":"bool","value":true},{"id":265,"kind":"bool","value":false}]}},{"id":272,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":268,"kind":"bool","value":false},{"id":269,"kind":"bool","value":true},{"id":270,"kind":"bool","value":false}]}},{"id":277,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":276,"kind":"app","opcode":"or","args":[{"id":273,"kind":"bool","value":false},{"id":274,"kind":"bool","value":true},{"id":275,"kind":"bool","value":false}]}},{"id":282,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":281,"kind":"app","opcode":"actionAny","args":[{"id":278,"kind":"bool","value":false},{"id":279,"kind":"bool","value":true},{"id":280,"kind":"bool","value":false}]}},{"id":287,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":286,"kind":"app","opcode":"ite","args":[{"id":283,"kind":"bool","value":true},{"id":284,"kind":"int","value":1},{"id":285,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}}},{"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":324,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":323,"kind":"app","opcode":"in","args":[{"id":321,"kind":"int","value":1},{"id":322,"kind":"app","opcode":"Set","args":[]}]}},{"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":389,"kind":"def","name":"one","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"head","args":[{"id":387,"kind":"app","opcode":"List","args":[{"id":385,"kind":"int","value":1},{"id":386,"kind":"int","value":2}]}]}},{"id":394,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"Tup","args":[{"id":390,"kind":"int","value":1},{"id":391,"kind":"int","value":2},{"id":392,"kind":"int","value":3}]}},{"id":399,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"Tup","args":[{"id":395,"kind":"int","value":1},{"id":396,"kind":"int","value":2},{"id":397,"kind":"int","value":3}]}},{"id":403,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":402,"kind":"app","opcode":"Tup","args":[{"id":400,"kind":"int","value":4},{"id":401,"kind":"int","value":5}]}},{"id":408,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":407,"kind":"app","opcode":"List","args":[{"id":404,"kind":"int","value":1},{"id":405,"kind":"int","value":2},{"id":406,"kind":"int","value":3}]}},{"id":413,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":412,"kind":"app","opcode":"List","args":[{"id":409,"kind":"int","value":1},{"id":410,"kind":"int","value":2},{"id":411,"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":420,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"nth","args":[{"id":417,"kind":"app","opcode":"List","args":[{"id":414,"kind":"int","value":2},{"id":415,"kind":"int","value":3},{"id":416,"kind":"int","value":4}]},{"id":418,"kind":"int","value":2}]}},{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]}},{"id":432,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":431,"kind":"app","opcode":"Rec","args":[{"id":427,"kind":"str","value":"name"},{"id":428,"kind":"str","value":"igor"},{"id":429,"kind":"str","value":"year"},{"id":430,"kind":"int","value":1981}]}},{"id":445,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":444,"kind":"app","opcode":"Set","args":[{"id":441,"kind":"int","value":1},{"id":442,"kind":"int","value":2},{"id":443,"kind":"int","value":3}]}},{"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":474,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"in","args":[{"id":471,"kind":"int","value":2},{"id":472,"kind":"app","opcode":"Set","args":[]}]}},{"id":478,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":477,"kind":"app","opcode":"subseteq","args":[{"id":475,"kind":"app","opcode":"Set","args":[]},{"id":476,"kind":"app","opcode":"Set","args":[]}]}},{"id":487,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":486,"kind":"app","opcode":"in","args":[{"id":480,"kind":"app","opcode":"Set","args":[{"id":479,"kind":"int","value":1}]},{"id":485,"kind":"app","opcode":"powerset","args":[{"id":484,"kind":"app","opcode":"Set","args":[{"id":481,"kind":"int","value":1},{"id":482,"kind":"int","value":2},{"id":483,"kind":"int","value":3}]}]}]}},{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},{"id":501,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":86,"kind":"int"},"id":87},{"kind":"var","name":"j","typeAnnotation":{"id":88,"kind":"bool"},"id":89},{"id":93,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":92,"kind":"app","opcode":"iadd","args":[{"id":90,"kind":"int","value":1},{"id":91,"kind":"int","value":2}]}},{"id":97,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"isub","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":156,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"exists","args":[{"id":151,"kind":"name","name":"Bool"},{"id":154,"kind":"lambda","params":[{"id":152,"name":"x"}],"qualifier":"def","expr":{"id":153,"kind":"name","name":"x"}}]}},{"id":167,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":166,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":165,"kind":"set","elem":{"id":164,"kind":"const","name":"PROC"}}},{"id":177,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":177,"kind":"lambda","params":[{"id":172,"name":"x"},{"id":173,"name":"y"}],"qualifier":"puredef","expr":{"id":176,"kind":"app","opcode":"iadd","args":[{"id":174,"kind":"name","name":"x"},{"id":175,"kind":"name","name":"y"}]}}},{"id":182,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":182,"kind":"lambda","params":[{"id":178,"name":"factor"}],"qualifier":"def","expr":{"id":181,"kind":"app","opcode":"imul","args":[{"id":179,"kind":"name","name":"factor"},{"id":180,"kind":"name","name":"n"}]}}},{"id":187,"kind":"def","name":"A","qualifier":"action","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"x"}],"qualifier":"action","expr":{"id":186,"kind":"app","opcode":"assign","args":[{"id":185,"kind":"name","name":"n"},{"id":184,"kind":"name","name":"x"}]}}},{"id":191,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":191,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"puredef","expr":{"id":190,"kind":"app","opcode":"not","args":[{"id":189,"kind":"name","name":"x"}]}}},{"id":201,"kind":"def","name":"H","qualifier":"def","expr":{"id":201,"kind":"lambda","params":[{"id":192,"name":"x"},{"id":193,"name":"y"}],"qualifier":"def","expr":{"id":200,"kind":"app","opcode":"iadd","args":[{"id":198,"kind":"name","name":"x"},{"id":199,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":197,"kind":"oper","args":[{"id":194,"kind":"int"},{"id":195,"kind":"int"}],"res":{"id":196,"kind":"int"}}},{"id":207,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":207,"kind":"lambda","params":[{"id":202,"name":"x"}],"qualifier":"def","expr":{"id":206,"kind":"name","name":"x"}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":203,"kind":"var","name":"a"}],"res":{"id":204,"kind":"var","name":"a"}}},{"id":213,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":212,"kind":"app","opcode":"assign","args":[{"id":211,"kind":"name","name":"k"},{"id":210,"kind":"int","value":3}]}},{"id":226,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":226,"kind":"lambda","params":[{"id":214,"name":"x"},{"id":216,"name":"y"}],"qualifier":"puredef","expr":{"id":224,"kind":"app","opcode":"ite","args":[{"id":221,"kind":"app","opcode":"ilt","args":[{"id":219,"kind":"name","name":"x"},{"id":220,"kind":"name","name":"y"}]},{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":225,"kind":"oper","args":[{"id":215,"kind":"int"},{"id":217,"kind":"int"}],"res":{"id":218,"kind":"int"}}},{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}}},{"id":300,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":300,"kind":"lambda","params":[{"id":288,"name":"x"},{"id":289,"name":"y"}],"qualifier":"def","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":292,"kind":"app","opcode":"ilt","args":[{"id":290,"kind":"name","name":"x"},{"id":291,"kind":"int","value":10}]},{"id":295,"kind":"app","opcode":"iadd","args":[{"id":293,"kind":"name","name":"y"},{"id":294,"kind":"int","value":5}]},{"id":298,"kind":"app","opcode":"imod","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]}]}}},{"id":308,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":307,"kind":"app","opcode":"get","args":[{"id":305,"kind":"name","name":"f1"},{"id":306,"kind":"str","value":"a"}]}},{"id":316,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":315,"kind":"app","opcode":"MyOper","args":[{"id":313,"kind":"str","value":"a"},{"id":314,"kind":"int","value":42}]}},{"id":320,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":319,"kind":"app","opcode":"MyOper","args":[{"id":317,"kind":"str","value":"a"},{"id":318,"kind":"int","value":42}]}},{"id":332,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"filter","args":[{"id":325,"kind":"name","name":"S"},{"id":330,"kind":"lambda","params":[{"id":326,"name":"x"}],"qualifier":"def","expr":{"id":329,"kind":"app","opcode":"igt","args":[{"id":327,"kind":"name","name":"x"},{"id":328,"kind":"int","value":10}]}}]}},{"id":370,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":369,"kind":"app","opcode":"filter","args":[{"id":365,"kind":"name","name":"S"},{"id":368,"kind":"lambda","params":[{"id":366,"name":"_"}],"qualifier":"def","expr":{"id":367,"kind":"bool","value":true}}]}},{"id":378,"kind":"def","name":"f","qualifier":"val","expr":{"id":377,"kind":"app","opcode":"mapBy","args":[{"id":371,"kind":"name","name":"S"},{"id":376,"kind":"lambda","params":[{"id":372,"name":"x"}],"qualifier":"def","expr":{"id":375,"kind":"app","opcode":"iadd","args":[{"id":373,"kind":"name","name":"x"},{"id":374,"kind":"int","value":1}]}}]}},{"id":384,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":383,"kind":"app","opcode":"exclude","args":[{"id":379,"kind":"name","name":"S"},{"id":382,"kind":"app","opcode":"Set","args":[{"id":380,"kind":"int","value":3},{"id":381,"kind":"int","value":4}]}]}},{"id":440,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":439,"kind":"app","opcode":"with","args":[{"id":438,"kind":"app","opcode":"with","args":[{"id":437,"kind":"name","name":"test_record"},{"id":434,"kind":"str","value":"name"},{"id":433,"kind":"str","value":"quint"}]},{"id":436,"kind":"str","value":"year"},{"id":435,"kind":"int","value":2023}]}},{"id":456,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":455,"kind":"let","opdef":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]}},"expr":{"id":454,"kind":"app","opcode":"field","args":[{"id":452,"kind":"name","name":"my_rec"},{"id":453,"kind":"str","value":"a"}]}}},{"id":465,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":464,"kind":"let","opdef":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]}},"expr":{"id":463,"kind":"app","opcode":"item","args":[{"id":461,"kind":"name","name":"my_tup"},{"id":462,"kind":"int","value":2}]}}},{"id":470,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":470,"kind":"lambda","params":[{"id":466,"name":"s"}],"qualifier":"def","expr":{"id":469,"kind":"app","opcode":"eq","args":[{"id":467,"kind":"name","name":"s"},{"id":468,"kind":"app","opcode":"List","args":[]}]}}},{"id":491,"kind":"assume","name":"positive","assumption":{"id":490,"kind":"app","opcode":"igt","args":[{"id":488,"kind":"name","name":"N"},{"id":489,"kind":"int","value":0}]}},{"id":495,"kind":"assume","name":"_","assumption":{"id":494,"kind":"app","opcode":"neq","args":[{"id":492,"kind":"name","name":"N"},{"id":493,"kind":"int","value":0}]}},{"id":496,"kind":"import","defName":"foo","protoName":"M1"},{"id":497,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":502,"kind":"const","name":"INT_SET"},"id":503},{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},{"id":69,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":69,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":74,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":79,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":81,"name":"__DogParam"}],"qualifier":"def","expr":{"id":83,"kind":"app","opcode":"variant","args":[{"id":80,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":82}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":84,"kind":"const","name":"MyUnionType"},"id":85},{"id":248,"kind":"def","name":"G","qualifier":"def","expr":{"id":248,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":247,"kind":"app","opcode":"and","args":[{"id":244,"kind":"app","opcode":"F","args":[{"id":243,"kind":"name","name":"x"}]},{"id":246,"kind":"app","opcode":"not","args":[{"id":245,"kind":"name","name":"x"}]}]}}},{"id":255,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":255,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":254,"kind":"app","opcode":"and","args":[{"id":251,"kind":"app","opcode":"F","args":[{"id":250,"kind":"name","name":"x"}]},{"id":253,"kind":"app","opcode":"not","args":[{"id":252,"kind":"name","name":"x"}]}]}}},{"id":262,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":262,"kind":"lambda","params":[{"id":256,"name":"x"}],"qualifier":"def","expr":{"id":261,"kind":"app","opcode":"or","args":[{"id":258,"kind":"app","opcode":"F","args":[{"id":257,"kind":"name","name":"x"}]},{"id":260,"kind":"app","opcode":"not","args":[{"id":259,"kind":"name","name":"x"}]}]}}},{"id":352,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":351,"kind":"app","opcode":"map","args":[{"id":335,"kind":"app","opcode":"tuples","args":[{"id":333,"kind":"name","name":"S"},{"id":334,"kind":"name","name":"MySet"}]},{"id":350,"kind":"lambda","params":[{"id":341,"name":"quintTupledLambdaParam341"}],"qualifier":"def","expr":{"id":346,"kind":"let","opdef":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]}},"expr":{"id":342,"kind":"let","opdef":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]}},"expr":{"id":340,"kind":"app","opcode":"iadd","args":[{"id":338,"kind":"name","name":"s"},{"id":339,"kind":"name","name":"mys"}]}}}}]}},{"id":364,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":363,"kind":"let","opdef":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]}},"expr":{"id":362,"kind":"app","opcode":"actionAll","args":[{"id":358,"kind":"app","opcode":"igt","args":[{"id":356,"kind":"name","name":"x"},{"id":357,"kind":"int","value":10}]},{"id":361,"kind":"app","opcode":"assign","args":[{"id":360,"kind":"name","name":"k"},{"id":359,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"82":{"id":81,"name":"__DogParam","kind":"param"},"84":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"153":{"id":152,"name":"x","kind":"param"},"164":{"id":163,"kind":"typedef","name":"PROC"},"174":{"id":172,"name":"x","kind":"param"},"175":{"id":173,"name":"y","kind":"param"},"179":{"id":178,"name":"factor","kind":"param"},"180":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"184":{"id":183,"name":"x","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"189":{"id":188,"name":"x","kind":"param"},"198":{"id":192,"name":"x","kind":"param"},"199":{"id":193,"name":"y","kind":"param"},"206":{"id":202,"name":"x","kind":"param"},"211":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"219":{"id":214,"name":"x","kind":"param"},"220":{"id":216,"name":"y","kind":"param"},"222":{"id":214,"name":"x","kind":"param"},"223":{"id":216,"name":"y","kind":"param"},"240":{"id":239,"name":"x","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"244":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"245":{"id":242,"name":"x","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"251":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"252":{"id":249,"name":"x","kind":"param"},"257":{"id":256,"name":"x","kind":"param"},"258":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"259":{"id":256,"name":"x","kind":"param"},"290":{"id":288,"name":"x","kind":"param"},"293":{"id":289,"name":"y","kind":"param"},"296":{"id":289,"name":"y","kind":"param"},"305":{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},"315":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"319":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"325":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"327":{"id":326,"name":"x","kind":"param"},"333":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"334":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"338":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]},"depth":1},"339":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]},"depth":1},"344":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"348":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"353":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"356":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"359":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"360":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"365":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"373":{"id":372,"name":"x","kind":"param"},"379":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"437":{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]},"depth":0},"452":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]},"depth":1},"461":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]},"depth":1},"467":{"id":466,"name":"s","kind":"param"},"488":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"492":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"502":{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":504,"importedFrom":{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 54d6d710d..659e2c8fa 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"80":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"81":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"84":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"85":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"86":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"87":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"88":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"89":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"90":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"91":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"92":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"93":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"94":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"95":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"96":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"97":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"98":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"99":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"100":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"101":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"102":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"103":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"104":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"105":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"106":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"107":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"108":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"109":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"110":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"111":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"112":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"113":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"114":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"115":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"116":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"117":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"118":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"119":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"120":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"121":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"122":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"123":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"124":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"125":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"126":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"127":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"128":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"129":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"130":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"131":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"132":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"133":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"134":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"135":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"136":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"137":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"138":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"139":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"140":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"141":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"142":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"143":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"144":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"146":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"147":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"148":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"149":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"150":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"151":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"152":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"153":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"154":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"156":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"157":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"158":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"159":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"160":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"161":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"162":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"163":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"164":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"165":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"166":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"167":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"168":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"169":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"170":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"171":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"172":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"173":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"174":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"175":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"176":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"177":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"178":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"179":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"180":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"181":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"182":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"183":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"184":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"185":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"186":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"187":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"188":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"189":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"190":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"191":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"192":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"193":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"194":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"195":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"196":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"197":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"198":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"199":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"200":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"201":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"202":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"203":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"204":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"205":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"206":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"207":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"208":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"209":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"210":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"211":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"212":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"213":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"214":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"215":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"216":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"217":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"218":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"219":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"220":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"221":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"222":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"223":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"224":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"225":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"226":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"227":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"228":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"229":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"230":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"231":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"232":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"233":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"234":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"235":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"236":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"237":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"238":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"239":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"240":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"241":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"242":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"243":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"244":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"245":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"246":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"248":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"249":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"250":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"251":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"252":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"253":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"255":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"256":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"257":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"258":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"259":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"260":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"262":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"263":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"264":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"265":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"266":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"267":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"268":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"269":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"270":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"271":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"272":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"273":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"274":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"275":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"276":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"277":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"278":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"279":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"280":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"281":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"282":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"283":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"284":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"285":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"286":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"287":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"288":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"289":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"290":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"291":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"292":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"293":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"294":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"295":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"296":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"297":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"298":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"299":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"300":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"301":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"302":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"303":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"304":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"305":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"306":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"307":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"308":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"309":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"310":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"311":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"312":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"313":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"314":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"315":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"316":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"317":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"318":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"319":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"320":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"321":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"322":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"323":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"324":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"325":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"326":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"327":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"328":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"329":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"330":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"331":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"332":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"333":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"334":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"335":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"336":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"337":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"338":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"339":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"340":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"341":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"342":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"352":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"353":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"354":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"355":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"356":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"357":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"358":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"359":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"360":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"361":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"362":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"363":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"364":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"365":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"366":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"367":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"368":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"369":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"370":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"371":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"372":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"373":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"374":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"375":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"376":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"377":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"378":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"379":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"380":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"381":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"382":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"383":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"384":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"385":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"386":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"387":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"388":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"389":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"390":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"391":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"392":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"393":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"394":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"395":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"396":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"397":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"398":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"399":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"400":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"401":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"402":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"403":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"404":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"405":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"406":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"407":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"408":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"409":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"410":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"411":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"412":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"413":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"414":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"415":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"416":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"417":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"418":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"419":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"420":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"421":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"422":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"423":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"424":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"425":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"426":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"427":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"428":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"429":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"430":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"431":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"432":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"433":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"434":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"435":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"436":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"437":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"438":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"439":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"440":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"441":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"442":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"443":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"444":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"445":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"446":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"447":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"448":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"449":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"450":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"451":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"452":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"453":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"454":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"455":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"456":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"457":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"458":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"459":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"460":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"461":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"462":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"463":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"464":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"465":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"466":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"467":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"468":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"469":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"470":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"471":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"472":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"473":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"474":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"475":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"476":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"477":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"478":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"479":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"480":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"481":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"482":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"483":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"484":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"485":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"486":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"487":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"488":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"489":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"490":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"491":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"492":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"493":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"494":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"495":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"496":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"497":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"498":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"499":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"500":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"501":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"502":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"503":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"504":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"505":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"506":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"507":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 67982899d..cbab0c26f 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":20,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":4,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":8,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":19,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":18,"kind":"app","opcode":"List","args":[{"id":15,"kind":"name","name":"A"},{"id":17,"kind":"app","opcode":"B","args":[{"id":16,"kind":"int","value":2}]}]},"typeAnnotation":{"id":14,"kind":"list","elem":{"id":13,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"13":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"15":{"id":4,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"17":{"id":8,"kind":"def","name":"B","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 9d2b689b9..566d834ed 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"14":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"15":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"16":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"17":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"18":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"19":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"20":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 6ceb3f033..7236d240c 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":38,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":5,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":9,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":9,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]}},{"id":37,"kind":"def","name":"ex","qualifier":"val","expr":{"id":27,"kind":"app","opcode":"matchVariant","args":[{"id":22,"kind":"name","name":"c"},{"id":28,"kind":"str","value":"A"},{"id":29,"kind":"lambda","qualifier":"def","expr":{"id":23,"kind":"int","value":0},"params":[{"name":"_","id":30}]},{"id":31,"kind":"str","value":"B"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":24,"kind":"name","name":"n"},"params":[{"name":"n","id":33}]},{"id":34,"kind":"str","value":"_"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"app","opcode":"iuminus","args":[{"id":25,"kind":"int","value":1}]},"params":[{"name":"_","id":36}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"20":{"id":14,"kind":"def","name":"C","qualifier":"def","expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"22":{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]},"depth":0},"24":{"name":"n","id":33,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index 5a444ca1c..c365ead8e 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"20":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"21":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"22":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"23":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"24":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"25":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"26":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"27":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"28":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"29":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"32":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"35":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"38":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file From 0c0a0df2dcca7593f37dc186c509954d3aa5fd95 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 17:22:06 -0500 Subject: [PATCH 042/428] Sort constraints to solve by order of "generality" Closes #1275 Since we don't do any backtracking in our constraint solving, the order in which the are solved is important. In particular, if we solve `isDefined` constraints before solving equality constraints, we can end up unifying a free variable with a variable in the first discovered defined type, rather than finding the most specific type that can unify with the given schema. This change defines an order over constraints, based on their kind, and uses that to sort the constraints before they are solved. --- quint/src/types/base.ts | 21 +++++++++++++++++++++ quint/src/types/constraintSolver.ts | 13 ++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 3f66d009f..9f2899557 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -1,3 +1,4 @@ +import { number } from 'yargs'; import { QuintType } from '../ir/quintTypes' /* @@ -13,6 +14,14 @@ export type Constraint = /// the empty constraint (always satisfied) | { kind: 'empty' } +/** The constraint kinds, in order of "generality" + * + * Constraint solving is order dependent, and we need the most general constraints + * to be solved first. "More general" is here understood to mean "requires less + * information to solve correctly". + */ +const constraintKinds = ['empty', 'eq', 'conjunction', 'isDefined'] as const + export interface TypeScheme { type: QuintType typeVariables: Set @@ -24,3 +33,15 @@ export type Signature = (_arity: number) => TypeScheme export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } + +/** compares two constraints based on the order of generality of their kind + * + * @returns a negative value if the kind of the first constraint is more general than the second, + * a positive value if the kind of the first constraint is more specific than the second, + * and 0 if the two constraints are the same kind. + */ +export function compareConstraints(a: Constraint, b: Constraint): number { + const aIdx : number = constraintKinds.findIndex(s => s === a.kind) + const bIdx : number = constraintKinds.findIndex(s => s === b.kind) + return aIdx - bIdx +} diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 2fe22f661..2e2518ba7 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -14,13 +14,14 @@ import { Either, left, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree } from '../errorTree' -import { rowToString, typeToString } from '../ir/IRprinting' +import { declarationToString, rowToString, typeToString } from '../ir/IRprinting' import { QuintConstType, QuintType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { Constraint } from './base' +import { compareConstraints, Constraint } from './base' import { Substitutions, applySubstitution, applySubstitutionToConstraint, compose } from './substitutions' import { unzip } from 'lodash' import { LookupTable } from '../names/base' import { simplifyRow } from './simplification' +import { constraintToString, substitutionsToString } from './printing' /* * Try to solve a constraint by unifying all pairs of types in equality @@ -38,6 +39,8 @@ export function solveConstraint( ): Either, Substitutions> { const errors: Map = new Map() switch (constraint.kind) { + case 'empty': + return right([]) case 'eq': return unify(table, constraint.types[0], constraint.types[1]).mapLeft(e => { errors.set(constraint.sourceId, e) @@ -45,7 +48,9 @@ export function solveConstraint( }) case 'conjunction': { // Chain solving of inner constraints, collecting all errors (even after the first failure) - return constraint.constraints.reduce((result: Either, Substitutions>, con) => { + return constraint.constraints + .sort(compareConstraints) + .reduce((result: Either, Substitutions>, con) => { // If previous result is a failure, try to solve the original constraint // to gather all errors instead of just propagating the first one let newCons = con @@ -79,8 +84,6 @@ export function solveConstraint( ) return left(errors) } - case 'empty': - return right([]) } } From f14793ef7fa655a33dbc424caa50246b83188d15 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 17:29:15 -0500 Subject: [PATCH 043/428] Fix formatting --- quint/src/types/base.ts | 5 ++--- quint/src/types/constraintSolver.ts | 29 ++++++++++++++--------------- quint/test/types/inferrer.test.ts | 2 +- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 9f2899557..1414556a0 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -1,4 +1,3 @@ -import { number } from 'yargs'; import { QuintType } from '../ir/quintTypes' /* @@ -41,7 +40,7 @@ export function toScheme(type: QuintType): TypeScheme { * and 0 if the two constraints are the same kind. */ export function compareConstraints(a: Constraint, b: Constraint): number { - const aIdx : number = constraintKinds.findIndex(s => s === a.kind) - const bIdx : number = constraintKinds.findIndex(s => s === b.kind) + const aIdx: number = constraintKinds.findIndex(s => s === a.kind) + const bIdx: number = constraintKinds.findIndex(s => s === b.kind) return aIdx - bIdx } diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 2e2518ba7..d2da613b3 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -14,14 +14,13 @@ import { Either, left, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree } from '../errorTree' -import { declarationToString, rowToString, typeToString } from '../ir/IRprinting' +import { rowToString, typeToString } from '../ir/IRprinting' import { QuintConstType, QuintType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { compareConstraints, Constraint } from './base' +import { Constraint, compareConstraints } from './base' import { Substitutions, applySubstitution, applySubstitutionToConstraint, compose } from './substitutions' import { unzip } from 'lodash' import { LookupTable } from '../names/base' import { simplifyRow } from './simplification' -import { constraintToString, substitutionsToString } from './printing' /* * Try to solve a constraint by unifying all pairs of types in equality @@ -51,19 +50,19 @@ export function solveConstraint( return constraint.constraints .sort(compareConstraints) .reduce((result: Either, Substitutions>, con) => { - // If previous result is a failure, try to solve the original constraint - // to gather all errors instead of just propagating the first one - let newCons = con - result.map(s => { - newCons = applySubstitutionToConstraint(table, s, con) - }) - return solveConstraint(table, newCons) - .mapLeft(e => { - e.forEach((error, id) => errors.set(id, error)) - return errors + // If previous result is a failure, try to solve the original constraint + // to gather all errors instead of just propagating the first one + let newCons = con + result.map(s => { + newCons = applySubstitutionToConstraint(table, s, con) }) - .chain(newSubs => result.map(s => compose(table, newSubs, s))) - }, right([])) + return solveConstraint(table, newCons) + .mapLeft(e => { + e.forEach((error, id) => errors.set(id, error)) + return errors + }) + .chain(newSubs => result.map(s => compose(table, newSubs, s))) + }, right([])) } case 'isDefined': { for (const def of table.values()) { diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 1e90e27f1..8c496f164 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,7 +2,7 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { ErrorTree, errorTreeToString } from '../../src/errorTree' +import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' describe('inferTypes', () => { From dc4eb2af173221dfffb54acb4b6f7abb3c3371d8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 18:02:17 -0500 Subject: [PATCH 044/428] Update tests --- quint/test/types/aliasInliner.test.ts | 2 +- quint/test/types/inferrer.test.ts | 68 +++++++++++++++------------ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index 3d57494d1..d381a681d 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,9 +71,9 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B({}) | C({})) - | val C: (B({}) | C({})) = variant("C", Rec()) | type T2 = (Some((B({}) | C({}))) | None({})) | val B: (B({}) | C({})) = variant("B", Rec()) + | val C: (B({}) | C({})) = variant("C", Rec()) | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) | var x: (Some((B({}) | C({}))) | None({})) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 8c496f164..83566cd7c 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,6 +5,15 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +// Utility used to print update `stringType` values to make +// updating the expected values in the following tests less +// painful. +function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { + console.log('[') + stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) + console.log(']') +} + describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -146,20 +155,19 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], + [13n, 'str'], + [14n, 'int'], + [15n, '(A(int) | B({}))'], [16n, '(A(int) | B({}))'], - [17n, '(A(int) | B({}))'], + [6n, 'int'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [4n, '(int) => (A(int) | B({}))'], [10n, 'str'], [11n, '{}'], [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [5n, 'int'], - [4n, 'str'], - [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [9n, '(B({}) | A(int))'], ]) }) @@ -186,34 +194,34 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], + [13n, 'str'], + [14n, 'int'], + [15n, '(A(int) | B({}))'], [16n, '(A(int) | B({}))'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [18n, '(A(int) | B({}))'], - [24n, 'str'], - [26n, 'int'], + [23n, 'str'], + [25n, 'int'], + [18n, 'int'], [19n, 'int'], [20n, 'int'], + [24n, '(int) => int'], + [26n, 'str'], + [28n, '{}'], [21n, 'int'], - [25n, '(int) => int'], - [27n, 'str'], - [29n, '{}'], + [27n, '({}) => int'], [22n, 'int'], - [28n, '({}) => int'], - [23n, 'int'], - [30n, 'int'], - [5n, 'int'], - [4n, 'str'], + [29n, 'int'], [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [4n, '(int) => (A(int) | B({}))'], + [10n, 'str'], + [11n, '{}'], + [12n, '(B({}) | A(int))'], + [9n, '(B({}) | A(int))'], ]) }) From 978c42ffc733c44bbcc70f300b7dadb3fb6b08d4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 18:14:36 -0500 Subject: [PATCH 045/428] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b4f1b35a..b1b1c8d34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix problems in the integration of sum types in `run`, `test`, and `verify` commands (#1276) - Fix some corner cases with the usage of complex expressions inside `assume` and `import (...)` (#1276) +- Fix incorrect type checking failure from interference between sum types + sharing variant labels (#1275) ### Security From dc00be20c12e7dd3ad1f3cd8c1e1728619adb04d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 09:54:58 -0500 Subject: [PATCH 046/428] Revert "Fix variant constructor IDs" This reverts commit 3158e29802fc7916bb48cbe9776ecd6255cb4d5e. Apparently the example in the IR I was following is incorrect :) --- quint/src/parsing/ToIrListener.ts | 8 ++------ quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 7247a067d..e684c355e 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -430,10 +430,6 @@ export class ToIrListener implements QuintListener { // This shouldn't be visible to users const paramName = `__${fieldName}Param` - // def declarations and the lambdas they are associated with should share - // the same ID - const declarationId = this.getId(variantCtx) - let qualifier: OpQualifier let expr: QuintEx let typeAnnotation: QuintType @@ -480,10 +476,10 @@ export class ToIrListener implements QuintListener { } typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } - expr = { id: declarationId, kind: 'lambda', params, qualifier, expr: variant } + expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } - return { id: declarationId, kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } + return { id: this.getId(variantCtx), kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } } ) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 4e367b3c5..e8ae27239 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":507,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"imul","args":[{"id":98,"kind":"int","value":2},{"id":99,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"idiv","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"imod","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"ipow","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"iuminus","args":[{"id":114,"kind":"int","value":100}]}},{"id":120,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"igt","args":[{"id":117,"kind":"int","value":2},{"id":118,"kind":"int","value":3}]}},{"id":124,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igte","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"ilt","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilte","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"eq","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"neq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":146,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":145,"kind":"app","opcode":"eq","args":[{"id":143,"kind":"app","opcode":"iadd","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":2}]},{"id":144,"kind":"int","value":4}]}},{"id":150,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"in","args":[{"id":147,"kind":"int","value":1},{"id":148,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":162,"kind":"def","name":"withType","qualifier":"val","expr":{"id":161,"kind":"app","opcode":"Set","args":[{"id":159,"kind":"int","value":1},{"id":160,"kind":"int","value":2}]},"typeAnnotation":{"id":158,"kind":"set","elem":{"id":157,"kind":"int"}}},{"id":163,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},{"id":171,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":170,"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":208,"kind":"int"},"id":209},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":230,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":229,"kind":"app","opcode":"and","args":[{"id":227,"kind":"bool","value":false},{"id":228,"kind":"bool","value":true}]}},{"id":234,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":233,"kind":"app","opcode":"or","args":[{"id":231,"kind":"bool","value":false},{"id":232,"kind":"bool","value":true}]}},{"id":238,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":237,"kind":"app","opcode":"implies","args":[{"id":235,"kind":"bool","value":false},{"id":236,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":267,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"bool","value":false},{"id":264,"kind":"bool","value":true},{"id":265,"kind":"bool","value":false}]}},{"id":272,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":268,"kind":"bool","value":false},{"id":269,"kind":"bool","value":true},{"id":270,"kind":"bool","value":false}]}},{"id":277,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":276,"kind":"app","opcode":"or","args":[{"id":273,"kind":"bool","value":false},{"id":274,"kind":"bool","value":true},{"id":275,"kind":"bool","value":false}]}},{"id":282,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":281,"kind":"app","opcode":"actionAny","args":[{"id":278,"kind":"bool","value":false},{"id":279,"kind":"bool","value":true},{"id":280,"kind":"bool","value":false}]}},{"id":287,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":286,"kind":"app","opcode":"ite","args":[{"id":283,"kind":"bool","value":true},{"id":284,"kind":"int","value":1},{"id":285,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}}},{"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":324,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":323,"kind":"app","opcode":"in","args":[{"id":321,"kind":"int","value":1},{"id":322,"kind":"app","opcode":"Set","args":[]}]}},{"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":389,"kind":"def","name":"one","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"head","args":[{"id":387,"kind":"app","opcode":"List","args":[{"id":385,"kind":"int","value":1},{"id":386,"kind":"int","value":2}]}]}},{"id":394,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"Tup","args":[{"id":390,"kind":"int","value":1},{"id":391,"kind":"int","value":2},{"id":392,"kind":"int","value":3}]}},{"id":399,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"Tup","args":[{"id":395,"kind":"int","value":1},{"id":396,"kind":"int","value":2},{"id":397,"kind":"int","value":3}]}},{"id":403,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":402,"kind":"app","opcode":"Tup","args":[{"id":400,"kind":"int","value":4},{"id":401,"kind":"int","value":5}]}},{"id":408,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":407,"kind":"app","opcode":"List","args":[{"id":404,"kind":"int","value":1},{"id":405,"kind":"int","value":2},{"id":406,"kind":"int","value":3}]}},{"id":413,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":412,"kind":"app","opcode":"List","args":[{"id":409,"kind":"int","value":1},{"id":410,"kind":"int","value":2},{"id":411,"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":420,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"nth","args":[{"id":417,"kind":"app","opcode":"List","args":[{"id":414,"kind":"int","value":2},{"id":415,"kind":"int","value":3},{"id":416,"kind":"int","value":4}]},{"id":418,"kind":"int","value":2}]}},{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]}},{"id":432,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":431,"kind":"app","opcode":"Rec","args":[{"id":427,"kind":"str","value":"name"},{"id":428,"kind":"str","value":"igor"},{"id":429,"kind":"str","value":"year"},{"id":430,"kind":"int","value":1981}]}},{"id":445,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":444,"kind":"app","opcode":"Set","args":[{"id":441,"kind":"int","value":1},{"id":442,"kind":"int","value":2},{"id":443,"kind":"int","value":3}]}},{"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":474,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"in","args":[{"id":471,"kind":"int","value":2},{"id":472,"kind":"app","opcode":"Set","args":[]}]}},{"id":478,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":477,"kind":"app","opcode":"subseteq","args":[{"id":475,"kind":"app","opcode":"Set","args":[]},{"id":476,"kind":"app","opcode":"Set","args":[]}]}},{"id":487,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":486,"kind":"app","opcode":"in","args":[{"id":480,"kind":"app","opcode":"Set","args":[{"id":479,"kind":"int","value":1}]},{"id":485,"kind":"app","opcode":"powerset","args":[{"id":484,"kind":"app","opcode":"Set","args":[{"id":481,"kind":"int","value":1},{"id":482,"kind":"int","value":2},{"id":483,"kind":"int","value":3}]}]}]}},{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},{"id":501,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":86,"kind":"int"},"id":87},{"kind":"var","name":"j","typeAnnotation":{"id":88,"kind":"bool"},"id":89},{"id":93,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":92,"kind":"app","opcode":"iadd","args":[{"id":90,"kind":"int","value":1},{"id":91,"kind":"int","value":2}]}},{"id":97,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"isub","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":156,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"exists","args":[{"id":151,"kind":"name","name":"Bool"},{"id":154,"kind":"lambda","params":[{"id":152,"name":"x"}],"qualifier":"def","expr":{"id":153,"kind":"name","name":"x"}}]}},{"id":167,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":166,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":165,"kind":"set","elem":{"id":164,"kind":"const","name":"PROC"}}},{"id":177,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":177,"kind":"lambda","params":[{"id":172,"name":"x"},{"id":173,"name":"y"}],"qualifier":"puredef","expr":{"id":176,"kind":"app","opcode":"iadd","args":[{"id":174,"kind":"name","name":"x"},{"id":175,"kind":"name","name":"y"}]}}},{"id":182,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":182,"kind":"lambda","params":[{"id":178,"name":"factor"}],"qualifier":"def","expr":{"id":181,"kind":"app","opcode":"imul","args":[{"id":179,"kind":"name","name":"factor"},{"id":180,"kind":"name","name":"n"}]}}},{"id":187,"kind":"def","name":"A","qualifier":"action","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"x"}],"qualifier":"action","expr":{"id":186,"kind":"app","opcode":"assign","args":[{"id":185,"kind":"name","name":"n"},{"id":184,"kind":"name","name":"x"}]}}},{"id":191,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":191,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"puredef","expr":{"id":190,"kind":"app","opcode":"not","args":[{"id":189,"kind":"name","name":"x"}]}}},{"id":201,"kind":"def","name":"H","qualifier":"def","expr":{"id":201,"kind":"lambda","params":[{"id":192,"name":"x"},{"id":193,"name":"y"}],"qualifier":"def","expr":{"id":200,"kind":"app","opcode":"iadd","args":[{"id":198,"kind":"name","name":"x"},{"id":199,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":197,"kind":"oper","args":[{"id":194,"kind":"int"},{"id":195,"kind":"int"}],"res":{"id":196,"kind":"int"}}},{"id":207,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":207,"kind":"lambda","params":[{"id":202,"name":"x"}],"qualifier":"def","expr":{"id":206,"kind":"name","name":"x"}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":203,"kind":"var","name":"a"}],"res":{"id":204,"kind":"var","name":"a"}}},{"id":213,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":212,"kind":"app","opcode":"assign","args":[{"id":211,"kind":"name","name":"k"},{"id":210,"kind":"int","value":3}]}},{"id":226,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":226,"kind":"lambda","params":[{"id":214,"name":"x"},{"id":216,"name":"y"}],"qualifier":"puredef","expr":{"id":224,"kind":"app","opcode":"ite","args":[{"id":221,"kind":"app","opcode":"ilt","args":[{"id":219,"kind":"name","name":"x"},{"id":220,"kind":"name","name":"y"}]},{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":225,"kind":"oper","args":[{"id":215,"kind":"int"},{"id":217,"kind":"int"}],"res":{"id":218,"kind":"int"}}},{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}}},{"id":300,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":300,"kind":"lambda","params":[{"id":288,"name":"x"},{"id":289,"name":"y"}],"qualifier":"def","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":292,"kind":"app","opcode":"ilt","args":[{"id":290,"kind":"name","name":"x"},{"id":291,"kind":"int","value":10}]},{"id":295,"kind":"app","opcode":"iadd","args":[{"id":293,"kind":"name","name":"y"},{"id":294,"kind":"int","value":5}]},{"id":298,"kind":"app","opcode":"imod","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]}]}}},{"id":308,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":307,"kind":"app","opcode":"get","args":[{"id":305,"kind":"name","name":"f1"},{"id":306,"kind":"str","value":"a"}]}},{"id":316,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":315,"kind":"app","opcode":"MyOper","args":[{"id":313,"kind":"str","value":"a"},{"id":314,"kind":"int","value":42}]}},{"id":320,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":319,"kind":"app","opcode":"MyOper","args":[{"id":317,"kind":"str","value":"a"},{"id":318,"kind":"int","value":42}]}},{"id":332,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"filter","args":[{"id":325,"kind":"name","name":"S"},{"id":330,"kind":"lambda","params":[{"id":326,"name":"x"}],"qualifier":"def","expr":{"id":329,"kind":"app","opcode":"igt","args":[{"id":327,"kind":"name","name":"x"},{"id":328,"kind":"int","value":10}]}}]}},{"id":370,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":369,"kind":"app","opcode":"filter","args":[{"id":365,"kind":"name","name":"S"},{"id":368,"kind":"lambda","params":[{"id":366,"name":"_"}],"qualifier":"def","expr":{"id":367,"kind":"bool","value":true}}]}},{"id":378,"kind":"def","name":"f","qualifier":"val","expr":{"id":377,"kind":"app","opcode":"mapBy","args":[{"id":371,"kind":"name","name":"S"},{"id":376,"kind":"lambda","params":[{"id":372,"name":"x"}],"qualifier":"def","expr":{"id":375,"kind":"app","opcode":"iadd","args":[{"id":373,"kind":"name","name":"x"},{"id":374,"kind":"int","value":1}]}}]}},{"id":384,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":383,"kind":"app","opcode":"exclude","args":[{"id":379,"kind":"name","name":"S"},{"id":382,"kind":"app","opcode":"Set","args":[{"id":380,"kind":"int","value":3},{"id":381,"kind":"int","value":4}]}]}},{"id":440,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":439,"kind":"app","opcode":"with","args":[{"id":438,"kind":"app","opcode":"with","args":[{"id":437,"kind":"name","name":"test_record"},{"id":434,"kind":"str","value":"name"},{"id":433,"kind":"str","value":"quint"}]},{"id":436,"kind":"str","value":"year"},{"id":435,"kind":"int","value":2023}]}},{"id":456,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":455,"kind":"let","opdef":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]}},"expr":{"id":454,"kind":"app","opcode":"field","args":[{"id":452,"kind":"name","name":"my_rec"},{"id":453,"kind":"str","value":"a"}]}}},{"id":465,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":464,"kind":"let","opdef":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]}},"expr":{"id":463,"kind":"app","opcode":"item","args":[{"id":461,"kind":"name","name":"my_tup"},{"id":462,"kind":"int","value":2}]}}},{"id":470,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":470,"kind":"lambda","params":[{"id":466,"name":"s"}],"qualifier":"def","expr":{"id":469,"kind":"app","opcode":"eq","args":[{"id":467,"kind":"name","name":"s"},{"id":468,"kind":"app","opcode":"List","args":[]}]}}},{"id":491,"kind":"assume","name":"positive","assumption":{"id":490,"kind":"app","opcode":"igt","args":[{"id":488,"kind":"name","name":"N"},{"id":489,"kind":"int","value":0}]}},{"id":495,"kind":"assume","name":"_","assumption":{"id":494,"kind":"app","opcode":"neq","args":[{"id":492,"kind":"name","name":"N"},{"id":493,"kind":"int","value":0}]}},{"id":496,"kind":"import","defName":"foo","protoName":"M1"},{"id":497,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":502,"kind":"const","name":"INT_SET"},"id":503},{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},{"id":69,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":69,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":74,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":79,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":81,"name":"__DogParam"}],"qualifier":"def","expr":{"id":83,"kind":"app","opcode":"variant","args":[{"id":80,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":82}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":84,"kind":"const","name":"MyUnionType"},"id":85},{"id":248,"kind":"def","name":"G","qualifier":"def","expr":{"id":248,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":247,"kind":"app","opcode":"and","args":[{"id":244,"kind":"app","opcode":"F","args":[{"id":243,"kind":"name","name":"x"}]},{"id":246,"kind":"app","opcode":"not","args":[{"id":245,"kind":"name","name":"x"}]}]}}},{"id":255,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":255,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":254,"kind":"app","opcode":"and","args":[{"id":251,"kind":"app","opcode":"F","args":[{"id":250,"kind":"name","name":"x"}]},{"id":253,"kind":"app","opcode":"not","args":[{"id":252,"kind":"name","name":"x"}]}]}}},{"id":262,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":262,"kind":"lambda","params":[{"id":256,"name":"x"}],"qualifier":"def","expr":{"id":261,"kind":"app","opcode":"or","args":[{"id":258,"kind":"app","opcode":"F","args":[{"id":257,"kind":"name","name":"x"}]},{"id":260,"kind":"app","opcode":"not","args":[{"id":259,"kind":"name","name":"x"}]}]}}},{"id":352,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":351,"kind":"app","opcode":"map","args":[{"id":335,"kind":"app","opcode":"tuples","args":[{"id":333,"kind":"name","name":"S"},{"id":334,"kind":"name","name":"MySet"}]},{"id":350,"kind":"lambda","params":[{"id":341,"name":"quintTupledLambdaParam341"}],"qualifier":"def","expr":{"id":346,"kind":"let","opdef":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]}},"expr":{"id":342,"kind":"let","opdef":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]}},"expr":{"id":340,"kind":"app","opcode":"iadd","args":[{"id":338,"kind":"name","name":"s"},{"id":339,"kind":"name","name":"mys"}]}}}}]}},{"id":364,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":363,"kind":"let","opdef":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]}},"expr":{"id":362,"kind":"app","opcode":"actionAll","args":[{"id":358,"kind":"app","opcode":"igt","args":[{"id":356,"kind":"name","name":"x"},{"id":357,"kind":"int","value":10}]},{"id":361,"kind":"app","opcode":"assign","args":[{"id":360,"kind":"name","name":"k"},{"id":359,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"82":{"id":81,"name":"__DogParam","kind":"param"},"84":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"153":{"id":152,"name":"x","kind":"param"},"164":{"id":163,"kind":"typedef","name":"PROC"},"174":{"id":172,"name":"x","kind":"param"},"175":{"id":173,"name":"y","kind":"param"},"179":{"id":178,"name":"factor","kind":"param"},"180":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"184":{"id":183,"name":"x","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"189":{"id":188,"name":"x","kind":"param"},"198":{"id":192,"name":"x","kind":"param"},"199":{"id":193,"name":"y","kind":"param"},"206":{"id":202,"name":"x","kind":"param"},"211":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"219":{"id":214,"name":"x","kind":"param"},"220":{"id":216,"name":"y","kind":"param"},"222":{"id":214,"name":"x","kind":"param"},"223":{"id":216,"name":"y","kind":"param"},"240":{"id":239,"name":"x","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"244":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"245":{"id":242,"name":"x","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"251":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"252":{"id":249,"name":"x","kind":"param"},"257":{"id":256,"name":"x","kind":"param"},"258":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"259":{"id":256,"name":"x","kind":"param"},"290":{"id":288,"name":"x","kind":"param"},"293":{"id":289,"name":"y","kind":"param"},"296":{"id":289,"name":"y","kind":"param"},"305":{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},"315":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"319":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"325":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"327":{"id":326,"name":"x","kind":"param"},"333":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"334":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"338":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]},"depth":1},"339":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]},"depth":1},"344":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"348":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"353":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"356":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"359":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"360":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"365":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"373":{"id":372,"name":"x","kind":"param"},"379":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"437":{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]},"depth":0},"452":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]},"depth":1},"461":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]},"depth":1},"467":{"id":466,"name":"s","kind":"param"},"488":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"492":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"502":{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":504,"importedFrom":{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"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":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"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":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"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":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"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":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","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":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 659e2c8fa..54d6d710d 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"80":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"81":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"84":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"85":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"86":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"87":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"88":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"89":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"90":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"91":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"92":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"93":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"94":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"95":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"96":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"97":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"98":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"99":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"100":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"101":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"102":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"103":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"104":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"105":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"106":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"107":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"108":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"109":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"110":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"111":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"112":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"113":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"114":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"115":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"116":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"117":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"118":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"119":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"120":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"121":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"122":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"123":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"124":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"125":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"126":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"127":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"128":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"129":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"130":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"131":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"132":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"133":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"134":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"135":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"136":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"137":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"138":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"139":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"140":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"141":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"142":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"143":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"144":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"146":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"147":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"148":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"149":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"150":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"151":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"152":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"153":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"154":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"156":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"157":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"158":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"159":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"160":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"161":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"162":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"163":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"164":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"165":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"166":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"167":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"168":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"169":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"170":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"171":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"172":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"173":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"174":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"175":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"176":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"177":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"178":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"179":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"180":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"181":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"182":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"183":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"184":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"185":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"186":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"187":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"188":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"189":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"190":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"191":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"192":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"193":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"194":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"195":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"196":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"197":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"198":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"199":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"200":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"201":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"202":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"203":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"204":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"205":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"206":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"207":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"208":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"209":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"210":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"211":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"212":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"213":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"214":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"215":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"216":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"217":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"218":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"219":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"220":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"221":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"222":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"223":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"224":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"225":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"226":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"227":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"228":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"229":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"230":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"231":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"232":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"233":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"234":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"235":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"236":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"237":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"238":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"239":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"240":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"241":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"242":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"243":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"244":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"245":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"246":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"248":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"249":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"250":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"251":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"252":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"253":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"255":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"256":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"257":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"258":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"259":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"260":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"262":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"263":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"264":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"265":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"266":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"267":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"268":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"269":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"270":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"271":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"272":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"273":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"274":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"275":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"276":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"277":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"278":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"279":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"280":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"281":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"282":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"283":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"284":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"285":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"286":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"287":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"288":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"289":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"290":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"291":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"292":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"293":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"294":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"295":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"296":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"297":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"298":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"299":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"300":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"301":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"302":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"303":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"304":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"305":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"306":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"307":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"308":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"309":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"310":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"311":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"312":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"313":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"314":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"315":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"316":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"317":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"318":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"319":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"320":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"321":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"322":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"323":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"324":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"325":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"326":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"327":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"328":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"329":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"330":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"331":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"332":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"333":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"334":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"335":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"336":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"337":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"338":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"339":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"340":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"341":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"342":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"352":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"353":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"354":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"355":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"356":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"357":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"358":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"359":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"360":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"361":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"362":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"363":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"364":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"365":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"366":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"367":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"368":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"369":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"370":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"371":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"372":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"373":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"374":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"375":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"376":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"377":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"378":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"379":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"380":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"381":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"382":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"383":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"384":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"385":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"386":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"387":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"388":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"389":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"390":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"391":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"392":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"393":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"394":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"395":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"396":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"397":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"398":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"399":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"400":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"401":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"402":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"403":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"404":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"405":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"406":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"407":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"408":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"409":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"410":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"411":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"412":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"413":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"414":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"415":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"416":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"417":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"418":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"419":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"420":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"421":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"422":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"423":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"424":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"425":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"426":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"427":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"428":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"429":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"430":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"431":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"432":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"433":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"434":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"435":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"436":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"437":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"438":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"439":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"440":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"441":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"442":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"443":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"444":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"445":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"446":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"447":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"448":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"449":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"450":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"451":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"452":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"453":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"454":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"455":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"456":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"457":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"458":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"459":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"460":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"461":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"462":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"463":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"464":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"465":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"466":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"467":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"468":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"469":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"470":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"471":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"472":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"473":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"474":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"475":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"476":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"477":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"478":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"479":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"480":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"481":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"482":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"483":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"484":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"485":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"486":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"487":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"488":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"489":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"490":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"491":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"492":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"493":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"494":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"495":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"496":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"497":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"498":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"499":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"500":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"501":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"502":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"503":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"504":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"505":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"506":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"507":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index cbab0c26f..67982899d 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":20,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":4,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":8,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":19,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":18,"kind":"app","opcode":"List","args":[{"id":15,"kind":"name","name":"A"},{"id":17,"kind":"app","opcode":"B","args":[{"id":16,"kind":"int","value":2}]}]},"typeAnnotation":{"id":14,"kind":"list","elem":{"id":13,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"13":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"15":{"id":4,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"17":{"id":8,"kind":"def","name":"B","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 566d834ed..9d2b689b9 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"14":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"15":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"16":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"17":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"18":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"19":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"20":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 7236d240c..6ceb3f033 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":38,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":5,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":9,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":9,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]}},{"id":37,"kind":"def","name":"ex","qualifier":"val","expr":{"id":27,"kind":"app","opcode":"matchVariant","args":[{"id":22,"kind":"name","name":"c"},{"id":28,"kind":"str","value":"A"},{"id":29,"kind":"lambda","qualifier":"def","expr":{"id":23,"kind":"int","value":0},"params":[{"name":"_","id":30}]},{"id":31,"kind":"str","value":"B"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":24,"kind":"name","name":"n"},"params":[{"name":"n","id":33}]},{"id":34,"kind":"str","value":"_"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"app","opcode":"iuminus","args":[{"id":25,"kind":"int","value":1}]},"params":[{"name":"_","id":36}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"20":{"id":14,"kind":"def","name":"C","qualifier":"def","expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"22":{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]},"depth":0},"24":{"name":"n","id":33,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index c365ead8e..5a444ca1c 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"20":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"21":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"22":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"23":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"24":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"25":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"26":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"27":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"28":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"29":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"32":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"35":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"38":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file From d95b2992ddbb92965595bfd0be3aa5f4e8bda8ca Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 19:40:33 -0500 Subject: [PATCH 047/428] Revert "Update tests" This reverts commit dc4eb2af173221dfffb54acb4b6f7abb3c3371d8. --- quint/test/types/aliasInliner.test.ts | 2 +- quint/test/types/inferrer.test.ts | 68 ++++++++++++--------------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index d381a681d..3d57494d1 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,9 +71,9 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B({}) | C({})) + | val C: (B({}) | C({})) = variant("C", Rec()) | type T2 = (Some((B({}) | C({}))) | None({})) | val B: (B({}) | C({})) = variant("B", Rec()) - | val C: (B({}) | C({})) = variant("C", Rec()) | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) | var x: (Some((B({}) | C({}))) | None({})) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 83566cd7c..8c496f164 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,15 +5,6 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' -// Utility used to print update `stringType` values to make -// updating the expected values in the following tests less -// painful. -function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { - console.log('[') - stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) - console.log(']') -} - describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -155,19 +146,20 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) assert.sameDeepMembers(stringTypes, [ - [13n, 'str'], - [14n, 'int'], - [15n, '(A(int) | B({}))'], + [14n, 'str'], + [15n, 'int'], [16n, '(A(int) | B({}))'], - [6n, 'int'], - [5n, 'str'], - [7n, 'int'], - [8n, '(A(int) | B({}))'], - [4n, '(int) => (A(int) | B({}))'], + [17n, '(A(int) | B({}))'], [10n, 'str'], [11n, '{}'], [12n, '(B({}) | A(int))'], - [9n, '(B({}) | A(int))'], + [13n, '(B({}) | A(int))'], + [5n, 'int'], + [4n, 'str'], + [6n, 'int'], + [7n, '(A(int) | B({}))'], + [8n, '(int) => (A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], ]) }) @@ -194,34 +186,34 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) - // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [13n, 'str'], - [14n, 'int'], - [15n, '(A(int) | B({}))'], + [14n, 'str'], + [15n, 'int'], [16n, '(A(int) | B({}))'], [17n, '(A(int) | B({}))'], - [23n, 'str'], - [25n, 'int'], - [18n, 'int'], + [10n, 'str'], + [11n, '{}'], + [12n, '(B({}) | A(int))'], + [13n, '(B({}) | A(int))'], + [18n, '(A(int) | B({}))'], + [24n, 'str'], + [26n, 'int'], [19n, 'int'], [20n, 'int'], - [24n, '(int) => int'], - [26n, 'str'], - [28n, '{}'], [21n, 'int'], - [27n, '({}) => int'], + [25n, '(int) => int'], + [27n, 'str'], + [29n, '{}'], [22n, 'int'], - [29n, 'int'], + [28n, '({}) => int'], + [23n, 'int'], + [30n, 'int'], + [5n, 'int'], + [4n, 'str'], [6n, 'int'], - [5n, 'str'], - [7n, 'int'], - [8n, '(A(int) | B({}))'], - [4n, '(int) => (A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [9n, '(B({}) | A(int))'], + [7n, '(A(int) | B({}))'], + [8n, '(int) => (A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], ]) }) From 15586d36be6255adda446c506b06969d6df37ca8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:13:46 -0500 Subject: [PATCH 048/428] Fix id generation for def bodies The lambda's on the right side of operator definitions where getting assigned the same IDs as operator declaration itself, violating our expectation that every IR component will have a uniqe id. --- quint/src/parsing/ToIrListener.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index e684c355e..2186a87e5 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -245,12 +245,11 @@ export class ToIrListener implements QuintListener { } let body = expr - const id = this.getId(ctx) if (params.length > 0) { // if the definition has parameters, introduce a lambda body = { - id, + id: this.getId(ctx), kind: 'lambda', params, qualifier, @@ -258,7 +257,7 @@ export class ToIrListener implements QuintListener { } } const def: QuintOpDef = { - id, + id: this.getId(ctx), kind: 'def', name, qualifier, From 3b02aa9a0faab9813f320d08f5da0990ae4dc106 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:15:10 -0500 Subject: [PATCH 049/428] Add generated updates --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0099unorderedDefs.map.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.map.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_0101noRecursion.map.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1011nameOutOfScope.map.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1014conflictingNames.map.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1030const.map.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1031instance.map.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index e8ae27239..ae6f5ec08 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"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":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"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":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"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":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"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":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","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":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"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":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":223,"name":"x"},{"id":225,"name":"y"}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":234,"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":223,"name":"x","kind":"param"},"229":{"id":225,"name":"y","kind":"param"},"231":{"id":223,"name":"x","kind":"param"},"232":{"id":225,"name":"y","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 54d6d710d..221260965 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 790ad267c..3cc68b30f 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"unorderedDefs","declarations":[{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}}},{"id":5,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}},"depth":0},"8":{"id":6,"name":"x","kind":"param"},"9":{"id":7,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param"},"10":{"id":8,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.map.json b/quint/testFixture/_0099unorderedDefs.map.json index 720b088e1..fb24899a8 100644 --- a/quint/testFixture/_0099unorderedDefs.map.json +++ b/quint/testFixture/_0099unorderedDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"7":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"8":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"9":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"10":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"12":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"7":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"8":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"9":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"10":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"12":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"13":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"14":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index e6c7b5d67..16815402e 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":8,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":8,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"puredef","expr":{"id":7,"kind":"app","opcode":"baz","args":[{"id":6,"kind":"name","name":"x"}]}},"depth":0},"6":{"id":5,"name":"x","kind":"param"},"7":{"id":12,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"foo","args":[{"id":10,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":9,"name":"x","kind":"param"},"11":{"id":4,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param"},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param"},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.map.json b/quint/testFixture/_0100cyclicDefs.map.json index 2e7b86aac..1c3c97576 100644 --- a/quint/testFixture/_0100cyclicDefs.map.json +++ b/quint/testFixture/_0100cyclicDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"6":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"7":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"8":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"9":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"10":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"11":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"12":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"13":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"6":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"7":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"8":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"9":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"10":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"11":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"12":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"13":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"14":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"15":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"16":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index 708652a10..cc35ab29e 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":6,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.map.json b/quint/testFixture/_0101noRecursion.map.json index 0b3104b5e..202f9fe24 100644 --- a/quint/testFixture/_0101noRecursion.map.json +++ b/quint/testFixture/_0101noRecursion.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"8":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 91ca7950d..463c5237d 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"nameOutOfScope","declarations":[{"id":9,"kind":"def","name":"A","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"x"},{"id":7,"kind":"int","value":1}]}},{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.map.json b/quint/testFixture/_1011nameOutOfScope.map.json index 519744a61..c3bd5741b 100644 --- a/quint/testFixture/_1011nameOutOfScope.map.json +++ b/quint/testFixture/_1011nameOutOfScope.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"7":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"8":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"10":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"7":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"8":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"10":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"11":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index 1fb83d48e..c4b48653f 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":19,"name":"conflictingNames","declarations":[{"id":11,"kind":"def","name":"size","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"int","value":0}}},{"id":13,"kind":"typedef","name":"T","type":{"id":12,"kind":"int"}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"str"}},{"id":17,"kind":"def","name":"b","qualifier":"def","expr":{"id":16,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":18,"kind":"import","defName":"b","protoName":"M"},{"id":8,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"}},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"}},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.map.json b/quint/testFixture/_1014conflictingNames.map.json index 0b3e07c7f..fe6459bd3 100644 --- a/quint/testFixture/_1014conflictingNames.map.json +++ b/quint/testFixture/_1014conflictingNames.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"10":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"11":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"12":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"13":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"14":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"15":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"16":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"17":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"18":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"19":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"10":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"11":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"12":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"13":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"14":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"15":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"16":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"17":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"18":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"19":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"20":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"21":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index b18d403e1..7bba23e4b 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":11,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.map.json b/quint/testFixture/_1030const.map.json index 889372b5d..b97f687e8 100644 --- a/quint/testFixture/_1030const.map.json +++ b/quint/testFixture/_1030const.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"12":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 8816ad45f..14ad07a68 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":19,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.map.json b/quint/testFixture/_1031instance.map.json index 257653256..d0f6ed830 100644 --- a/quint/testFixture/_1031instance.map.json +++ b/quint/testFixture/_1031instance.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"19":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 93f7486b6..c36b97412 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"bar","declarations":[{"id":13,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 49dc4b3d3367e575b5d74d2fb8d7074aed536c5b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:44:02 -0500 Subject: [PATCH 050/428] Update tests --- quint/test/effects/modeChecker.test.ts | 24 ++++++++++++------------ quint/test/names/unshadower.test.ts | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/quint/test/effects/modeChecker.test.ts b/quint/test/effects/modeChecker.test.ts index 750f7085f..365a0d7a9 100644 --- a/quint/test/effects/modeChecker.test.ts +++ b/quint/test/effects/modeChecker.test.ts @@ -34,12 +34,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "def operators may only read state variables, but operator `a` updates variables 'x'. Use action instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'def', replacement: 'action' } }, }, ], @@ -71,7 +71,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[12n, 'def']]) + assert.sameDeepMembers([...suggestions.entries()], [[13n, 'def']]) }) it('finds mode errors between pureval and val', () => { @@ -114,12 +114,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 11n, + 12n, { message: "pure def operators may not interact with state variables, but operator `f` reads variables 'y'. Use def instead.", code: 'QNT200', - reference: 11n, + reference: 12n, data: { fix: { kind: 'replace', original: 'pure def', replacement: 'def' } }, }, ], @@ -133,7 +133,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[10n, 'puredef']]) + assert.sameDeepMembers([...suggestions.entries()], [[11n, 'puredef']]) }) it('finds mode errors between val and temporal', () => { @@ -245,12 +245,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'pure val operators may not have parameters, but operator `foo` has 1 parameter. Use pure def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'pure def' } }, }, ], @@ -267,11 +267,11 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'val operators may not have parameters, but operator `foo` has 1 parameter. Use def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'val', replacement: 'def' } }, }, ], @@ -288,12 +288,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "pure val operators may not interact with state variables, but operator `foo` reads variables 'x'. Use def instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'def' } }, }, ], diff --git a/quint/test/names/unshadower.test.ts b/quint/test/names/unshadower.test.ts index 9cf6ce65b..6d4c4f718 100644 --- a/quint/test/names/unshadower.test.ts +++ b/quint/test/names/unshadower.test.ts @@ -34,7 +34,7 @@ describe('unshadowNames', () => { assert.sameDeepMembers(unshadowedModules.map(moduleToString), [ dedent(`module A { - | val b = val a_9 = 1 { a_9 } + | val b = val a_10 = 1 { a_10 } | def f = ((a_5) => igt(a_5, 0)) |}`), dedent(`module B { From 554bb07fc07151fef0c46ca750fa5874318dd800 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:55:58 -0500 Subject: [PATCH 051/428] Update tests with correct ids --- quint/test/types/inferrer.test.ts | 69 ++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 8c496f164..6c7970584 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,6 +5,15 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +// Utility used to print update `stringType` values to make +// updating the expected values in the following tests less +// painful. +function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { + console.log('[') + stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) + console.log(']') +} + describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -25,6 +34,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [2n, 'int'], @@ -36,20 +46,22 @@ describe('inferTypes', () => { [8n, 'int'], [9n, 'int'], [10n, '(int, int) => int'], - [11n, 'int'], + [11n, '(int, int) => int'], [12n, 'int'], [13n, 'int'], [14n, 'int'], [15n, 'int'], - [16n, 'Set[int]'], + [16n, 'int'], [17n, 'Set[int]'], - [18n, 'int'], + [18n, 'Set[int]'], [19n, 'int'], [20n, 'int'], [21n, 'int'], - [22n, '(int) => int'], - [23n, 'Set[int]'], - [24n, '(Set[int]) => Set[int]'], + [22n, 'int'], + [23n, '(int) => int'], + [24n, 'Set[int]'], + [25n, '(Set[int]) => Set[int]'], + [26n, '(Set[int]) => Set[int]'], ]) }) @@ -60,21 +72,24 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ + [7n, '(bool) => int'], + [8n, 'bool'], + [9n, 'bool'], + [10n, 'int'], + [11n, 'bool'], + [12n, 'bool'], + [13n, 'int'], + [14n, 'int'], + [15n, '((bool) => int, bool) => int'], + [16n, '((bool) => int, bool) => int'], [1n, '∀ t0, t1 . (t0) => t1'], [2n, '∀ t0 . t0'], [3n, '∀ t0 . t0'], [4n, '∀ t0 . t0'], [5n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], - [6n, '(bool) => int'], - [7n, 'bool'], - [8n, 'bool'], - [9n, 'int'], - [10n, 'bool'], - [11n, 'bool'], - [12n, 'int'], - [13n, 'int'], - [14n, '((bool) => int, bool) => int'], + [6n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], ]) }) @@ -90,13 +105,14 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [4n, '{ f1: int, f2: bool }'], [5n, '{ f1: int, f2: bool }'], - [6n, 'int'], [7n, 'str'], - [8n, 'bool'], + [6n, 'int'], [9n, 'str'], + [8n, 'bool'], [10n, '{ f1: int, f2: bool }'], [11n, 'Set[{ f1: int, f2: bool }]'], [12n, 'Set[{ f1: int, f2: bool }]'], @@ -108,12 +124,13 @@ describe('inferTypes', () => { [18n, 'int'], [19n, '{ f1: int, f2: bool }'], [20n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], - [21n, 'int'], - [22n, 'str'], - [23n, '{ f1: int }'], - [24n, '{ f1: int, f2: bool }'], - [25n, 'Set[str]'], + [21n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], + [23n, 'str'], + [22n, 'int'], + [24n, '{ f1: int }'], + [25n, '{ f1: int, f2: bool }'], [26n, 'Set[str]'], + [27n, 'Set[str]'], ]) }) @@ -124,6 +141,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, '∀ t0, r0 . (t0 | r0)'], [2n, '∀ t0, t1, r0 . (t0, t1 | r0)'], @@ -135,6 +153,7 @@ describe('inferTypes', () => { [8n, '∀ t0 . t0'], [9n, '∀ t0, t1 . (t0, t1)'], [10n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], + [11n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], ]) }) @@ -313,7 +332,7 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) - assert.includeDeepMembers(stringTypes, [[14n, '(str) => bool']]) + assert.includeDeepMembers(stringTypes, [[15n, '(str) => bool']]) }) it('considers annotations', () => { @@ -323,10 +342,12 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [5n, 'int'], [6n, '(int) => int'], + [7n, '(int) => int'], ]) }) @@ -337,6 +358,7 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, '(int -> str)'], [6n, '(int -> str)'], @@ -345,6 +367,7 @@ module B { [9n, 'int'], [10n, 'int'], [12n, '((int -> str)) => int'], + [13n, '((int -> str)) => int'], ]) }) From d0bc358ac1f0718989b92af4687a095bbc7871f2 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 21:01:03 -0500 Subject: [PATCH 052/428] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1b1c8d34..63871c6ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 and `import (...)` (#1276) - Fix incorrect type checking failure from interference between sum types sharing variant labels (#1275) +- Fix the IDs generated for operator definition bodies (#1280) ### Security From d32f99b78e87a9923b814b90e1684c7b4a274f55 Mon Sep 17 00:00:00 2001 From: ivan-gavran Date: Fri, 1 Dec 2023 16:09:16 +0100 Subject: [PATCH 053/428] added defs to extract values of a map as a set and as a list --- examples/spells/commonSpells.qnt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index 7205ec954..49a8c5f42 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -17,4 +17,34 @@ module commonSpells { assert(setSum(2.to(4)) == 9), assert(setSum(Set(-4, 4, 5)) == 5), } + + /// Get the set of values of a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the set of all values in the map + pure def mapValuesSet(__map: a -> b): Set[b] = { + __map.keys().map(k => __map.get(k)) + } + + run mapValuesSetTest = all { + assert(mapValuesSet(Map()) == Set()), + assert(mapValuesSet(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), + assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), + } + + /// Get the list of values from a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the list of all values in the map + pure def mapValuesList(__map: a -> b): List[b] = { + __map.keys().fold([], (__list, __k) => __list.append(__map.get(__k))) + } + + run mapValuesListTest = all { + assert(mapValuesList(Map()) == []), + assert(mapValuesList(Map(1 -> 2, 2 -> 3)) == [2, 3]), + assert(mapValuesList(Map(1 -> 2, 2 -> 3, 3 -> 2)) == [2,3,2]), + } + + } \ No newline at end of file From 2e821ec617df4122e5351ab71c65c21e3a899350 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:39:45 -0500 Subject: [PATCH 054/428] Add support for variants in ITF Closes #1281 --- quint/io-cli-tests.md | 16 ++++++++++++++++ quint/src/itf.ts | 16 ++++++++++++++++ quint/test/itf.test.ts | 2 ++ 3 files changed, 34 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 994c74d23..2c3820387 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1055,3 +1055,19 @@ rm firstTest.itf.json secondTest.itf.json [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"1"}}] [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"2"}}] ``` + +### Variants are supported in ITF + +See [#1281](https://github.com/informalsystems/quint/issues/1281) + + +``` +quint test --output {}.itf.json ./testFixture/_1054sumTypesInItf.qnt >/dev/null +cat xTest.itf.json | jq -c .states +rm xTest.itf.json +``` + + +``` +[{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] +``` diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 7cd3199a5..48b9d969b 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -14,6 +14,7 @@ import { chunk } from 'lodash' import { QuintApp, QuintStr } from './ir/quintIr' import { QuintEx } from './ir/quintIr' +import { unreachable } from './util' /** The type of IFT traces. * See https://github.com/informalsystems/apalache/blob/main/docs/src/adr/015adr-trace.md */ @@ -42,6 +43,7 @@ export type ItfValue = | ItfMap | ItfUnserializable | ItfRecord + | ItfVariant type ItfBigint = { '#bigint': string } type ItfTup = { '#tup': ItfValue[] } @@ -49,6 +51,7 @@ type ItfSet = { '#set': ItfValue[] } type ItfMap = { '#map': [ItfValue, ItfValue][] } type ItfUnserializable = { '#unserializable': string } type ItfRecord = { [index: string]: ItfValue } +type ItfVariant = { tag: ItfValue; value: ItfValue } // Type predicates to help with type narrowing function isBigint(v: ItfValue): v is ItfBigint { @@ -67,6 +70,10 @@ function isMap(v: ItfValue): v is ItfMap { return (v as ItfMap)['#map'] !== undefined } +function isVariant(v: ItfValue): v is ItfVariant { + return (v as ItfVariant)['tag'] !== undefined +} + function isUnserializable(v: ItfValue): v is ItfUnserializable { return (v as ItfUnserializable)['#unserializable'] !== undefined } @@ -140,11 +147,16 @@ export function toItf(vars: string[], states: QuintEx[]): Either ({ tag: label, value: value })) + default: + // TODO unreachable(ex) return left(`Unexpected operator type: ${ex.opcode}`) } default: + // TODO unreachable(ex) return left(`Unexpected expression kind: ${ex.kind}`) } } @@ -209,6 +221,10 @@ export function ofItf(itf: ItfTrace): QuintEx[] { opcode: 'Map', args, } + } else if (isVariant(value)) { + const l = ofItfValue(value.tag) + const v = ofItfValue(value.value) + return { id, kind: 'app', opcode: 'variant', args: [l, v] } } else if (typeof value === 'object') { // Any other object must represent a record // For each key/value pair in the object, form the quint expressions representing diff --git a/quint/test/itf.test.ts b/quint/test/itf.test.ts index 1f1a622f2..507e8a23a 100644 --- a/quint/test/itf.test.ts +++ b/quint/test/itf.test.ts @@ -47,6 +47,7 @@ describe('toItf', () => { g: Map(1 -> "a", 2 -> "b", 3 -> "c"), h: Map(), i: Map(1 -> "a"), + j: variant("A", 2) } ` const trace = [buildExpression(text)] @@ -74,6 +75,7 @@ describe('toItf', () => { }, h: { '#map': [] }, i: { '#map': [[{ '#bigint': '1' }, 'a']] }, + j: { tag: 'A', value: { '#bigint': '2' } }, }, ], } From 9ccabd0b6992fd2b0a39fcc9b3c1b8437339a254 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:41:30 -0500 Subject: [PATCH 055/428] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63871c6ee..197872a08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix incorrect type checking failure from interference between sum types sharing variant labels (#1275) - Fix the IDs generated for operator definition bodies (#1280) +- Fixed missing support for sum type variants in ITF traces (#1281) ### Security From e6074ede66a52b1150a5f6e5a09b4851280f8bed Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:43:05 -0500 Subject: [PATCH 056/428] Remove out of place TODOs --- quint/src/itf.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 48b9d969b..525d28989 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -14,7 +14,6 @@ import { chunk } from 'lodash' import { QuintApp, QuintStr } from './ir/quintIr' import { QuintEx } from './ir/quintIr' -import { unreachable } from './util' /** The type of IFT traces. * See https://github.com/informalsystems/apalache/blob/main/docs/src/adr/015adr-trace.md */ @@ -151,12 +150,10 @@ export function toItf(vars: string[], states: QuintEx[]): Either ({ tag: label, value: value })) default: - // TODO unreachable(ex) return left(`Unexpected operator type: ${ex.opcode}`) } default: - // TODO unreachable(ex) return left(`Unexpected expression kind: ${ex.kind}`) } } From 18065647bff0499e0bbee401f62b4547228cc9fe Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 14:59:32 -0500 Subject: [PATCH 057/428] Commit missing test fixcture --- quint/testFixture/_1054sumTypesInItf.qnt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 quint/testFixture/_1054sumTypesInItf.qnt diff --git a/quint/testFixture/_1054sumTypesInItf.qnt b/quint/testFixture/_1054sumTypesInItf.qnt new file mode 100644 index 000000000..c5445f2a9 --- /dev/null +++ b/quint/testFixture/_1054sumTypesInItf.qnt @@ -0,0 +1,9 @@ +// Regression test for https://github.com/informalsystems/quint/issues/1281 +// ITF export did not have support for sum types +module sum { + type T = None | Some(int) + var x: T + action init = x' = None + action step = x' = match x { None => Some(1) | Some(n) => Some(n+1) } + run xTest = init.then(step).then(step).then(step) +} From d85ad63e011d72b0a4068007b3525fc8d1ac6538 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 24 Nov 2023 13:32:24 -0500 Subject: [PATCH 058/428] Use sum types for tictactoe example --- examples/puzzles/tictactoe/tictactoe.qnt | 72 ++++++++++++++---------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/puzzles/tictactoe/tictactoe.qnt index e609ec131..31aa6fdd4 100644 --- a/examples/puzzles/tictactoe/tictactoe.qnt +++ b/examples/puzzles/tictactoe/tictactoe.qnt @@ -12,10 +12,14 @@ * Gabriela Moreira, Informal Systems, 2022-2023 */ module tictactoe { + type Player = X | O + type Square = Occupied(Player) | Empty + /// A 3x3 tic-tac-toe board - var board: int -> (int -> str) + var board: int -> (int -> Square) + /// Who goes next - var nextTurn: str + var nextTurn: Player pure val boardCoordinates = tuples(1.to(3), 1.to(3)) @@ -40,33 +44,41 @@ module tictactoe { (3,3) ) - def hasValue(coordinate, player) = - board.get(coordinate._1).get(coordinate._2) == player + def square(coordinate: (int, int)): Square = + board.get(coordinate._1).get(coordinate._2) - def isEmpty(coordinate) = hasValue(coordinate, "_") + def hasPlayer(coordinate, player) = match square(coordinate) { + | Empty => false + | Occupied(p) => player == p + } + + def isEmpty(coordinate) = match square(coordinate) { + | Empty => true + | Occupied(_) => false + } val boardEmpty = boardCoordinates.forall(isEmpty) def won(player) = winningPatterns.exists(pattern => - pattern.forall(coordinate => hasValue(coordinate, player)) + pattern.forall(coordinate => hasPlayer(coordinate, player)) ) val boardFull = not(boardCoordinates.exists(isEmpty)) - val stalemate = boardFull and not(won("X")) and not(won("O")) - val gameOver = won("X") or won("O") or boardFull + val stalemate = boardFull and not(won(X)) and not(won(O)) + val gameOver = won(X) or won(O) or boardFull def canWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canBlockWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("O")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(O)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canSetupWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 1, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 1, pattern.filter(coordinate => coordinate.isEmpty()).size() == 2, } @@ -79,7 +91,7 @@ module tictactoe { isEmpty(coordinate), board' = board.setBy( coordinate._1, - row => row.set(coordinate._2, player) + row => row.set(coordinate._2, Occupied(player)) ), } @@ -87,22 +99,22 @@ module tictactoe { canWin, nondet pattern = winningPatterns.filter(canWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action Block = all { canBlock, nondet pattern = winningPatterns.filter(canBlockWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } - action TakeCenter = Move("X", (2, 2)) + action TakeCenter = Move(X, (2, 2)) action SetupWin = all { nondet pattern = winningPatterns.filter(canSetupWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action MoveToEmpty(player) = @@ -111,32 +123,32 @@ module tictactoe { action StartInCorner = nondet corner = oneOf(corners) - Move("X", corner) + Move(X, corner) action MoveX = all { - nextTurn == "X", - not(won("O")), + nextTurn == X, + not(won(O)), if (boardEmpty) StartInCorner else if (canWin) Win else if (canBlock) Block else if (canTakeCenter) TakeCenter else if (canSetupWin) SetupWin else - MoveToEmpty("X"), - nextTurn' = "O", + MoveToEmpty(X), + nextTurn' = O, } action MoveO = all { - nextTurn == "O", - not(won("X")), - MoveToEmpty("O"), - nextTurn' = "X", + nextTurn == O, + not(won(X)), + MoveToEmpty(O), + nextTurn' = X, } action init = all { // X always goes first - nextTurn' = "X", + nextTurn' = X, // Every space in the board starts blank - board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => "_")), + board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => Empty)), } /// Either X or O will make a move, depending on the value of `nextTurn` @@ -150,10 +162,10 @@ module tictactoe { /* Invariants */ /// X has not won. This does not hold, as X wins most of the times. - val XHasNotWon = not(won("X")) + val XHasNotWon = not(won(X)) /// O has not won. This should hold, as O can only achieve a draw. - val OHasNotWon = not(won("O")) + val OHasNotWon = not(won(O)) /// It's not a stalemate if one player has won or the board is not filled /// Check with `quint run --invariant=NotStalemate tictactoe.qnt` @@ -166,5 +178,5 @@ module tictactoe { /// This is not always true, as if O picks the right moves, the game will /// result in a stalemate. - temporal XMustEventuallyWin = eventually(won("X")) + temporal XMustEventuallyWin = eventually(won(X)) } From f0f26b0fb17557733abd7a3250417ac56899371e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:55:44 -0500 Subject: [PATCH 059/428] Update Apalache version --- quint/src/quintVerifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 1f724ff16..d1e943206 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.42.0' +const APALACHE_VERSION_TAG = '0.44.2' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From d8fdf128f1dcb81bce5203d9d42ca8449403590a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:58:40 -0500 Subject: [PATCH 060/428] Update option.qnt for verification Use current conventions for operator names --- examples/language-features/option.qnt | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 1be3c5801..871eda916 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -2,41 +2,40 @@ module option { // A demonstration of sum types, specifying an option type. // An option type for int values. - // Polymorphic sum types are not yet supported: https://github.com/informalsystems/quint/issues/1073 - type Vote_option = + type VoteOption = | None | Some(int) - var votes: List[Vote_option] + var votes: List[VoteOption] var outcome: int - action Init = all { + action init = all { votes' = [], outcome' = 0 } - action Vote(v) = { + action vote(v) = { votes' = votes.append(Some(v)) } - action Unvote(i) = all { + action unvote(i) = all { votes[i] != None, votes' = votes.replaceAt(i, None), } - val SumVotes = - votes.foldl(0, (sum, vote) => match vote { - | Some(v) => sum + v + val sumVotes = + votes.foldl(0, (sum, v) => match v { + | Some(n) => sum + n | None => sum } ) - action Next = all { + action step = all { any { - nondet v = oneOf(Int); Vote(v), - nondet i = oneOf(votes.indices()); Unvote(i), + nondet v = oneOf(Int); vote(v), + nondet i = oneOf(votes.indices()); unvote(i), }, - outcome' = SumVotes + outcome' = sumVotes } run matchWithDefaultTest = { From a32a6310de265924a7f827e51c69f4e2b7803517 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 11:09:02 -0500 Subject: [PATCH 061/428] Update examples script --- examples/.scripts/run-example.sh | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 50458eeee..92dc211d8 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -40,20 +40,24 @@ result () { # Run the command and record success / failure local quint_cmd="quint $cmd $args $file" + local succeeded=false if ($quint_cmd &> /dev/null) then printf ":white_check_mark:" + succeeded=true else printf ":x:" + succeeded=false fi - # Print additional explanations - if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1019" + # We only want to print additional info to annotate failing results + if [[ $succeeded == false ]]; then + # Print additional explanations + if [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1285" + elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1284" + fi fi } @@ -118,6 +122,8 @@ get_verify_args () { args="--init=n4_f1::Init --step=n4_f1::Next --invariant=n4_f1::Agreement" elif [[ "$file" == "cosmos/ics23/ics23.qnt" ]] ; then args="--init=Init --step=Next" + elif [[ "$file" == "puzzles/tictactoe/tictactoe.qnt" ]] ; then + args="--max-steps=1" # pretty slow, and we just want to check that verification can run fi echo "${args}" } From f53a6c3d5bc966fc0e811dfee8285d4e813544a6 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 11:11:31 -0500 Subject: [PATCH 062/428] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 197872a08..6c590d35e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - When an input file only one module, it will be inferred as the main module (#1260) +- Sum types are now supported when running `verify` (#1034) ### Changed ### Deprecated From be9a510723dc2121ec05786c4ce5440d623cf9ae Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 17:54:17 -0500 Subject: [PATCH 063/428] Use a default case in the tictactoe example Ensure we can handle this construct in verification, and it also clarifies the meaning of the operator tweaked. --- examples/puzzles/tictactoe/tictactoe.qnt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/puzzles/tictactoe/tictactoe.qnt index 31aa6fdd4..4c272e087 100644 --- a/examples/puzzles/tictactoe/tictactoe.qnt +++ b/examples/puzzles/tictactoe/tictactoe.qnt @@ -53,8 +53,8 @@ module tictactoe { } def isEmpty(coordinate) = match square(coordinate) { - | Empty => true - | Occupied(_) => false + | Empty => true + | _ => false } val boardEmpty = boardCoordinates.forall(isEmpty) From f0f0c3e87482e6e76d19509fbadaa4fc83d9dd67 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 18:29:09 -0500 Subject: [PATCH 064/428] Update examples dashboard --- examples/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/README.md b/examples/README.md index 2e536ee2b..ce21160a1 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,7 +51,7 @@ listed without any additional command line arguments. | [classic/distributed/ClockSync/clockSync3.qnt](./classic/distributed/ClockSync/clockSync3.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/ewd840/ewd840.qnt](./classic/distributed/ewd840/ewd840.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/LamportMutex/LamportMutex.qnt](./classic/distributed/LamportMutex/LamportMutex.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1284 | | [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -80,7 +80,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -90,7 +90,7 @@ listed without any additional command line arguments. | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1019 | +| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1285 | | [solidity/SimpleAuction/SimpleAuction.qnt](./solidity/SimpleAuction/SimpleAuction.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [solidity/SimplePonzi/simplePonzi.qnt](./solidity/SimplePonzi/simplePonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [spells/basicSpells.qnt](./spells/basicSpells.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From c53b2ca7a1d3dbc7657f0cc42be63b6c0ba5675a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 18:30:49 -0500 Subject: [PATCH 065/428] Update feature table --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2deffd5cd..d163e4fd8 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ completely implementing every pass. | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [1034][] | :x: | +| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | From 9ffbcc1bc9b83e9ada3cf725a4fe9d7a499572b1 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 4 Dec 2023 10:25:06 -0300 Subject: [PATCH 066/428] Reorganize and rename --- .../TwoPhaseCommit/two_phase_commit.qnt | 124 +++++++++--------- 1 file changed, 60 insertions(+), 64 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 4d2bf1076..48410ce24 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -6,115 +6,111 @@ https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ module two_phase_commit { - type ResourceManagerState = Working | Prepared | Committed | Aborted - var resourceManagerStates: str -> ResourceManagerState - - type TransactionManagerState = Init | Done - var transactionManagerState: TransactionManagerState - - /// The set of resource managers from which the transaction manager has - /// received RMPrepared messages - var preparedResourceManagers: Set[str] + const resourceManagers: Set[str] + type ResourceManagerState = Working | Prepared | Committed | Aborted + type TransactionManagerState = Init | TMCommitted | TMAborted type Message = | Abort | Commit | RMPrepared(str) - | RMCommitted(str) + var RM::states: str -> ResourceManagerState + var TM::state: TransactionManagerState + /// The set of resource managers from which the transaction manager has + /// received RMPrepared messages + var TM::preparedRMs: Set[str] var messages: Set[Message] - const resourceManagers: Set[str] - action init = all { - resourceManagerStates' = resourceManagers.mapBy(r => Working), - transactionManagerState' = Init, - preparedResourceManagers' = Set(), + RM::states' = resourceManagers.mapBy(r => Working), + TM::state' = Init, + TM::preparedRMs' = Set(), messages' = Set(), } - /* Transaction Manager actions */ + /* Transaction Manager (TM) actions */ /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm - action addPreparedResourceManager(resourceManager: str): bool = all { - transactionManagerState == Init, + action TM::addPreparedResourceManager(resourceManager: str): bool = all { + TM::state == Init, messages.contains(RMPrepared(resourceManager)), - preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) + TM::preparedRMs' = TM::preparedRMs.union(Set(resourceManager)) } /// The transaction manager commits the transaction; enabled iff the /// transaction manager is in its initial state and every resource manager has /// sent an RMPrepared message. - action decideOnCommit = all { - transactionManagerState == Init, - preparedResourceManagers == resourceManagers, - transactionManagerState' = Done, + action TM::decideOnCommit = all { + TM::state == Init, + TM::preparedRMs == resourceManagers, + TM::state' = TMCommitted, messages' = messages.union(Set(Commit)) } /// The transaction manager spontaneously aborts the transaction - action decideOnAbort = all { - transactionManagerState == Init, - transactionManagerState' = Done, + action TM::decideOnAbort = all { + TM::state == Init, + TM::state' = TMAborted, messages' = messages.union(Set(Abort)) } - /* Resource Manager actions */ + /* Resource Manager (RM) actions */ /// A resource manager prepares - action prepare(resourceManager: str): bool = all { - resourceManagerStates.get(resourceManager) == Working, - resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), + action RM::prepare(resourceManager: str): bool = all { + RM::states.get(resourceManager) == Working, + RM::states' = RM::states.set(resourceManager, Prepared), messages' = messages.union(Set(RMPrepared(resourceManager))) } /// A resource manager aborts, either spontaneously or because of an Abort message - action abort(resourceManager: str): bool = all { + action RM::abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort - resourceManagerStates.get(resourceManager) == Working, + RM::states.get(resourceManager) == Working, // Resource manager receives an abort message from the transaction manager messages.contains(Abort), }, - resourceManagerStates' = resourceManagerStates.set(resourceManager, Aborted), + RM::states' = RM::states.set(resourceManager, Aborted), // There is no need to let others know that this resource manager aborted messages' = messages } // A resource manager commits due to a Commit message - action commit(resourceManager: str): bool = all { + action RM::commit(resourceManager: str): bool = all { messages.contains(Commit), - resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), - messages' = messages.union(Set(RMCommitted(resourceManager))) + RM::states' = RM::states.set(resourceManager, Committed), + messages' = messages } action step = any { // Resource manager actions all { nondet rm = resourceManagers.oneOf() - any { prepare(rm), abort(rm), commit(rm) }, - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + any { RM::prepare(rm), RM::abort(rm), RM::commit(rm) }, + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }, // Transaction manager decisions (commit or abort) all { - any { decideOnCommit, decideOnAbort }, - preparedResourceManagers' = preparedResourceManagers, - resourceManagerStates' = resourceManagerStates, + any { TM::decideOnCommit, TM::decideOnAbort }, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, }, // Transaction managers message consumption all { nondet rm = resourceManagers.oneOf() - addPreparedResourceManager(rm), - transactionManagerState' = transactionManagerState, - resourceManagerStates' = resourceManagerStates, + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, messages' = messages, } } /// Two resource managers have not arrived at conflicting decisions val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => - not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) + not(RM::states.get(r1) == Committed and RM::states.get(r2) == Aborted) ) } @@ -124,34 +120,34 @@ module two_phase_commit_3 { /// Compose two actions: send an RMPrepare message and consume it in the /// transaction manager run preparation(rm) = (all { - prepare(rm), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::prepare(rm), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - addPreparedResourceManager(rm), - transactionManagerState' = transactionManagerState, - resourceManagerStates' = resourceManagerStates, + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, messages' = messages, }) /// Compose several actions: The transaction manager decides to commit and /// each resource manager consumes its Commit message run commitment = (all { - decideOnCommit, - preparedResourceManagers' = preparedResourceManagers, - resourceManagerStates' = resourceManagerStates, + TM::decideOnCommit, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, }).then(all { - commit("rm1"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm1"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - commit("rm2"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm2"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - commit("rm3"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm3"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }) run successTest = init From 94b157ab390db0aa6ba4e3317658bd8fbebb9f1f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 4 Dec 2023 08:27:29 -0500 Subject: [PATCH 067/428] Release v0.17.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c590d35e..02a05e100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.17.0 -- 2023-12-04 + ### Added - When an input file only one module, it will be inferred as the main module (#1260) diff --git a/quint/package-lock.json b/quint/package-lock.json index ea6cc8d5b..d66e8796f 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index aa62d0ed6..7b842dc2c 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index c65c1066d..284f13832 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.16.0' +export const version = '0.17.0' From 5432659fd9428ea5810ca02bba6afc66434f9f10 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 4 Dec 2023 08:54:17 -0500 Subject: [PATCH 068/428] VSCode Release v0.12.0 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 616b0a70b..97a588463 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.0 -- 2023-12-04 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.11.0 -- 2023-11-20 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 595989342..c9bb1c311 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.12.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index f81ecb1a4..3e20a17c5 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,7 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "version": "0.11.0", + "version": "0.12.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 61fca0374..2c19d25c0 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.12.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.17.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", + "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", + "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index c7c1beaea..c8108aa0a 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.11.0", + "version": "0.12.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.17.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 7af80227d819804b1fa05540258bd693f131adf6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 4 Dec 2023 18:32:11 -0300 Subject: [PATCH 069/428] Add namespaces to effects referring to instantiated names --- quint/src/effects/inferrer.ts | 14 +++++- quint/src/effects/namespaces.ts | 63 +++++++++++++++++++++++++++ quint/test/effects/namespaces.test.ts | 16 +++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 quint/src/effects/namespaces.ts create mode 100644 quint/test/effects/namespaces.test.ts diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index 127620a49..37a8b99f0 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -38,6 +38,7 @@ import { getSignatures, standardPropagation } from './builtinSignatures' import { FreshVarGenerator } from '../FreshVarGenerator' import { effectToString } from './printing' import { zip } from 'lodash' +import { addNamespaces } from './namespaces' export type EffectInferenceResult = [Map, Map] @@ -366,7 +367,18 @@ export class EffectInferrer implements IRVisitor { } return this.fetchResult(id).map(e => { - return this.newInstance(e) + const effect = this.newInstance(e) + if (def.importedFrom?.kind === 'instance') { + // Names imported from instances might have effects that refer to + // names that are shared between multiple instances. To properly infer + // effects refering to those state variables, they need to be + // namespaced in a way that makes them different between different + // instances. For that, we use the namespaces attribute from lookup + // table definition, which contains the proper namespaces to identify + // unique names while flattening. + return addNamespaces(effect, def.namespaces ?? []) + } + return effect }) } } diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts new file mode 100644 index 000000000..cc8cc6d97 --- /dev/null +++ b/quint/src/effects/namespaces.ts @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Updating effects with namespaces for state variables. To be used when a module with variables is instantiated. + * + * @author Gabriela Moreira + * + * @module + */ +import { Effect, Entity } from './base' + +/** + * Adds a namespace, in the format of the namespaces attribute in LookupDefinition, to all state variables in an effect. + * + * @param effect - The effect to add the namespaces to + * @param namespaces - The namespaces to add + * + * @return The effect with namespaces added to all state variables + */ +export function addNamespaces(effect: Effect, namespaces: string[]): Effect { + switch (effect.kind) { + case 'variable': { + return effect + } + case 'arrow': { + return { + ...effect, + params: effect.params.map(p => addNamespaces(p, namespaces)), + result: addNamespaces(effect.result, namespaces), + } + } + case 'concrete': { + return { + ...effect, + components: effect.components.map(c => ({ ...c, entity: addNamespacesToEntity(c.entity, namespaces) })), + } + } + } +} + +function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { + switch (entity.kind) { + case 'variable': { + return entity + } + case 'union': { + return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } + } + case 'concrete': { + return { + ...entity, + stateVariables: entity.stateVariables.map(v => ({ + ...v, + name: [...namespaces].reverse().concat(v.name).join('::'), + })), + } + } + } +} diff --git a/quint/test/effects/namespaces.test.ts b/quint/test/effects/namespaces.test.ts new file mode 100644 index 000000000..5bb508fc0 --- /dev/null +++ b/quint/test/effects/namespaces.test.ts @@ -0,0 +1,16 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { effectToString } from '../../src/effects/printing' +import { parseEffectOrThrow } from '../../src/effects/parser' +import { addNamespaces } from '../../src/effects/namespaces' + +describe('addNamespace', () => { + it('adds namespaces to state variable names', () => { + const namespaces = ['Second', 'First'] + const effect = parseEffectOrThrow("Read['x'] & Update[e0, 'y']") + + const result = addNamespaces(effect, namespaces) + + assert.deepEqual(effectToString(result), "Read['First::Second::x'] & Update[e0, 'First::Second::y']") + }) +}) From 755fab6e2f7060a9420cfb9b8d7ccc3262cdbef6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:39:46 +0100 Subject: [PATCH 070/428] Move `debug` built-in to the `q::` namespace --- doc/builtin.md | 6 +++--- quint/io-cli-tests.md | 4 ++-- quint/src/builtin.qnt | 6 +++--- quint/src/effects/builtinSignatures.ts | 2 +- quint/src/ir/quintIr.ts | 2 +- quint/src/names/base.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 19 ++++++++++--------- quint/test/runtime/compile.test.ts | 6 +++--- 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/doc/builtin.md b/doc/builtin.md index fbc2c3726..520baf810 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -908,9 +908,9 @@ action Next = x' = x + 1 run test = Init.then(all { Next, assert(x > 0) }) ``` -## `pure def debug: (str, a) => a` +## `pure def q::debug: (str, a) => a` -`debug(msg, value)` prints the given message and value to the console, +`q::debug(msg, value)` prints the given message and value to the console, separated by a space. It also returns the given value unchanged, @@ -920,7 +920,7 @@ so that it can be used directly within expressions. ``` var x: int ->>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) +>>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) > new x: 1 > new x: 2 > new x: 3 diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 2d1662ad3..ab8fbe7aa 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -992,12 +992,12 @@ exit $exit_code >>> ``` -### Invoking `debug` in REPL prints values to stdout +### Invoking `q::debug` in REPL prints values to stdout ``` -echo 'debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 +echo 'q::debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 ``` diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index e38fa4203..0f39c3914 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -835,7 +835,7 @@ module builtin { /// ``` action assert(p): (bool) => bool - /// `debug(msg, value)` prints the given message and value to the console, + /// `q::debug(msg, value)` prints the given message and value to the console, /// separated by a space. /// /// It also returns the given value unchanged, @@ -845,13 +845,13 @@ module builtin { /// /// ``` /// var x: int - /// >>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) + /// >>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) /// > new x: 1 /// > new x: 2 /// > new x: 3 /// true /// ``` - pure def debug(msg, value): (str, a) => a + pure def q::debug(msg, value): (str, a) => a // /// `List(e0, ..., en)` is a list of values `e0`, ..., `en`. // /// diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index 0b87f6429..228e2d91d 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -222,7 +222,7 @@ const otherOperators = [ { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, - { name: 'debug', effect: propagateComponents(['read'])(2) }, + { name: 'q::debug', effect: propagateComponents(['read'])(2) }, { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index c7ba00761..b7f11cb0a 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -140,7 +140,6 @@ export const builtinOpCodes = [ 'chooseSome', 'concat', 'contains', - 'debug', 'enabled', 'eq', 'eventually', @@ -193,6 +192,7 @@ export const builtinOpCodes = [ 'put', 'q::test', 'q::testOnce', + 'q::debug', 'range', 'replaceAt', 'reps', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index fc26943ef..144a8437f 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -196,7 +196,6 @@ export const builtinNames = [ 'reps', 'fail', 'assert', - 'debug', 'orKeep', 'mustChange', 'enabled', @@ -236,4 +235,5 @@ export const builtinNames = [ 'difference', 'matchVariant', 'variant', + 'q::debug', ] diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 496664b68..1be60b3b5 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -914,15 +914,6 @@ export class CompilerVisitor implements IRVisitor { this.translateAllOrThen(app) break - case 'debug': - this.applyFun(app.id, 2, (msg, value) => { - let columns = terminalWidth() - let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) - console.log('>', msg.toStr(), valuePretty.toString()) - return just(value) - }) - break - case 'fail': this.applyFun(app.id, 1, result => { return just(rv.mkBool(!result.toBool())) @@ -953,6 +944,16 @@ export class CompilerVisitor implements IRVisitor { this.testOnce(app.id) break + case 'q::debug': + this.applyFun(app.id, 2, (msg, value) => { + let columns = terminalWidth() + let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) + console.log('>', msg.toStr(), valuePretty.toString()) + return just(value) + }) + break + + // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 733d3fe4e..1d86cafc3 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,11 +978,11 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) - it('debug', () => { - // `debug(s, a)` returns `a` + it('q::debug', () => { + // `q::debug(s, a)` returns `a` const input = dedent( `var n: int - |run run1 = (n' = 1).then(n' = debug("n plus one", n + 1)) + |run run1 = (n' = 1).then(n' = q::debug("n plus one", n + 1)) ` ) From db48556355eb246a473f7a62deec289288592d89 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:43:32 +0100 Subject: [PATCH 071/428] Fix missing namespace in signature --- quint/src/types/builtinSignatures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 37aa21e2f..5e2b2499e 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -125,7 +125,7 @@ const otherOperators = [ { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, - { name: 'debug', type: '(str, a) => a' }, + { name: 'q::debug', type: '(str, a) => a' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { From a95e4956e5d3d090184fcb73e0e126d475f6198c Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:45:30 +0100 Subject: [PATCH 072/428] Formatting --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1be60b3b5..9f720e1d3 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -953,7 +953,6 @@ export class CompilerVisitor implements IRVisitor { }) break - // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': From 23daf370b23123e99c388a32d4b73bb604849d28 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:13:59 -0300 Subject: [PATCH 073/428] Add integration test using exisiting `intances.qnt` example --- examples/language-features/instances.qnt | 21 +++++++++++++++++++-- quint/cli-tests.md | 5 +++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/examples/language-features/instances.qnt b/examples/language-features/instances.qnt index e46043a44..34ce66d9d 100644 --- a/examples/language-features/instances.qnt +++ b/examples/language-features/instances.qnt @@ -7,6 +7,13 @@ module A { pure def g(b) = not(b) } +module withVar { + const N: int + var counter: int + + action init = counter' = 0 +} + module instances { pure val MyY = true pure val z = "world" @@ -24,6 +31,16 @@ module instances { // the above is equivalent to TLA+'s instance: // A2 == INSTANCE A WITH x <- 15, y <- MyY - action init = true - action step = true + // module withVar has state variables + import withVar(N=1) as V1 + import withVar(N=2) as V2 + + action init = all { V1::init, V2::init } + action step = all { + V1::counter' = V1::counter + 1, + V2::counter' = V2::counter + 2, + } + + // The two variables should increment independently + val inv = V1::counter == 0 or V2::counter > V1::counter } diff --git a/quint/cli-tests.md b/quint/cli-tests.md index a722e7ce2..d06b2c363 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -99,6 +99,11 @@ This example was pointing to Paxos. Now it does not typecheck. quint typecheck ../examples/language-features/instances.qnt +### OK on run instances + + + quint run ../examples/language-features/instances.qnt --invariant=inv + ### OK on parse instancesFrom From 8d37d1a9d01ee3e7afa735fa38f580896ec6c9a2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:15:24 -0300 Subject: [PATCH 074/428] Fix bug in `run` where some specs were incorrectly parsed after adding extra defs --- quint/src/simulation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 7282b6d2e..61e998c1d 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -97,7 +97,7 @@ export function compileAndRun( ] // Construct the modules' code, adding the extra definitions to the main module - const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + extraDefs.join('\n') + const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + '\n' + extraDefs.join('\n') const codeWithExtraDefs = code.slice(0, mainStart) + newMainModuleCode + code.slice(mainEnd) const recorder = newTraceRecorder(options.verbosity, options.rng) From d12f6c637359181f013de0850b1c32e6132b0205 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:25:14 -0300 Subject: [PATCH 075/428] Add CHANGELOG entry --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 723db2c8b..da964170b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Add a `debug` built-in function for printing values to stdout (#1266) + ### Changed ### Deprecated ### Removed ### Fixed + +- The effect checker now distinguished variables from different instances (#1290) + ### Security ## v0.17.0 -- 2023-12-04 @@ -20,7 +26,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - When an input file only one module, it will be inferred as the main module (#1260) - Sum types are now supported when running `verify` (#1034) -- Add a `debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated From 6f39212e0494d8611809ef6ea740e3a987e47d2e Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 5 Dec 2023 12:40:50 -0300 Subject: [PATCH 076/428] Apply suggestions from code review Co-authored-by: Shon Feder --- CHANGELOG.md | 2 +- quint/src/effects/namespaces.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da964170b..160e6defc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- The effect checker now distinguished variables from different instances (#1290) +- The effect checker now distinguishes variables from different instances (#1290) ### Security diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts index cc8cc6d97..851d559f6 100644 --- a/quint/src/effects/namespaces.ts +++ b/quint/src/effects/namespaces.ts @@ -51,11 +51,12 @@ function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } } case 'concrete': { + const pathPrefix = [...namespaces].reduce((a, b) => `${a}::${b}`) return { ...entity, stateVariables: entity.stateVariables.map(v => ({ ...v, - name: [...namespaces].reverse().concat(v.name).join('::'), + name: `${pathPrefix}::${v.name}`, })), } } From fb7ddafa71c308cf6f57df2a2c2efdb76cc7aa5b Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 12:59:07 -0300 Subject: [PATCH 077/428] Fix reduce and add guard clauses --- quint/src/effects/namespaces.ts | 6 +++++- quint/src/flattening/flattener.ts | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts index 851d559f6..04086addd 100644 --- a/quint/src/effects/namespaces.ts +++ b/quint/src/effects/namespaces.ts @@ -51,7 +51,11 @@ function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } } case 'concrete': { - const pathPrefix = [...namespaces].reduce((a, b) => `${a}::${b}`) + if (namespaces.length === 0) { + return entity + } + + const pathPrefix = namespaces.reduce((a, b) => `${b}::${a}`) return { ...entity, stateVariables: entity.stateVariables.map(v => ({ diff --git a/quint/src/flattening/flattener.ts b/quint/src/flattening/flattener.ts index af5a32da4..f644eb1af 100644 --- a/quint/src/flattening/flattener.ts +++ b/quint/src/flattening/flattener.ts @@ -207,9 +207,9 @@ class Flattener implements IRVisitor { } export function getNamespaceForDef(def: LookupDefinition): string | undefined { - if (!def.namespaces) { + if (!def.namespaces || def.namespaces.length === 0) { return } - return [...def.namespaces].reverse().join('::') + return def.namespaces.reduce((a, b) => `${b}::${a}`) } From f791cc60bb9eaae227fc6f18e350230839a0228d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 12:59:31 -0300 Subject: [PATCH 078/428] Add test to `effects/inferrer.test.ts` --- quint/test/effects/inferrer.test.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/quint/test/effects/inferrer.test.ts b/quint/test/effects/inferrer.test.ts index cba870e1d..188e635cc 100644 --- a/quint/test/effects/inferrer.test.ts +++ b/quint/test/effects/inferrer.test.ts @@ -266,4 +266,28 @@ describe('inferEffects', () => { message: 'Expected [x] and [] to be the same', }) }) + + it('differentiates variables from different instances', () => { + const baseDefs = ['const N: int', 'const S: Set[int]', 'var x: int'] + + const text = ` + module base { ${baseDefs.join('\n')} } + module wrapper { + import base(N=1) as B1 + import base(N=2) as B2 + val a = B1::x + B2::x + }` + const { modules, table } = parseMockedModule(text) + + const inferrer = new EffectInferrer(table) + inferrer.inferEffects(modules[0].declarations) + const [errors, effects] = inferrer.inferEffects(modules[1].declarations) + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + + const def = modules[1].declarations.find(decl => isDef(decl) && decl.name === 'a')! + + const expectedEffect = "Read['wrapper::B1::x', 'wrapper::B2::x']" + + assert.deepEqual(effectSchemeToString(effects.get(def.id)!), expectedEffect) + }) }) From 69983ce3917b982b0df22a723b8c061ee76a1a0a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 13:12:51 -0300 Subject: [PATCH 079/428] Release v0.17.1 --- CHANGELOG.md | 11 ++++++++++- quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 160e6defc..258dac21a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.17.1 -- 2023-12-05 + ### Added -- Add a `debug` built-in function for printing values to stdout (#1266) +- Add a `q::debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index d66e8796f..75108d964 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7b842dc2c..4e7543db0 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 284f13832..f84500743 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.17.0' +export const version = '0.17.1' From c808554022466c4a7a315bdd39545449865e66bd Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 15:52:06 -0300 Subject: [PATCH 080/428] VSCode Release v0.12.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 97a588463..46e8d8863 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.1 -- 2023-12-05 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.0 -- 2023-12-04 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index c9bb1c311..8d8ba8568 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.0", + "version": "0.12.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.0", + "version": "0.12.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 3e20a17c5..010dba7f2 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,7 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "version": "0.12.0", + "version": "0.12.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 2c19d25c0..07a07d165 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.0", + "version": "0.12.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.0", + "version": "0.12.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.17.0", + "@informalsystems/quint": "^0.17.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", - "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", + "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", - "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", + "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index c8108aa0a..cc9524a0d 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.0", + "version": "0.12.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.17.0", + "@informalsystems/quint": "^0.17.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 29b013ceba79f93487dd00122580cc74bae59b9c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 5 Dec 2023 22:47:49 -0500 Subject: [PATCH 081/428] Add a comparison operator to toList --- examples/spells/rareSpells.qnt | 65 +++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index f00ebddf2..b89a378e2 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -9,6 +9,23 @@ * so the others would see how to use it. */ module rareSpells { + + /// The type of orderings between comparable things + type Ordering = + | EQ + | LT + | GT + + /// Comparison of integers + pure def intCompare(__a: int, __b:int): Ordering = { + if (__a < __b) + { LT } + else if (__a > __b) + { GT } + else + { EQ } + } + /// /// Compute the sum of the values over all entries in a map. /// @@ -24,13 +41,50 @@ module rareSpells { assert(Map(2 -> -4, 4 -> 2).mapValuesSum() == -2), } + /// Assuming `__l` is sorted according to `__cmp`, returns a list with the element `__x` + /// insterted in order. + /// + /// If `__l` is not sorted, `__x` will be inserted after the first element less than + /// or equal to it. + /// + /// - @param __l a sorted list + /// - @param __x an element to be inserted + /// - @param __cmp an operator defining an `Ordering` of the elemnts of type `a` + /// - @returns a sorted list that includes `__x` + pure def sortedListInsert(__l: List[a], __x: a, __cmp: (a, a) => Ordering): List[a] = { + // We need to track whether __x has been inserted, and the accumulator for the new list + val __init = { is_inserted: false, acc: List() } + + val __result = __l.foldl(__init, (__state, __y) => + if (__state.is_inserted) + { ...__state, acc: __state.acc.append(__y) } + else + match __cmp(__x, __y) { + | GT => { ...__state, acc: __state.acc.append(__y) } + | _ => { is_inserted: true, acc: __state.acc.append(__x).append(__y) } + }) + + if (not(__result.is_inserted)) + // If __x was not inserted, it was GT than every other element, so it goes at the end + __result.acc.append(__x) + else + __result.acc + } + + run sortedListInsertTest = all { + assert(List().sortedListInsert(3, intCompare) == List(3)), + assert(List(1,2,4).sortedListInsert(3, intCompare) == List(1,2,3,4)), + assert(List(4,1,2).sortedListInsert(3, intCompare) == List(3,4,1,2)), + } + //// Returns a list of all elements of a set. //// The ordering will be arbitrary. //// //// - @param __set a set - //// - @returns a list of all elements of __set - pure def toList(__set: Set[a]): List[a] = { - __set.fold(List(), (__l, __e) => __l.append(__e)) + //// - @param __cmp an ordering over the elements of the set + //// - @returns a sorted list of all elements of __set + pure def toList(__set: Set[a], __cmp: (a, a) => Ordering): List[a] = { + __set.fold(List(), (__l, __e) => __l.sortedListInsert(__e, __cmp)) } //// Returns a set of the elements in the list. @@ -43,10 +97,11 @@ module rareSpells { run toListAndSetTest = all { - assert(Set(3, 2, 1).toList().toSet() == Set(1, 2, 3)), + assert(Set(3, 2, 1).toList(intCompare).toSet() == Set(1, 2, 3)), assert(List(2,3,1).toSet() == Set(1, 2, 3)), assert(List(2,3,1).toSet() == List(3,2,1).toSet()), - assert(toList(Set()) == List()), + assert(Set(2,3,1).toList(intCompare) == Set(3,1,2).toList(intCompare)), + assert(toList(Set(), intCompare) == List()), assert(toSet(List()) == Set()) } } From b484cab60ec2535f995ac404ff116e860e3d19ce Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 6 Dec 2023 14:10:43 -0500 Subject: [PATCH 082/428] Add comment about motives for Ordering --- examples/spells/rareSpells.qnt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index b89a378e2..9c54a8982 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -11,6 +11,9 @@ module rareSpells { /// The type of orderings between comparable things + // Follows https://hackage.haskell.org/package/base-4.19.0.0/docs/Data-Ord.html#t:Ordering + // and we think there are likely benefits to using 3 constant values rather than the more + // common integer range in Apalache. type Ordering = | EQ | LT From 53982b7d02df4f0c5bbe7beb40c4cfda045c2ef5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 6 Dec 2023 17:07:23 -0500 Subject: [PATCH 083/428] Add `mapToSet` to commonSpells --- examples/spells/commonSpells.qnt | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index 49a8c5f42..f89e33eb0 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -32,19 +32,27 @@ module commonSpells { assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), } - /// Get the list of values from a map. + /// Convert a map into a set of pairs coordinating its keys and values /// - /// - @param __map a map from type a to type b - /// - @returns the list of all values in the map - pure def mapValuesList(__map: a -> b): List[b] = { - __map.keys().fold([], (__list, __k) => __list.append(__map.get(__k))) + /// - @param __map a map + /// - @returns the set of pairs coordinating the map's keys with its values + /// + /// ### Examples + /// + /// ``` + /// val accountValues: Map[str, int] = Map("a" -> 1, "b" -> 1, "c" -> "1") + /// val sumOfValues: int = accountValues.mapToSet().fold(0, (acc, kv) => acc + kv._2) + /// assert(sumOfValues == 3) + /// ``` + pure def mapToSet(__map: a -> b): Set[(a, b)] = { + __map.keys().fold(Set(), (__acc, __k) => __acc.union(Set((__k, __map.get(__k))))) } - run mapValuesListTest = all { - assert(mapValuesList(Map()) == []), - assert(mapValuesList(Map(1 -> 2, 2 -> 3)) == [2, 3]), - assert(mapValuesList(Map(1 -> 2, 2 -> 3, 3 -> 2)) == [2,3,2]), + run mapToSetTest = all { + assert(mapToSet(Map()) == Set()), + assert(mapToSet(Map(1 -> 2, 2 -> 3)) == Set((1, 2), (2, 3))), + assert(Map("a" -> 1, "b" -> 1, "c" -> 1).mapToSet().fold(0, (__acc, __kv) => __acc + __kv._2) == 3), } -} \ No newline at end of file +} From 197b43bc2a54456d930328ac857f633afa3c92aa Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Dec 2023 08:00:11 -0500 Subject: [PATCH 084/428] Update examples/spells/commonSpells.qnt Co-authored-by: Gabriela Moreira --- examples/spells/commonSpells.qnt | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index f89e33eb0..e78c806da 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -53,6 +53,4 @@ module commonSpells { assert(mapToSet(Map(1 -> 2, 2 -> 3)) == Set((1, 2), (2, 3))), assert(Map("a" -> 1, "b" -> 1, "c" -> 1).mapToSet().fold(0, (__acc, __kv) => __acc + __kv._2) == 3), } - - } From 2d707dc76857f8bb9ab3c3ab6136c40bfb14b356 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Dec 2023 15:47:38 -0500 Subject: [PATCH 085/428] Add module factored version of two phase --- .../two_phase_commit_modules.qnt | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt new file mode 100644 index 000000000..a52fb9b69 --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt @@ -0,0 +1,208 @@ +// -*- mode: Bluespec; -*- + +/* This specification stems from the specification of the two phase protocol + by Leslie Lamport: + + https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ + +module message { + type T = + | Abort + | Commit + | Prepared(str) + + var channel: Set[T] + + action init: bool = { + channel' = Set() + } + + action stutter = all { + channel' = channel + } + + action send(m: T): bool = { + channel' = channel.union(Set(m)) + } + +} + +module resource_managers { + import message as msg + + type Status = | Working | Prepared | Committed | Aborted + var statuses : str -> Status + + action init(rms: Set[str]): bool = { + statuses' = rms.mapBy(r => Working) + } + + action stutter = all { + statuses' = statuses + } + + action prepare(resourceManager: str): bool = all { + statuses.get(resourceManager) == Working, + statuses' = statuses.set(resourceManager, Prepared), + msg::send(msg::Prepared(resourceManager)) + } + + action abort(resourceManager: str): bool = all { + or { + // Resource manager is working, and chooses to abort spontaneously + statuses.get(resourceManager) == Working, + // Resource manager receives an abort message from the transaction manager + msg::channel.contains(msg::Abort), + }, + statuses' = statuses.set(resourceManager, Aborted), + // There is no need to let others know that this resource manager aborted + msg::stutter, + } + + + // A resource manager commits due to a Commit message + action commit(resourceManager: str): bool = all { + msg::channel.contains(msg::Commit), + statuses' = statuses.set(resourceManager, Committed), + msg::stutter, + } + + + def consistencyInv(resourceManagers) = + tuples(resourceManagers, resourceManagers) + .forall(((r1, r2)) => + not( statuses.get(r1) == Committed + and + statuses.get(r2) == Aborted)) +} + +module transaction_manager { + import message as msg + + type Status = | TMInitiated | TMCommitted | TMAborted + + var status : Status + /// The set of resource managers from which the transaction manager has + /// received msg::Prepared messages + var preparedRMs : Set[str] + + action init: bool = all { + status' = TMInitiated, + preparedRMs' = Set(), + } + + action stutter = all { + status' = status, + preparedRMs' = preparedRMs, + } + + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm + action addPreparedResourceManager(resourceManager: str): bool = all { + status == TMInitiated, + msg::channel.contains(msg::Prepared(resourceManager)), + preparedRMs' = preparedRMs.union(Set(resourceManager)), + status' = status, + } + + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. + action decideOnCommit(resourceManagers) = all { + status == TMInitiated, + preparedRMs == resourceManagers, + status' = TMCommitted, + preparedRMs' = preparedRMs, + msg::send(msg::Commit) + } + + /// The transaction manager spontaneously aborts the transaction + action decideOnAbort = all { + status == TMInitiated, + status' = TMAborted, + preparedRMs' = preparedRMs, + msg::send(msg::Abort) + } +} + +module two_phase_commit { + const resourceManagers: Set[str] + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + action step = any { + // Resource manager actions + all { + nondet rm = resourceManagers.oneOf() + any { RM::prepare(rm), + RM::abort(rm), + RM::commit(rm) }, + TM::stutter + }, + // Transaction manager decisions (commit or abort) + all { + any { TM::decideOnCommit(resourceManagers), + TM::decideOnAbort }, + RM::stutter, + }, + // Transaction managers message consumption + all { + nondet rm = resourceManagers.oneOf() + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter + } + } + + action init = all { + msg::init, + TM::init, + RM::init(resourceManagers), + } + + /// Two resource managers have not arrived at conflicting decisions + val inv = RM::consistencyInv(resourceManagers) +} + +module two_phase_commit_tests { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager + run preparation(rm) = (all { + RM::prepare(rm), + TM::stutter, + }).then(all { + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter, + }) + + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message + run commitment = (all { + TM::decideOnCommit(resourceManagers), + RM::stutter + }).then(all { + RM::commit("rm1"), + TM::stutter + }).then(all { + RM::commit("rm2"), + TM::stutter + }).then(all { + RM::commit("rm3"), + TM::stutter + }) + + run successTest = init.then(step).then(step) + // run successTest = init + // .then(preparation("rm1")) + // .then(preparation("rm2")) + // .then(preparation("rm3")) + // .then(commitment) +} From bb56ba9a25a95cf8921ca532e050f36133032dcd Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 12:04:33 +0100 Subject: [PATCH 086/428] remove the outdated examples --- examples/cosmos/bank/bank-mini-sdk.qnt | 368 ------------------------ examples/cosmos/bank/bank-mini.qnt | 378 ------------------------- 2 files changed, 746 deletions(-) delete mode 100644 examples/cosmos/bank/bank-mini-sdk.qnt delete mode 100644 examples/cosmos/bank/bank-mini.qnt diff --git a/examples/cosmos/bank/bank-mini-sdk.qnt b/examples/cosmos/bank/bank-mini-sdk.qnt deleted file mode 100644 index 5b4d2a236..000000000 --- a/examples/cosmos/bank/bank-mini-sdk.qnt +++ /dev/null @@ -1,368 +0,0 @@ -/** - * This is a minimized protocol specification of the bank module - * that is tuned for an efficient presentation. For a more detailed version, - * see bank.qnt. - * - * Igor Konnov, Informal Systems, 2023 - */ -module bank { - // namespace bits { - type Addr = str - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are sorted arrays. We simply use Quint maps. - type Coins = str -> Int256 - // } - - // Account balances - type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, - } - - /// All possible addresses, a small set for testing. - /// In Q1, it will be a parameter! - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, a small set for testing (a parameter in a full spec). - /// In Q1, it will be a parameter! - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. - type BankCtx = { - // accessed via AccountKeeper - accounts: Set[Addr], - // the balances are the essential part of the bank module - balances: Addr -> Coins, - // module parameters - params: Params, - } - - // An output produced by Keeper computations - type BankOut = { - isError: bool, - ctx: BankCtx, - } - - // FUNCTIONAL LAYER - - // ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code - // Cognitive overload? - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis - } - // } // ViewKeeper - - // SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. - /// `isError == true` on error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed another way, there is no precondition. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } - } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - pure def getOr0(coins: Coins, d: str): int = { - if (d.in(coins.keys())) coins.get(d) else 0 - } - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - // return the result - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), - } - } - } - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - // } // SendKeeper - - // END OF THE FUNCTIONAL LAYER - - // STATE MACHINE - /* - ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - */ - - // machine { - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function: It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // Tests instantiate parameters with fixed values (later, parameterized). - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon") - - // Initialize the state machine. Atm, the initializer is a mock. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(BLOCKED.contains(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = (-(2^256)).to(2^256 - 1).oneOf() - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - // } - - // END OF THE STATE MACHINE - - // UNIT TESTS + PBT TESTS - - // all addresses but "null" have an associated account in the key/value store - val ACCOUNTS = ADDR.exclude(Set("null")) - - // a simple context for testing - val CONTEXT = { - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such a change would be computed automatically. - action keepVars = all { - balances' = balances, - accounts' = accounts, - } - - // test that validateBalance is working as expected - run validateBalanceTest = { - init - .then(all { - assert(validateBalance(CONTEXT, "alice")), - assert(not(validateBalance(CONTEXT, "null"))), - keepVars, - }) - } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), - } - } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) - } - - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) - } - - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank-mini.qnt::bank - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") -} diff --git a/examples/cosmos/bank/bank-mini.qnt b/examples/cosmos/bank/bank-mini.qnt deleted file mode 100644 index 7655280a7..000000000 --- a/examples/cosmos/bank/bank-mini.qnt +++ /dev/null @@ -1,378 +0,0 @@ -/** - * This is a minimized protocol specification of the bank module - * that is tuned for an efficient presentation. For a more detailed version, - * see bank.qnt. - * - * Igor Konnov, Informal Systems, 2023 - */ -module bank { - // namespace bits { - type Addr = str - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are sorted arrays. We simply use Quint maps. - type Coins = str -> Int256 - // } - - // Account balances - type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, - } - - /// All possible addresses, a small set for testing. - /// In Q1, it will be a parameter! - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, a small set for testing (a parameter in a full spec). - /// In Q1, it will be a parameter! - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. - type BankCtx = { - // accessed via AccountKeeper - accounts: Set[Addr], - // the balances are the essential part of the bank module - balances: Addr -> Coins, - // module parameters - params: Params, - } - - // An output produced by Keeper computations - type BankOut = { - isError: bool, - ctx: BankCtx, - } - - // FUNCTIONAL LAYER - - // ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis - } - // } // ViewKeeper - - // SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. `isError == true` on error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed another way, there is no precondition. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } - } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - pure def getOr0(coins: Coins, d: str): int = { - if (d.in(coins.keys())) coins.get(d) else 0 - } - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - // return the result - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), - } - } - } - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - // } // SendKeeper - - // END OF THE FUNCTIONAL LAYER - - // STATE MACHINE - // ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function: It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // Tests instantiate parameters with fixed values (later, parameterized). - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon", "foocoin") - - // Initialize the state machine. Atm, the initializer is a mock. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(BLOCKED.contains(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = (-(2^256)).to(2^256 - 1).oneOf() - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - - // END OF THE STATE MACHINE - - // UNIT TESTS + PBT TESTS - - // all addresses but "null" have an associated account in the key/value store - val ACCOUNTS = ADDR.exclude(Set("null")) - - // a simple context for testing - val CONTEXT = { - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such a change would be computed automatically. - action keepVars = all { - balances' = balances, - accounts' = accounts, - } - - // test that validateBalance is working as expected - run validateBalanceTest = { - init - .then(all { - assert(validateBalance(CONTEXT, "alice")), - assert(not(validateBalance(CONTEXT, "null"))), - keepVars, - }) - } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), - } - } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - // FIXME: Sometimes, denoms is still empty: - // https://github.com/informalsystems/quint/issues/545 - nondet denoms = DENOMS.powerset().exclude(Set()).oneOf() - all { - denoms.size() > 0, - // pick some amounts - nondet coins = denoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) - } - } - - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) - } - - // The test sendNotEnoughBalanceTest from: - // https://github.com/cosmos/cosmos-sdk/blob/497dc2cb78bb8df597fd63555f97b2f98cc7f2d0/x/bank/app_test.go#LL135 - run sendNotEnoughBalanceTest = { - val addrs = Set("addr1") - action myInit = all { - accounts' = addrs, - balances' = addrs.mapBy(a => Map("foocoin" -> 67)), - } - - init - .then(send("addr1", "addr2", Map("foocoin" -> 100))) - .fail() - } - - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank-mini.qnt::bank - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") -} From ead3c898dc8e621fa44aee9eb12d1ecefb122145 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 14:51:50 +0100 Subject: [PATCH 087/428] Detect import paths that only differ in capitalization (#1295) * detect different case filenames * update changelog * fix the comment * fix formatting * Update quint/src/parsing/quintParserFrontend.ts Co-authored-by: Thomas Pani * Update quint/cli-tests.md Co-authored-by: Gabriela Moreira * test the output more precisely --------- Co-authored-by: Thomas Pani Co-authored-by: Gabriela Moreira --- CHANGELOG.md | 3 ++ quint/io-cli-tests.md | 29 +++++++++++++++ quint/src/parsing/quintParserFrontend.ts | 46 +++++++++++++++++++----- quint/src/quintError.ts | 4 ++- quint/testFixture/_1060case.qnt | 4 +++ 5 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 quint/testFixture/_1060case.qnt diff --git a/CHANGELOG.md b/CHANGELOG.md index 258dac21a..394c73199 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Detect import paths that only differ in capitalization (#1295) + ### Security ## v0.17.1 -- 2023-12-05 diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index ab8fbe7aa..232a4653b 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1087,3 +1087,32 @@ rm xTest.itf.json ``` [{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] ``` + +### FAIL on parsing filenames with different casing + + + +``` +output=$(quint parse testFixture/_1060case.qnt 2>&1) +exit_code=$? +# assuming that our test setup does not introduce spaces in filenames +echo "$output" | sed -e 's#[^ ]*/\([^/]*\).qnt# HOME/\1.qnt#g' +exit $exit_code +``` + + +``` + HOME/_1060case.qnt:3:3 - error: [QNT408] Importing two files that only differ in case: HOME/_1022importee2.qnt vs. HOME/_1022IMPORTEE2.qnt. Choose one way. +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:2:3 - error: [QNT405] Module 'importee2' not found +2: import importee2 as i from "_1022importee2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:3:3 - error: [QNT405] Module 'importee2' not found +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: parsing failed +``` diff --git a/quint/src/parsing/quintParserFrontend.ts b/quint/src/parsing/quintParserFrontend.ts index 5d75fc28e..513b232ff 100644 --- a/quint/src/parsing/quintParserFrontend.ts +++ b/quint/src/parsing/quintParserFrontend.ts @@ -159,19 +159,29 @@ export function parsePhase2sourceResolution( mainPath: SourceLookupPath, mainPhase1Result: ParserPhase1 ): ParseResult { - // we accumulate the source map over all files here + // We accumulate the source map over all files here. let sourceMap = new Map(mainPhase1Result.sourceMap) - // The list of modules that have not been been processed yet. - // Each element of the list carries the module to be processed and the trail - // of sources that led to this module. - // The construction is similar to the worklist algorithm: + + // The list of modules that have not been been processed yet. Each element of + // the list carries the module to be processed and the trail of sources that + // led to this module. The construction is similar to the worklist algorithm: // https://en.wikipedia.org/wiki/Reaching_definition#Worklist_algorithm const worklist: [QuintModule, SourceLookupPath[]][] = mainPhase1Result.modules.map(m => [m, [mainPath]]) // Collect modules produced by every source. const sourceToModules = new Map() + // Collect visited paths, so we don't have to load the same file twice. + // Some filesystems are case-insensitive, whereas some are case sensitive. + // To prevent errors like #1194 from happening, we store both the + // original filename and its lower case version. If the user uses the same + // filename in different registers, we report an error. Otherwise, it would be + // quite hard to figure out tricky naming errors in the case-sensitive + // filesystems. We could also collect hashes of the files instead of + // lowercase filenames, but this looks a bit like overkill at the moment. + const visitedPaths = new Map() // Assign a rank to every module. The higher the rank, // the earlier the module should appear in the list of modules. sourceToModules.set(mainPath.normalizedPath, mainPhase1Result.modules) + visitedPaths.set(mainPath.normalizedPath.toLocaleLowerCase(), mainPath.normalizedPath) while (worklist.length > 0) { const [importer, pathTrail] = worklist.splice(0, 1)[0] for (const decl of importer.declarations) { @@ -179,9 +189,28 @@ export function parsePhase2sourceResolution( const importerPath = pathTrail[pathTrail.length - 1] const stemPath = sourceResolver.stempath(importerPath) const importeePath = sourceResolver.lookupPath(stemPath, decl.fromSource + '.qnt') - if (sourceToModules.has(importeePath.normalizedPath)) { - // The source has been parsed already. - continue + const importeeNormalized = importeePath.normalizedPath + const importeeLowerCase = importeeNormalized.toLowerCase() + if (visitedPaths.has(importeeLowerCase)) { + if (visitedPaths.get(importeeLowerCase) === importeeNormalized) { + // simply skip this import without parsing the same file twice + continue + } else { + // The source has been parsed already, but: + // - Either the same file is imported via paths in different cases, or + // - Two different files are imported via case-sensitive paths. + // Ask the user to disambiguate. + const original = + [...visitedPaths.values()].find( + name => name.toLowerCase() === importeeLowerCase && name !== importeeLowerCase + ) ?? importeeLowerCase + const err: QuintError = { + code: 'QNT408', + message: `Importing two files that only differ in case: ${original} vs. ${importeeNormalized}. Choose one way.`, + reference: decl.id, + } + return { ...mainPhase1Result, errors: mainPhase1Result.errors.concat([err]), sourceMap } + } } // try to load the source code const errorOrText = sourceResolver.load(importeePath) @@ -202,6 +231,7 @@ export function parsePhase2sourceResolution( worklist.push([m, pathTrail.concat([importeePath])]) }) sourceToModules.set(importeePath.normalizedPath, newModules) + visitedPaths.set(importeeLowerCase, importeeNormalized) sourceMap = new Map([...sourceMap, ...parseResult.sourceMap]) } } diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 81a8edd41..1df66fad0 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -73,7 +73,9 @@ export type ErrorCode = | 'QNT406' /* QNT407: Cannot import self */ | 'QNT407' - /* QNT500: Unitialized constant */ + /* QNT408: Case-sensitive filenames */ + | 'QNT408' + /* QNT500: Uninitialized constant */ | 'QNT500' /* QNT501: Internal compiler error */ | 'QNT501' diff --git a/quint/testFixture/_1060case.qnt b/quint/testFixture/_1060case.qnt new file mode 100644 index 000000000..a88d15b2f --- /dev/null +++ b/quint/testFixture/_1060case.qnt @@ -0,0 +1,4 @@ +module caseSensitive { + import importee2 as i from "_1022importee2" + import importee2 as I from "_1022IMPORTEE2" +} From 4e5af37b19432c880f1ef4d926f21e2c260cfea7 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 17:10:28 +0100 Subject: [PATCH 088/428] improve the spec a bit --- examples/cosmos/bank/bank.qnt | 8 ++- examples/cosmos/bank/bankTest.qnt | 55 ++++++++++++++--- examples/cosmos/bank/cosmos-bank.md | 91 ++++++++++++++++++++++++----- 3 files changed, 128 insertions(+), 26 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index 124c8c379..59391d399 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -44,8 +44,11 @@ module bank { address: str, coins: Coins, } - // An input of a multiparty transfer - type Output = Input + // An output of a multiparty transfer + type Output = { + address: str, + coins: Coins, + } // the portion of the context that is accessed by the bank module type BankCtx = { // block time (needed by vesting accounts) @@ -77,7 +80,6 @@ module bank { Map() } } - /// `ValidateBalance` should only be called upon genesis state. /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index dbb256680..3a6b57464 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -3,15 +3,24 @@ module bankTest { // the state of the machine that tests the logic // Total supply of coins per denomination - var Supply: Denom -> Int256 + var supply: Denom -> Int256 // Balances for each address - var Balances: Addr -> Coins + var balances: Addr -> Coins + + // state transitions of the machine + // initialize the state machine + action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + } // protocol invariants // sum up amounts over all balances for a given denomination - def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) + def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) if (denom.in(coins.keys())) { sum + coins.get(denom) } else { @@ -21,7 +30,39 @@ module bankTest { } // The total Supply of the network is equal to the sum of all coins from the account - val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) + } + + // tests + run getAllBalancesTest = { + init + .then( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + all { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + // do not change the state + balances' = balances, + supply' = supply, + } + ) + } + + // a helper operator that produces a context from a state + def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } } } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 382490b37..d0f1219b5 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -4,6 +4,9 @@ **Version**: Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). +**This page is still experimental. We believe that Cosmos documentation will +become executable one day.** + ## Abstract This document shows how we could turn an inanimate piece of documentation into @@ -11,8 +14,8 @@ an executable specification. We are using the [bank module][] of Cosmos SDK as an example. In the following, all of the quoted text belongs to the original description on the [bank module][] page, unless specified otherwise. To obtain a Quint module, run [lmt][] against this document. Check the executable -specification in [bank.qnt](./bank.qnt). We follow the same order of exposition, -as in the original document. +specification in [bank.qnt](./bank.qnt) and [bankTest.qnt](./bankTest.qnt). +We follow the same order of exposition, as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols @@ -58,8 +61,14 @@ module bankTest { // the state of the machine that tests the logic <<>> + // state transitions of the machine + <<>> + // protocol invariants <<>> + + // tests + <<>> } ``` @@ -159,9 +168,9 @@ This is a perfect opportunity to define a state invariant: ```bluespec "invariants" += // sum up amounts over all balances for a given denomination -def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) +def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) if (denom.in(coins.keys())) { sum + coins.get(denom) } else { @@ -171,8 +180,8 @@ def SumForDenom(denom: Denom): Int256 = { } // The total Supply of the network is equal to the sum of all coins from the account -val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) +val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) } ``` @@ -196,7 +205,7 @@ We represent this field as a map in the protocol specification: ```bluespec "state" += // Total supply of coins per denomination -var Supply: Denom -> Int256 +var supply: Denom -> Int256 ``` > - Denom Metadata: `0x1 | byte(denom) -> ProtocolBuffer(Metadata)` @@ -207,7 +216,20 @@ We represent this field as a map in the protocol specification: ```bluespec "state" += // Balances for each address -var Balances: Addr -> Coins +var balances: Addr -> Coins +``` + +We could initialize the state via `init`, which would be similar to executing +genesis transactions in Cosmos: + +```bluespec "transitions" += +// initialize the state machine +action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) +} ``` ## Keepers @@ -233,7 +255,7 @@ var Balances: Addr -> Coins > occurs for the operation if a user or client attempts to directly or > indirectly send funds to a blocklisted account, for example, by using IBC. -**TODO: figure out how blocklisting should be described in the protocol** +**TODO: we are skipping this feature in the spec for now** ### Common Types @@ -268,8 +290,11 @@ An output of a multiparty transfer. The type in Quint: ```bluespec "types" += -// An input of a multiparty transfer -type Output = Input +// An output of a multiparty transfer +type Output = { + address: str, + coins: Coins, +} ``` The type in protobuf: @@ -301,7 +326,7 @@ classDiagram SendKeeper <|-- BaseKeeper ``` -We define the part of the SDK context that is touched by the bank module: +We define the part of the SDK context that is accessed by the bank module: ```bluespec "types" += // the portion of the context that is accessed by the bank module @@ -336,10 +361,44 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } +``` +For example, we expect the `GetAllBalances` to return balances in the genesis state as follows: + +```bluespec "tests" += +run getAllBalancesTest = { + init + .then( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + all { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + // do not change the state + balances' = balances, + supply' = supply, + } + ) +} + +// a helper operator that produces a context from a state +def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } +} ``` - - `validateBalance` validates all balances for a given account address + - `ValidateBalance` validates all balances for a given account address returning an error if any balance is invalid. It checks for vesting account types and validate the balances against the original vesting balances. CONTRACT: ValidateBalance should only be called upon genesis @@ -413,13 +472,13 @@ pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { result will always be no coins. For vesting accounts, LockedCoins is delegated to the concrete vesting account type. - **TODO** + **TODO:** This requires vesting accounts. - `SpendableCoins` returns the total balances of spendable coins for an account by address. If the account has no spendable coins, an empty Coins slice is returned. - **TODO** + **TODO:** This requires vesting accounts. - `IterateAccountBalances` iterates over the balances of a single account and provides the token balance to a callback. If true is returned from From abefb07c928018d5a7831d5bb78744e6eb800601 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 12:01:52 -0500 Subject: [PATCH 089/428] Explain the modules spec in comment --- .../TwoPhaseCommit/two_phase_commit_modules.qnt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt index a52fb9b69..3bc33c343 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt @@ -1,9 +1,9 @@ // -*- mode: Bluespec; -*- -/* This specification stems from the specification of the two phase protocol - by Leslie Lamport: - - https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ +/* This specification is a variation on ./two_phase_commit.qnt that experiments with + using modules to divides the state spaces to reflect possible state access in the + system. +*/ module message { type T = From 94459551c46d153c20d6e094f6cc5553443303eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 14:49:27 -0500 Subject: [PATCH 090/428] Update examples dashboard --- examples/.scripts/run-example.sh | 4 ++-- examples/README.md | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 396950f99..6e0115a4a 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -55,10 +55,10 @@ result () { # Print additional explanations if [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1285" - elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1284" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then + printf "https://github.com/informalsystems/quint/issues/1299" fi fi } diff --git a/examples/README.md b/examples/README.md index 2cdd1b48a..480e47aca 100644 --- a/examples/README.md +++ b/examples/README.md @@ -54,7 +54,8 @@ listed without any additional command line arguments. | [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1284 | | [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1299 | :x:https://github.com/informalsystems/quint/issues/1299 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From e61c083c6b57ceeb352ad7241274f4151ac91c71 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 12 Dec 2023 18:37:39 +0100 Subject: [PATCH 091/428] Introduce a new run operator `expect` (#1303) * adding boilerplate for expect * implement the new operator "expect" * update changelog * npm run generate * fix formatting * update the builtins description * rollback the outdated fixture updates * update the docs * clarify rollback * fix the description * Update CHANGELOG.md Co-authored-by: Shon Feder --------- Co-authored-by: Shon Feder --- CHANGELOG.md | 3 ++ doc/builtin.md | 20 +++++++++ doc/lang.md | 37 +++++++++++++++- quint/src/builtin.qnt | 19 +++++++++ quint/src/effects/builtinSignatures.ts | 1 + quint/src/ir/quintIr.ts | 1 + quint/src/names/base.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 59 ++++++++++++++++++++++++++ quint/src/types/builtinSignatures.ts | 1 + quint/test/runtime/compile.test.ts | 40 +++++++++++++++++ 10 files changed, 181 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 394c73199..d0986792c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) + ### Changed ### Deprecated ### Removed diff --git a/doc/builtin.md b/doc/builtin.md index 520baf810..cb39cc040 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -860,6 +860,26 @@ var x: int run test = (x' = 1).then(x' = 2).then(x' = 3).then(assert(x == 3)) ``` +## `action expect: (bool, bool) => bool` + +`a.expect(b)` is true for a step from `s1` to `s2` if + + - `a` is true for a step from `s1` to `s2`, and + - `b` holds true in `s2`. + +If `a` evaluates to `false`, evaluation of `a.expect(b)` +fails with an error message. If `b` evaluates to `false`, +evaluation of `a.expect(b)` fails with an error message. + +### Examples + +``` +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + ## `action reps: (int, (int) => bool) => bool` `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. diff --git a/doc/lang.md b/doc/lang.md index 9dec39e9a..13981fc68 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -2,7 +2,7 @@ | Revision | Date | Author | |:---------|:-----------|:--------------------------------------------------------| -| 34 | 09.10.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | +| 35 | 12.12.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | This document presents language constructs in the same order as the [summary of TLA+](https://lamport.azurewebsites.net/tla/summary.pdf). @@ -64,6 +64,7 @@ Table of Contents * [Then](#then) * [Reps](#reps) * [Example](#example) + * [Expect](#expect) * [Fail](#fail) * [Temporal operators](#temporal-operators) * [Always](#always) @@ -1754,6 +1755,40 @@ to be disabled. *Mode:* Run. +#### Expect + +The operator `expect` has the following syntax: + +```scala +A.expect(P) +expect(A, P) +``` + +The left-hand side `A` must be an action or a run. The right-hand side `P` must +be a non-action Boolean expression. + +The semantics of this operator is as follows: + +- Evaluate action `A`: + - When `A`'s result is `false`, emit a runtime error. + - When `A`'s result is `true`: + - Commit the variable updates. + - Evaluate `P`: + - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + - If `P` evaluates to `true`, undo the updates back to the state where we + were after `A` was applied. + +##### Example + +```bluespec +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + +*Mode:* Run. + ### Temporal operators Temporal operators describe infinite executions. diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index 0f39c3914..3ec048edc 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -790,6 +790,25 @@ module builtin { /// ``` action then(a, b): (bool, bool) => bool + /// `a.expect(b)` is true for a step from `s1` to `s2` if + /// + /// - `a` is true for a step from `s1` to `s2`, and + /// - `b` holds true in `s2`. + /// + /// If `a` evaluates to `false`, evaluation of `a.expect(b)` + /// fails with an error message. If `b` evaluates to `false`, + /// evaluation of `a.expect(b)` fails with an error message. + /// + /// ### Examples + /// + /// ``` + /// var n: int + /// run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) + /// run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) + /// run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) + /// ``` + action expect(a, b): (bool, bool) => bool + /// `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. /// The iteration number, starting with 0, is passed as an argument of `A`. /// As actions are usually not parameterized by the iteration number, diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index 228e2d91d..f9de7f532 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -219,6 +219,7 @@ const temporalOperators = [ const otherOperators = [ { name: 'assign', effect: parseAndQuantify('(Read[r1], Read[r2]) => Read[r2] & Update[r1]') }, { name: 'then', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2] & Update[u]) => Read[r] & Update[u]') }, + { name: 'expect', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2]) => Read[r1] & Update[u]') }, { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index b7f11cb0a..b9e148e52 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -136,6 +136,7 @@ export const builtinOpCodes = [ 'and', 'append', 'assert', + 'expect', 'assign', 'chooseSome', 'concat', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 144a8437f..6e8e2071e 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -193,6 +193,7 @@ export const builtinNames = [ 'eventually', 'next', 'then', + 'expect', 'reps', 'fail', 'assert', diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 9f720e1d3..ba06ae4fd 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -920,6 +920,10 @@ export class CompilerVisitor implements IRVisitor { }) break + case 'expect': + this.translateExpect(app) + break + case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { @@ -1303,6 +1307,61 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(mkFunComputable(lazyCompute)) } + // Translate A.expect(P): + // - Evaluate A. + // - When A's result is 'false', emit a runtime error. + // - When A's result is 'true': + // - Commit the variable updates: Shift the primed variables to unprimed. + // - Evaluate `P`. + // - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + // - If `P` evaluates to `true`, rollback to the previous state and return `true`. + private translateExpect(app: ir.QuintApp): void { + // The code below is an adaption of chainAllOrThen. + // If someone finds how to nicely combine both, please refactor. + if (this.compStack.length !== 2) { + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + return + } + const [action, pred] = this.compStack.splice(-2) + const lazyCompute = (): Maybe => { + const savedNextVars = this.snapshotNextVars() + const savedTrace = this.trace() + const actionResult = action.eval() + if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { + // 'A' evaluates to 'false', or produces an error. + // Restore the values of the next variables. + this.recoverNextVars(savedNextVars) + this.resetTrace(just(rv.mkList(savedTrace))) + // expect emits an error when the run could not finish + this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + return none() + } else { + const savedVarsAfterAction = this.snapshotVars() + const savedNextVarsAfterAction = this.snapshotNextVars() + const savedTraceAfterAction = this.trace() + // Temporarily, switch to the next frame, to make a look-ahead evaluation. + // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. + this.shiftVars() + // evaluate P + const predResult = pred.eval() + // Recover the assignments to unprimed and primed variables. + // E.g., we recover variables to `x == 1` and `x' == 2` in the above example. + // This lets us combine the result of `expect` with other actions via `then`. + // For example: `A.expect(P).then(B)`. + this.recoverVars(savedVarsAfterAction) + this.recoverNextVars(savedNextVarsAfterAction) + this.resetTrace(just(rv.mkList(savedTraceAfterAction))) + if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { + this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') + return none() + } + return predResult + } + } + + this.compStack.push(mkFunComputable(lazyCompute)) + } + // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 5e2b2499e..9cd1ef4fb 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -122,6 +122,7 @@ const otherOperators = [ { name: 'assign', type: '(a, a) => bool' }, { name: 'ite', type: '(bool, a, a) => a' }, { name: 'then', type: '(bool, bool) => bool' }, + { name: 'expect', type: '(bool, bool) => bool' }, { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 1d86cafc3..a2a431736 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,6 +978,46 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) + it('expect fails', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n < 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect ok', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3) + ` + ) + + assertVarAfterCall('n', '3', 'run1', input) + }) + + it('expect fails when left-hand side is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(all { n == 1, n' = 3 }).expect(n < 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect and then expect fail', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3).then(n' = 4).expect(n == 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + it('q::debug', () => { // `q::debug(s, a)` returns `a` const input = dedent( From aacd39204d9fed010be30edc7467ee3072f5fe62 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:13:32 -0500 Subject: [PATCH 092/428] Move roadmap into separate file --- doc/roadmap.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 doc/roadmap.md diff --git a/doc/roadmap.md b/doc/roadmap.md new file mode 100644 index 000000000..a73f84af9 --- /dev/null +++ b/doc/roadmap.md @@ -0,0 +1,97 @@ +# Roadmap + +In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where +we are implementing various transpiler passes feature-by-feature, instead of +completely implementing every pass. + +- :white_check_mark: Completed +- :green_circle: Won't get in your way, but there's still work to be done +- :x: Not implemented yet + +| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | +|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| +| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | +| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | + +--- + +Quint is developed at [Informal Systems](https://informal.systems/). + +With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + +[Design Principles]: ./doc/design-principles.md +[Apalache]: https://github.com/informalsystems/apalache +[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler +[Imports]: ./doc/lang.md#imports-1 +[Module definitions]: ./doc/lang.md#module-definition +[Constant declarations]: ./doc/lang.md#constant-declarations +[Assumptions]: ./doc/lang.md#assumptions +[Variable definitions]: ./doc/lang.md#variable-definitions +[Operator definitions]: ./doc/lang.md#variable-definitions +[Module instances]: ./doc/lang.md#module-instances +[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators +[Booleans]: ./doc/lang.md#boolean-operators-and-equality +[Integers]: ./doc/lang.md#integers +[Sets]: ./doc/lang.md#sets +[Lists]: ./doc/lang.md#lists-aka-sequences +[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions +[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions +[if-then-else]: ./doc/lang.md#condition +[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Maps]: ./doc/lang.md#maps-aka-functions +[Records]: ./doc/lang.md#records +[Tuples]: ./doc/lang.md#tuples +[Sum types]: ./doc/lang.md#sum-types +[Delayed assignment]: ./doc/lang.md#delayed-assignment +[Runs]: ./doc/lang.md#runs +[Temporal operators]: ./doc/lang.md#temporal-operators +[Fairness]: ./doc/lang.md#fairness +[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers +[Modes]: ./doc/lang.md#modes +[Spells]: ./examples/spells/README.md +[Contribute your spell]: ./examples/spells/contribute-your-spell.md +[539]: https://github.com/informalsystems/quint/issues/539 +[221]: https://github.com/informalsystems/quint/issues/221 +[235]: https://github.com/informalsystems/quint/issues/235 +[8]: https://github.com/informalsystems/quint/issues/8 +[1034]: https://github.com/informalsystems/quint/issues/1034 +[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions +[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions +[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[Tutorials]: ./tutorials/README.md +[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint +[Quint discussions]: https://github.com/informalsystems/quint/discussions +[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer +[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA From 832fea5fba78fbf8e64fa4870128f8520188e871 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:16:17 -0500 Subject: [PATCH 093/428] Add dev docs to contributing --- CONTRIBUTING.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c73bdd60..11684170e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,23 @@ This project is part of the [Apalache][] ecosystem. Hence, we apply the same principles in Quint, see [Contributing to Apalache][]. +## Source code structure + + - [quint](./quint) is the package for the `quint` transpiler + - [vscode](./vscode) vscode plugin + +## Developer docs + + + - [roadmap](./doc/roadmap.md) + - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) + - [ADR002: Error codes](./doc/adr002-errors.md) + - [ADR003: Interface to visit Internal Representation + components](./doc/adr003-visiting-ir-components.md) + - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) + - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) + - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) + ## Coordinating work Development on Quint is distributed. As with any distributed system, establishing From 5a50078d025663de223859d51d029f1517f302d7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:21:32 -0500 Subject: [PATCH 094/428] Correct location of funding and links --- README.md | 62 +------------------------------------------------- doc/roadmap.md | 7 +----- 2 files changed, 2 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index d163e4fd8..6229730eb 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin - + Quint is short for Quintessence, from alchemy, which refers to the fifth element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to @@ -126,66 +126,6 @@ editor (currently, VSCode, Emacs and Vim are supported). This is a technique for embedding formal quint formal specifications inside of markdown files. -## Development - -### Developer docs :guitar: - - - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) - - [ADR002: Error codes](./doc/adr002-errors.md) - - [ADR003: Interface to visit Internal Representation - components](./doc/adr003-visiting-ir-components.md) - - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) - - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) - - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) - -### Source code :hash: - - - [quint](./quint) is the package for the `quint` transpiler - - [vscode](./vscode) vscode plugin - -### Roadmap :white_check_mark: - -In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where -we are implementing various transpiler passes feature-by-feature, instead of -completely implementing every pass. - -- :white_check_mark: Completed -- :green_circle: Won't get in your way, but there's still work to be done -- :x: Not implemented yet - -| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | -|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| -| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | -| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | --- diff --git a/doc/roadmap.md b/doc/roadmap.md index a73f84af9..c66f9b757 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -42,12 +42,7 @@ completely implementing every pass. | [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | ---- - -Quint is developed at [Informal Systems](https://informal.systems/). - -With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). - + [Design Principles]: ./doc/design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler From 24d491c36ff200dbd95be380cd74be29fe824923 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 20:38:13 -0500 Subject: [PATCH 095/428] Add Logos --- logos/quint-logo.png | Bin 0 -> 360413 bytes logos/quint-logo.svg | 68 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 logos/quint-logo.png create mode 100644 logos/quint-logo.svg diff --git a/logos/quint-logo.png b/logos/quint-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..25db008ec428b2bcf473282229c8f8a8b570dca8 GIT binary patch literal 360413 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�PR!xMI6cJOw_h)u$oCpL! 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

74rcosKM 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 NoxEX^HoClzYAvAm&8A*n^Idx&OaKx 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

4fY#%$3!sIZy^WVvi2j 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 + + + + + + From 764e76227d136d28bce41621ca9edc4d61c8a16d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 20:52:27 -0500 Subject: [PATCH 096/428] Format header and organize content --- README.md | 129 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 6229730eb..129ec8c8c 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,49 @@ -# Quint Lang - -[![build -badge](https://github.com/informalsystems/quint/actions/workflows/main.yml/badge.svg)](https://github.com/informalsystems/quint/actions) -[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/informal.quint-vscode?color=10b0f2&label=VSCode)](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) -[![npm (scoped)](https://img.shields.io/npm/v/@informalsystems/quint)](https://www.npmjs.com/package/@informalsystems/quint) - -Quint Lang (or just Quint) is a modern specification language that is a -particularly good fit for distributed systems and blockchain protocols. It -combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] -(TLA) with state-of-the-art static analysis and development tooling. - -If you are impatient, here is a [15 minute intro to Quint][] at Gateway to -Cosmos 2023. +

+ + +## Overview + +Quint is a modern specification language that is a particularly good fit for +distributed systems, such as blockchain protocols, distributed databases, and +p2p protocols. Quint combines the robust theoretical basis of the [Temporal +Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and +development tooling. This is how typical Quint code looks: + + ```scala // `validateBalance` should only be called upon genesis state. pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { @@ -24,6 +53,8 @@ This is how typical Quint code looks: } ``` + + If you would like to see the same code in TLA+, here is how it looks: ```tla @@ -35,8 +66,19 @@ validateBalance(ctx, addr) == coins[denom] > 0 ``` -Want a preview of the tools before reading any further? Check [Quick -previews](./doc/previews.md). +### Features + + + +- Simple, familiar syntax +- Expressive Type systems +- Effect system +- Simulation +- Symbolic model checking via Apalache +- IDE support via LSP +- REPL + +### Motivation Quint is inspired by [TLA+][] but provides an alternative surface syntax for specifying systems in TLA. The most important feature of our syntax is that it @@ -54,18 +96,33 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] -model checker. +TLA and it is aligned with TLA+ -## Name origin - -Quint is short for Quintessence, from alchemy, which refers to the fifth -element. A lot of alchemy is about transmutation and energy, and Quint makes it -possible to transmute specifications into executable assets and empower ideas to -become referenced artifacts. +- it is supported in the [Apalache][] model checker. + + +- [15 minute intro to Quint at Gateway to Cosmos 2023][] . +- [preview of the tools](./doc/previews.md). + + +## Installation + +Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): + +``` sh +npm i @informalsystems/quint -g +``` + +Install IDE support for your editor: + +- [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) +- [Emacs](./editor-plugins/emacs/README.md) +- [Vim](./editor-plugins/vim/README.md) ## Documentation + + ### Tutorials :teacher: Visit the [Tutorials][] page. @@ -84,13 +141,6 @@ Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). -## Community and help - -- Join the chat in the [Quint zulip stream][] :telephone: -- Join the [Quint discussions][] :bulb: -- [Contribute your spell][] to the collection of Quint spells :scroll: -- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: - ### Tools :space_invader: [Quick previews](./doc/previews.md) of the tools. @@ -127,12 +177,29 @@ editor (currently, VSCode, Emacs and Vim are supported). of markdown files. +## Communty + + +- Join the chat in the [Quint zulip stream][] :telephone: +- Join the [Quint discussions][] :bulb: +- [Contribute your spell][] to the collection of Quint spells :scroll: +- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: + +## Name origin + +Quint is short for Quintessence, from alchemy, which refers to the fifth +element. A lot of alchemy is about transmutation and energy, and Quint makes it +possible to transmute specifications into executable assets and empower ideas to +become referenced artifacts. + --- Quint is developed at [Informal Systems](https://informal.systems/). + With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + [Design Principles]: ./doc/design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler From 24aa7aca4db7a0866704293cbd2a775fe5a0ecd5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:25:20 -0500 Subject: [PATCH 097/428] Change example and put TLA in details --- README.md | 61 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 129ec8c8c..37b346799 100644 --- a/README.md +++ b/README.md @@ -40,32 +40,46 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -This is how typical Quint code looks: +Here's some example code in Quint: - +```bluespec +type Status = Working | Prepared | Committed | Aborted -```scala - // `validateBalance` should only be called upon genesis state. - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - } -``` +const ResourceManagers: Set[str] +var statuses: str -> Status + +action init = ResourceManagers.mapBy(_ => Working) + +val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) +val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) - +action prepare(rm) = all { + statuses.get(rm) == Working, + statuses' = statuses.set(rm, Prepared) +} +``` -If you would like to see the same code in TLA+, here is how it looks: +
+The equivalent TLA+ code ```tla -\* `validateBalance` should only be called upon genesis state. -validateBalance(ctx, addr) == - /\ addr \in ctx.accounts - /\ LET coins == getAllBalances(ctx, addr) IN - \A denom \in DOMAIN coins: - coins[denom] > 0 +CONSTANT ResourceManagers +VARIABLE statuses + +TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] + +TCInit == statuses = [rm \in ResourceManagers |-> "working"] + +canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} + +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" + +Prepare(rm) == /\ statuses[rm] = "working" + /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] ``` +
+ ### Features @@ -104,7 +118,6 @@ TLA and it is aligned with TLA+ - [15 minute intro to Quint at Gateway to Cosmos 2023][] . - [preview of the tools](./doc/previews.md). - ## Installation Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): @@ -185,9 +198,9 @@ editor (currently, VSCode, Emacs and Vim are supported). - [Contribute your spell][] to the collection of Quint spells :scroll: - [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: -## Name origin - -Quint is short for Quintessence, from alchemy, which refers to the fifth +## On "Quint" + +Quint is short for 'quintessence', from alchemy, which refers to the fifth element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to become referenced artifacts. @@ -196,8 +209,8 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). - -With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + +Supported by the Vienna Business Agency
[the Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md From aa44dcbb03df5617787f1916476d886801850e1d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:45:01 -0500 Subject: [PATCH 098/428] Flesh out features --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 37b346799..98db9d72b 100644 --- a/README.md +++ b/README.md @@ -82,15 +82,13 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features - - -- Simple, familiar syntax -- Expressive Type systems -- Effect system -- Simulation -- Symbolic model checking via Apalache -- IDE support via LSP -- REPL +- A simple and familiar **syntax** to support engineers reading and writing specifications +- An expressive **type systems** to ensure the domain model is coherent +- A novel **effect system** to ensure state updates are coherent +- **IDE support** via LSP, giving real time feedback when writing specifications +- A **REPL** enabling interactive exploration of specifications +- A **simulator** enabling tests, trace generation, and exploration of your system +- **Symbolic model checking** to verify your specifications via [Apalache][apalache] ### Motivation From 2ccd58880731006b0b1d73b3fc998010126498fc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:45:17 -0500 Subject: [PATCH 099/428] Edit motivation --- README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 98db9d72b..a556a5be0 100644 --- a/README.md +++ b/README.md @@ -100,19 +100,15 @@ tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: - At the lexical level, it borrows many principles from C-like languages. -- At the syntax level, it follows a few (but not all) principles that are - usually found in functional languages. +- At the syntax level, it follows many principles found in functional languages. - At the semantic level, Quint extends the standard programming paradigm with - non-determinism and temporal formulas, which allow designers to specify - protocol environments such as networks, faults, and time concisely and - clearly. + non-determinism and temporal formulas, which allow concise specification of + protocol environments such as networks, faults, and time. -Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+ +Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with +formal semantics built-in. -- it is supported in the [Apalache][] model checker. - - + - [15 minute intro to Quint at Gateway to Cosmos 2023][] . - [preview of the tools](./doc/previews.md). From 89989ae4f2c6f4a8160ed667b3b7ea8a868d4fc3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:58:40 -0500 Subject: [PATCH 100/428] Try to tidy up the documentation section --- README.md | 98 ++++++++++++++++--------------------------------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index a556a5be0..71cebdaea 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,8 @@ Prepare(rm) == /\ statuses[rm] = "working" Quint is inspired by [TLA+][] but provides an alternative surface syntax for specifying systems in TLA. The most important feature of our syntax is that it is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [Design Principles][]). +tooling and static analysis (see our [design principles][] and [previews of the +tooling](./doc/previews.md) of the tooling). The syntax also aims to be familiar to engineers: @@ -108,89 +109,48 @@ The syntax also aims to be familiar to engineers: Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in. - -- [15 minute intro to Quint at Gateway to Cosmos 2023][] . -- [preview of the tools](./doc/previews.md). +To learn more about Quint's motivation and design philosophy, watch this [15 +minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to +Cosmos in 2023. ## Installation -Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): +1. Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): -``` sh -npm i @informalsystems/quint -g -``` - -Install IDE support for your editor: + ``` sh + npm i @informalsystems/quint -g + ``` -- [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) -- [Emacs](./editor-plugins/emacs/README.md) -- [Vim](./editor-plugins/vim/README.md) - -## Documentation +2. Install IDE support for your editor: - + - [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) + - [Emacs](./editor-plugins/emacs/README.md) + - [Vim](./editor-plugins/vim/README.md) -### Tutorials :teacher: +3. _Optionally_, you may also install the [VSCode plugin for visualizing + traces](https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer). -Visit the [Tutorials][] page. - -### Syntax :abcd: +## Documentation +- [Frequently asked questions](./doc/faq.md) +- [Tutorials][] +- [Examples](./examples) - [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [Reference API documentation for built-in operators](./doc/builtin.md) - [Syntax documentation](./doc/lang.md) -- [Frequently asked questions](./doc/faq.md) - -### Examples :musical_score: - -We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. -To simplify reading, use [syntax highlighting](./editor-plugins) for your -editor (currently, VSCode, Emacs and Vim are supported). - -### Tools :space_invader: - -[Quick previews](./doc/previews.md) of the tools. - - - Quint's core tool `quint`: - - - [Installation](./quint/README.md) - +- [Reference API documentation for built-in operators](./doc/builtin.md) +- [Design Principles][] +- The `quint` CLI tool - [Manual](./doc/quint.md) - - [REPL](./tutorials/repl/repl.md) +- [Literate executable specifications](./doc/literate.md) -- Editor support: - - We strongly encourage you to configure your editor for Quint. Our language - server provides the quickest feedback loop for your specifications, reporting - informative errors as you type. These are instuctions for the currently - supported editors: - - - VSCode: Install the plugin from [Visual Studio Code - Marketplace][]. - - Emacs: Setup two custom packages from the [emacs folder](./editor-plugins/emacs). - - Vim/Neovim: Follow configuration instructions from the [vim folder](./editor-plugins/vim) - - - VSCode plugin for [ITF traces][] by @hvanz: - - This a plugin that visualizes traces that are produced by Quint and - [Apalache][]. Install the [ITF Trace Viewer][] from Visual Studio Code - Marketplace. - - - Writing [literate executable specifications](./doc/literate.md) - - This is a technique for embedding formal quint formal specifications inside - of markdown files. - - -## Communty +## Community -- Join the chat in the [Quint zulip stream][] :telephone: -- Join the [Quint discussions][] :bulb: -- [Contribute your spell][] to the collection of Quint spells :scroll: -- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: +- Join the chat in the [Quint zulip stream][] +- Join the [Quint discussions][] +- [Contribute your spell][] to the collection of Quint spells +- [Contribute](./CONTRIBUTING.md) to the development of Quint ## On "Quint" @@ -252,5 +212,3 @@ Supported by the Vienna Business Agency
[the Vienna Business Agen
 [Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint
 [Quint discussions]: https://github.com/informalsystems/quint/discussions
 [ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html
-[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer
-[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA

From d547e1f848dbbfa8351b7cd36252dbc67779b435 Mon Sep 17 00:00:00 2001
From: Shon Feder <shon@informal.systems>
Date: Tue, 12 Dec 2023 21:59:46 -0500
Subject: [PATCH 101/428] Remove extra bullet

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 71cebdaea..f8c8156f7 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 <p>
     <a href=Installation • Documentation • - Community • + Community

From db376a44ad2e7074a7f798d642deef8022984aed Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:00:49 -0500 Subject: [PATCH 102/428] Fix community link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8c8156f7..bd46a71f8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

InstallationDocumentation • - Community + Community

From 3d4aaa68715f719e15708e92665777c76570c011 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:03:44 -0500 Subject: [PATCH 103/428] A few small updates --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11684170e..1ee9e770d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ attention. ## Project structure -Currently, the project consists of two npm packages (published locally): +Currently, the project consists of two npm packages: - [quint](./quint) is the transpiler package, see the [quint manual][]. - [vscode/quint](./vscode/quint) is the VSCode plugin for Quint, depends on `quint`. @@ -265,7 +265,7 @@ Between installing the plugin from different sources, you may end up with multip 4. Restart VSCode **twice**. The first time it will recreate the `extensions.json` file, the second time it will install the extensions. Reloading won't work, you need to actually close and reopen VSCode. [Apalache]: https://github.com/informalsystems/apalache -[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/unstable/CONTRIBUTING.md +[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/main/CONTRIBUTING.md [eslint]: https://eslint.org/ [quint manual]: ./doc/quint.md [Installing quint]: https://github.com/informalsystems/quint/blob/main/quint/README.md#how-to-install From cfc7c515e771d5e5bb88d06c7ce5b53edf8505d5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:11:35 -0500 Subject: [PATCH 104/428] Restructure docs section again --- README.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bd46a71f8..b3488a23e 100644 --- a/README.md +++ b/README.md @@ -133,16 +133,22 @@ Cosmos in 2023. ## Documentation - [Frequently asked questions](./doc/faq.md) -- [Tutorials][] -- [Examples](./examples) -- [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [Syntax documentation](./doc/lang.md) -- [Reference API documentation for built-in operators](./doc/builtin.md) + +- Quint by example: + - [Cheatsheet](./doc/quint-cheatsheet.pdf) + - [Language tutorials](./tutorials/README.md) + - [REPL tutorial](./tutorials/repl/repl.md) + - [Example specifications](./examples) + +- Language reference: + - [Syntax documentation](./doc/lang.md) + - [Reference API documentation for built-in operators](./doc/builtin.md) + +- Tooling manuals + - [CLI manual](./doc/quint.md) + - [Literate executable specifications](./doc/literate.md) + - [Design Principles][] -- The `quint` CLI tool - - [Manual](./doc/quint.md) - - [REPL](./tutorials/repl/repl.md) -- [Literate executable specifications](./doc/literate.md) ## Community From d12195ed6cb00f9032871ac07da200c1f3bc618c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:17:35 -0500 Subject: [PATCH 105/428] Fix example init --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b3488a23e..19a7232da 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,9 @@ type Status = Working | Prepared | Committed | Aborted const ResourceManagers: Set[str] var statuses: str -> Status -action init = ResourceManagers.mapBy(_ => Working) +action init = { + statuses' = ResourceManagers.mapBy(_ => Working) +} val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) From 42d0174da49d8889f06b116a8ac2e2bcb17b716f Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 12:10:43 +0100 Subject: [PATCH 106/428] Change the runtime behavior of `then` (#1304) * fix the semantics of then * update the docs * update changelog * fix formatting * improve comments * add detailed docs * fix the throwing tests * Update quint/src/runtime/impl/compilerImpl.ts Co-authored-by: Shon Feder --------- Co-authored-by: Shon Feder --- CHANGELOG.md | 3 + doc/builtin.md | 4 +- doc/lang.md | 20 ++-- examples/language-features/counters.qnt | 4 +- quint/src/builtin.qnt | 4 +- quint/src/quintError.ts | 2 + quint/src/runtime/impl/compilerImpl.ts | 36 +++++- quint/test/runtime/compile.test.ts | 152 +++++++++++++++++------- 8 files changed, 164 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0986792c..43ca138e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) ### Changed + +- Change in `A.then(B)`: If `A` returns `false`, `A.then(B)` fails (#1304) + ### Deprecated ### Removed ### Fixed diff --git a/doc/builtin.md b/doc/builtin.md index cb39cc040..16e39d655 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -851,7 +851,9 @@ run test = (x' = 0).then(a).then(assert(x == 3)) `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. -This is the action composition operator. +This is the action composition operator. If `a` evaluates to `false`, then +`a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then +`a.then(b)` returns `false`. ### Examples diff --git a/doc/lang.md b/doc/lang.md index 13981fc68..31c578b99 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -1658,13 +1658,19 @@ then(A, B) The semantics of this operator is as follows. When `A.then(B)` is applied to a state `s_1`, the operator computes a next state `s_2` of `s_1` by applying -action `A`, if such a state exists. If `A` returns `true`, then the operator -`A.then(B)` computes a next state `s_3` of `s_2` by applying action `B`, if -such a state exists. If `B` returns true, then the operator `A.then(B)` returns -`true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. -In all other cases, the operator returns `false`. - -This operator is equivalent to `A \cdot B` of TLA+. +action `A`, if such a state exists. Depending on the result of `A`, two scenarios +are possible: + + - When `A` returns `true`, then the operator `A.then(B)` computes a next state + `s_3` of `s_2` by applying action `B`, if such a state exists. + If `B` returns true, then the operator `A.then(B)` returns + `true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. + Otherwise, the operator `A.then(B)` returns `false`. + + - If `A` returns `false`, then it is impossible to continue. A runtime error + should be reported. + +This operator is equivalent to `A \cdot B` of TLA+ (except for the runtime errors). **Example.** Consider the specification `counters`: diff --git a/examples/language-features/counters.qnt b/examples/language-features/counters.qnt index 4dd254b7e..a316a9e05 100644 --- a/examples/language-features/counters.qnt +++ b/examples/language-features/counters.qnt @@ -80,10 +80,10 @@ module counters { // this tests for a failing condition run failingTest = { init - .then(10.reps(_ => all { + .then(all { n == 0, step, - })) + }) .fail() } diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index 3ec048edc..a1016e636 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -780,7 +780,9 @@ module builtin { /// /// `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. /// - /// This is the action composition operator. + /// This is the action composition operator. If `a` evaluates to `false`, then + /// `a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then + /// `a.then(b)` returns `false`. /// /// ### Examples /// diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 1df66fad0..b67b9a1e2 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -101,6 +101,8 @@ export type ErrorCode = | 'QNT511' /* QNT512: Simulation failure */ | 'QNT512' + /* QNT513: Cannot continue in 'then' */ + | 'QNT513' /* Additional data for a Quint error */ export interface QuintErrorData { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index ba06ae4fd..9c50081b8 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1257,8 +1257,18 @@ export class CompilerVisitor implements IRVisitor { } } - // compute all { ... } or A.then(B)...then(E) for a chain of actions - private chainAllOrThen(actions: Computable[], kind: 'all' | 'then'): Maybe { + /** + * Compute all { ... } or A.then(B)...then(E) for a chain of actions. + * @param actions actions as computable to execute + * @param kind is it 'all { ... }' or 'A.then(B)'? + * @param actionId given the action index, return the id that produced this action + * @returns evaluation result + */ + private chainAllOrThen( + actions: Computable[], + kind: 'all' | 'then', + actionId: (idx: number) => bigint + ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() const savedTrace = this.trace() @@ -1270,14 +1280,27 @@ export class CompilerVisitor implements IRVisitor { for (const action of actions) { nactionsLeft-- result = action.eval() - if (result.isNone() || !(result.value as RuntimeValue).toBool()) { + const isFalse = result.isJust() && !(result.value as RuntimeValue).toBool() + if (result.isNone() || isFalse) { // As soon as one of the arguments does not evaluate to true, // break out of the loop. // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) this.resetTrace(just(rv.mkList(savedTrace))) - break + + if (kind === 'then' && nactionsLeft > 0 && isFalse) { + // Cannot extend a run. Emit an error message. + const actionNo = actions.length - (nactionsLeft + 1) + this.errorTracker.addRuntimeError( + actionId(actionNo), + 'QNT513', + `Cannot continue in A.then(B), A evaluates to 'false'` + ) + return none() + } else { + return result + } } // switch to the next frame, when implementing A.then(B) @@ -1302,7 +1325,7 @@ export class CompilerVisitor implements IRVisitor { const args = this.compStack.splice(-app.args.length) const kind = app.opcode === 'then' ? 'then' : 'all' - const lazyCompute = () => this.chainAllOrThen(args, kind) + const lazyCompute = () => this.chainAllOrThen(args, kind, idx => app.args[idx].id) this.compStack.push(mkFunComputable(lazyCompute)) } @@ -1384,7 +1407,8 @@ export class CompilerVisitor implements IRVisitor { }, } }) - return this.chainAllOrThen(actions, 'then') + // In case the case of reps, we have multiple copies of the same action. This is why all occurrences have the same id. + return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() } diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index a2a431736..fe326ff69 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' import { Either, left, right } from '@sweet-monads/either' import { just } from '@sweet-monads/maybe' import { expressionToString } from '../../src/ir/IRprinting' -import { Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' +import { Callable, Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' import { noExecutionListener } from '../../src/runtime/trace' import { CompilationContext, @@ -80,56 +80,84 @@ function assertVarExists(kind: ComputableKind, name: string, input: string) { res.mapLeft(m => assert.fail(m)) } +// compile a computable for a run definition +function callableFromContext(ctx: CompilationContext, callee: string): Either { + let key = undefined + const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] + const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) + if (!def) { + return left(`${callee} definition not found`) + } + key = kindName('callable', def.id) + if (!key) { + return left(`${callee} not found`) + } + const run = ctx.evaluationState.context.get(key) as Callable + if (!run) { + return left(`${callee} not found via ${key}`) + } + + return right(run) +} + // Scan the context for a callable. If found, evaluate it and return the value of the given var. -// Assumes the input has a single callable -// `callee` is used for error reporting. -function evalVarAfterCall(varName: string, callee: string, input: string): Either { +// Assumes the input has a single definition whose name is stored in `callee`. +function evalVarAfterRun(varName: string, callee: string, input: string): Either { // use a combination of Maybe and Either. // Recall that left(...) is used for errors, // whereas right(...) is used for non-errors in sweet monads. const callback = (ctx: CompilationContext): Either => { - let key = undefined - const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] - const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) - if (!def) { - return left(`${callee} definition not found`) - } - key = kindName('callable', def.id) - if (!key) { - return left(`${callee} not found`) - } - const run = ctx.evaluationState.context.get(key) - if (!run) { - return left(`${callee} not found via ${key}`) - } + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + if ((res as RuntimeValue).toBool() === true) { + // extract the value of the state variable + const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() + if (nextVal.isNone()) { + return left(`Value of the variable ${varName} is undefined`) + } else { + return right(expressionToString(nextVal.value.toQuintEx(idGen))) + } + } else { + const s = expressionToString(res.toQuintEx(idGen)) + const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` + return left(m) + } + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() + }) + .join() + } - return run - .eval() - .map(res => { - if ((res as RuntimeValue).toBool() === true) { - // extract the value of the state variable - const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() - // using if-else, as map-or-unwrap confuses the compiler a lot - if (nextVal.isNone()) { - return left(`Value of the variable ${varName} is undefined`) - } else { - return right(expressionToString(nextVal.value.toQuintEx(idGen))) - } - } else { - const s = expressionToString(res.toQuintEx(idGen)) - const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` - return left(m) - } + return evalInContext(input, callback) +} + +// Evaluate a run and return the result. +function evalRun(callee: string, input: string): Either { + // Recall that left(...) is used for errors, + // whereas right(...) is used for non-errors in sweet monads. + const callback = (ctx: CompilationContext): Either => { + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + return right(expressionToString(res.toQuintEx(idGen))) + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() }) - .or(just(left(`Value of ${callee} is undefined`))) - .unwrap() + .join() } return evalInContext(input, callback) } function assertVarAfterCall(varName: string, expected: string, callee: string, input: string) { - evalVarAfterCall(varName, callee, input) + evalVarAfterRun(varName, callee, input) .mapLeft(m => assert.fail(m)) .mapRight(output => assert(expected === output, `Expected ${varName} == ${expected}, found ${output}`)) } @@ -933,7 +961,7 @@ describe('compiling specs to runtime values', () => { }) describe('compile runs', () => { - it('then', () => { + it('then ok', () => { const input = dedent( `var n: int |run run1 = (n' = 1).then(n' = n + 2).then(n' = n * 4) @@ -943,6 +971,30 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('n', '12', 'run1', input) }) + it('then fails when rhs is unreachable', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }).then(n' = 3) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + + it('then returns false when rhs is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.equal(result, 'false')) + .mapLeft(m => assert.fail(`Expected the run to return false, found: ${m}`)) + }) + it('reps', () => { const input = dedent( `var n: int @@ -958,6 +1010,18 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('hist', 'List(0, 1, 2)', 'run2', input) }) + it('reps fails when action is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(10.reps(i => all { n < 5, n' = n + 1 })) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + it('fail', () => { const input = dedent( `var n: int @@ -965,7 +1029,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('assert', () => { @@ -975,7 +1039,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) it('expect fails', () => { @@ -985,7 +1049,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('expect ok', () => { @@ -1005,7 +1069,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('expect and then expect fail', () => { @@ -1015,7 +1079,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('q::debug', () => { From bd19423b66a41bc255633670a2fa96457941db74 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:13:42 -0300 Subject: [PATCH 107/428] Clarify TLA+ vs TLA --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 19a7232da..b5a8554cf 100644 --- a/README.md +++ b/README.md @@ -94,11 +94,11 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Motivation -Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in TLA. The most important feature of our syntax is that it -is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [design principles][] and [previews of the -tooling](./doc/previews.md) of the tooling). +Quint is inspired by [TLA+][] (the language) but provides an alternative surface +syntax for specifying systems in TLA (the logic). The most important feature of +our syntax is that it is minimal and regular, making Quint an easy target for +advanced developer tooling and static analysis (see our [design principles][] +and [previews](./doc/previews.md) of the tooling). The syntax also aims to be familiar to engineers: From b76c870ec8ac1dfaba72da82143d35169d4897a4 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:14:30 -0300 Subject: [PATCH 108/428] Replace Vienna Business Agency logo with the English version --- README.md | 3 +-- Wirtschaftsagentur_Wien_logo.jpg | Bin 826867 -> 0 bytes logos/vienna-business-agency.png | Bin 0 -> 3625 bytes 3 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 Wirtschaftsagentur_Wien_logo.jpg create mode 100644 logos/vienna-business-agency.png diff --git a/README.md b/README.md index b5a8554cf..da0f96ef4 100644 --- a/README.md +++ b/README.md @@ -171,8 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). - -Supported by the Vienna Business Agency
[the Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md diff --git a/Wirtschaftsagentur_Wien_logo.jpg b/Wirtschaftsagentur_Wien_logo.jpg deleted file mode 100644 index 5598fbeceb22ba596da71140bcbfc6cabf26faa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826867 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 z 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 z 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

e5AS~a;XkZI?6q2n3f5>- z?tlqp4Op=B0S7L5z(bUQt4`Rk^Cct4h@aR@Q0xu2`(&y<&x) z=kgJK_vQNx+?JmQcMaV7elT!b_U9zGUg7`nD#qba^!*;_Z-NiA20p}+)rkEDkbkib z@4xY#HR&7FC}ramN*b9(@gwtD%!n%&xzUFY-xwke*%&Pi+K{B^zadN6cSDiPYkjq< z$NEfHzJ zwqeBo8;SBa6D1)miXBySIrj2C}W z?er6o$t!~RWwt|q2>Q!Lunq@xf93%lKpz|>3Ok8)7^e{f!w;}RPKr6cJIL&sCYfHJ zLNl+M(v0g?H2pP4n)aF}ncN5>;~Oz#bTf?%Zx+*(TMab%)>4{uYXj-OzMtv6ewp-c zeL;FRe`b2G{Q(5-1?zF$E#CwWXvg0kQ2t?}WN3$%BYHd)%m5a^p6C}(5DHR2DZtI=7Yw*35PJflU$25U{-F{2CAj9& z(dUt9b8l$dLwojrkppsqL`qZ#ssAz zPz_o@H|PfgU_BEQH-k|U6vx0pZ~|PQzZ7rMABrE*Z;B7-vEncElcGRBDhc$1lE8jY z{=W!@@Ei<{VdnsSltp(A%3@D~rZ>tH&IGk&Cdl(ZC1?a4pckwHLtrD=#{QD;Vt>f@ zv#0W-^t=2l{VKmskL4fGkMjHUo%}I9lnd+u%%uAhs0r+wmk>zxnVeA`e-frdvp*-LvEK{|*b{>)_Ot#X_M?6W`$4~#JUi4%}82f2jB70<#%^n(;vTuxQ+1JJ`>`UV=_JwgD`^;z! z`_yQdeQdOuePpzg-8CL(?;D@s-Zj3+y>0v-?vBaV+%1!z`PZfiqHEIx@zrU9cJKfkP!30J`pteSJ+d{Uujkp)CpMn+flU~_ZJo&8u+HXg zS(R`%tg89zR*U$nmWxG~EtiTeS*{enYPnW?!E!`$&T@z3jODoGwB4 z&@HC`cFi%GU2;t2E;!`z=j_WwXY6aluh=z7PTF-ykK6T1kJ+wLIAS}jc-VG};z8Rz zO5?Uil=s_SP~L0%mhx`9`zkx^ewB^dVFcL=@~!_uu$RJz;*b-=(~s~0zVTF~FWuzy z?gAZp-QAR~df3sc9^UMXM;Ld~J%K;wmLWQ_pg?lawL&`XTBoqzrA2YCOPA6f=RW1# z&I2ktoj1xxop;E#IUSI1bv~`S+4+|0i1Sx!>s=nJ4`UPPbztaU2u@hO=T7v<2Qi;N z;(vem55Djpe31X(XF_NEt?7in8$0Y5$Q|&F7VY&(5%2NNmhSW_Rv7iHQrhO(puEMS zO=Yvk64{9R3e^qnLu$kBThxc#_iC(lKcO+;eob?=`=^>KJ$}+!;UQ=(2mPLc=F3c2 z%fERe-yQMyyST-_j$DN6AriV61pgsq3LOodOXHzVY%Ii=+Zh}t+8z`y*%FwpFcOfb zxWT_vdDyR7HsrfVKIpqxb&XH2`YN9_8Y_G@YWDl=(pu(oM7!7LlFm|}yE;pJzt`#V z{Syc}oqmG$%V4=9Jw*LK3`5)-g-i}d6+MFfd9 zghxx(g(WKthGr?P2`N-r8C)S>9#p5=7u2HO8`!PU6SzXFJ78G5GhkGAalk>n_JH$x zZGrFTw*-Ex*BtZ*5OkaVMhC}dAmx$13dUM@=wFYAegfv%@z`%K7JClF>Cle&8MGzd zhHZ>nzzxOviw0sMB&(w16_!V)DJ_f4RaqKQB3}}|P^~kpQDbpfhh|%7pLR>=THU75 zEqaY1`}G?_&luE&-Z7{RePB=<_Pc%!z9b�o@n;>WdtZaO}GfhnO=Nv41LJ4Lox9 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�Xu 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

9%1B-(u}Adzs- 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�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�O_SeNOq1ecu{_&uH?CCdi>|#_;Tj)d?3XLdE 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�PC@KfBP(GCl6s@Xr^>?l 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 z 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

j#n(+CU!`KvWg8Mgxg+#i5 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 Date: Wed, 13 Dec 2023 09:15:32 -0300 Subject: [PATCH 109/428] Fix image path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da0f96ef4..3fb785034 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). -Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md From 9bbe4092fc384ba36f521c32f50aa2d92ea374ac Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:16:23 -0300 Subject: [PATCH 110/428] Reduce image size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3fb785034..5287e846b 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). -Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency.
[Vienna Business Agency](https://viennabusinessagency.at/) [Design Principles]: ./doc/design-principles.md From 0a2c80e416ff12b4c49c559ae5c1b5ffdbc7122a Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 13:40:32 +0100 Subject: [PATCH 111/428] fix the test --- examples/cosmos/bank/bankTest.qnt | 7 ++----- examples/cosmos/bank/cosmos-bank.md | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 3a6b57464..3f886b50f 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -37,18 +37,15 @@ module bankTest { // tests run getAllBalancesTest = { init - .then( + .expect( val ctx = stateToCtx(0) val kings = ViewKeeper::GetAllBalances(ctx, "king") val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") - all { + and { assert(kings.keys() == Set("banana", "burger")), assert(kings.get("banana") == 10_000), assert(kings.get("burger") == 10_000), assert(donkeys.keys() == Set()), - // do not change the state - balances' = balances, - supply' = supply, } ) } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index d0f1219b5..11c0b1c25 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -368,18 +368,15 @@ For example, we expect the `GetAllBalances` to return balances in the genesis st ```bluespec "tests" += run getAllBalancesTest = { init - .then( + .expect( val ctx = stateToCtx(0) val kings = ViewKeeper::GetAllBalances(ctx, "king") val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") - all { + and { assert(kings.keys() == Set("banana", "burger")), assert(kings.get("banana") == 10_000), assert(kings.get("burger") == 10_000), assert(donkeys.keys() == Set()), - // do not change the state - balances' = balances, - supply' = supply, } ) } From 65ef33dcfde036718d134b89a965f14e5b6a7427 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 14:38:46 +0100 Subject: [PATCH 112/428] add step --- examples/cosmos/bank/bankTest.qnt | 52 ++++++++++++++++++- examples/cosmos/bank/cosmos-bank.md | 80 ++++++++++++++++++++++++++++- 2 files changed, 130 insertions(+), 2 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 3f886b50f..68112aed1 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -6,6 +6,12 @@ module bankTest { var supply: Denom -> Int256 // Balances for each address var balances: Addr -> Coins + // if non-empty, then it stores the last error message + var _lastError: str + // all addresses we would like to work with + pure val ADDR = Set("king", "donkeykong", "peaches", "mario") + // all denominations + pure val DENOM = Set("banana", "burger") // state transitions of the machine // initialize the state machine @@ -13,7 +19,35 @@ module bankTest { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", + } + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } + } + + + action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) } // protocol invariants @@ -62,4 +96,20 @@ module bankTest { } } } + run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Set("banana").mapBy(d => 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") + } } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 11c0b1c25..b6012093b 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -219,6 +219,16 @@ We represent this field as a map in the protocol specification: var balances: Addr -> Coins ``` +For protocol debugging purposes, we introduce a state variable that keeps +the last error message. It makes it easier to write tests. To indicate that +this variable is not, strictly speaking, part of the protocol, we start its +name with underscore: + +```bluespec "state" += +// if non-empty, then it stores the last error message +var _lastError: str +``` + We could initialize the state via `init`, which would be similar to executing genesis transactions in Cosmos: @@ -228,7 +238,8 @@ action init = all { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", } ``` @@ -553,6 +564,48 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, ``` +```bluespec "transitions" += +action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } +} +``` + +Here is a basic test of `send`: + +```bluespec "tests" += +run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Set("banana").mapBy(d => 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") +} +``` + - `InputOutputCoins` performs multi-send functionality. It accepts a series of inputs that correspond to a series of outputs. It returns an error if the inputs and outputs don't lineup or if any single transfer of tokens fails. @@ -655,5 +708,30 @@ type Params = { } ``` +### Appendix + +This part contains technical parts of the specification that are not that +interesting. + +```bluespec "state" += +// all addresses we would like to work with +pure val ADDR = Set("king", "donkeykong", "peaches", "mario") +// all denominations +pure val DENOM = Set("banana", "burger") +``` + +```bluespec "transitions" += + + +action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) +} +``` + + [bank module]: https://docs.cosmos.network/v0.46/modules/bank/# [lmt]: https://github.com/driusan/lmt From aaa3b718093400b3063c27a6aecab601be6586d5 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 14:39:18 +0100 Subject: [PATCH 113/428] introduce type defences (#1306) --- quint/src/runtime/impl/runtimeValue.ts | 26 +++++++++++++++----------- quint/test/repl.test.ts | 6 +++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/quint/src/runtime/impl/runtimeValue.ts b/quint/src/runtime/impl/runtimeValue.ts index a7ecfde25..250e8350e 100644 --- a/quint/src/runtime/impl/runtimeValue.ts +++ b/quint/src/runtime/impl/runtimeValue.ts @@ -488,19 +488,23 @@ abstract class RuntimeValueBase implements RuntimeValue { } toSet(): Set { - // the default transformation to a set is done via iteration - let set = Set.of() - for (const e of this) { - set = set.add(e.normalForm()) + if (this.isSetLike) { + // the default transformation to a set is done via iteration + let set = Set.of() + for (const e of this) { + set = set.add(e.normalForm()) + } + return set + } else { + throw new Error('Expected a set-like value') } - return set } toList(): List { if (this instanceof RuntimeValueTupleOrList) { return this.list } else { - return List() + throw new Error('Expected a list value') } } @@ -508,7 +512,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueRecord) { return this.map } else { - return OrderedMap() + throw new Error('Expected a record value') } } @@ -516,7 +520,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueMap) { return this.map } else { - return Map() + throw new Error('Expected a map value') } } @@ -524,7 +528,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueBool) { return (this as RuntimeValueBool).value } else { - return false + throw new Error('Expected a Boolean value') } } @@ -532,7 +536,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueInt) { return (this as RuntimeValueInt).value } else { - return 0n + throw new Error('Expected an integer value') } } @@ -540,7 +544,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueStr) { return (this as RuntimeValueStr).value } else { - return '' + throw new Error('Expected a string value') } } diff --git a/quint/test/repl.test.ts b/quint/test/repl.test.ts index 8b9e3e357..128b7006b 100644 --- a/quint/test/repl.test.ts +++ b/quint/test/repl.test.ts @@ -148,7 +148,11 @@ describe('repl ok', () => { |^^^^^^^^^ | | - |1 + |runtime error: error: [QNT501] Expected an integer value + |1 + false + |^^^^^^^^^ + | + | |>>> ` ) await assertRepl(input, output) From 706d61c899a91f46edeaf664edbaabdfab401fa7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 10:41:57 -0300 Subject: [PATCH 114/428] Format features differently --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5287e846b..d0621af49 100644 --- a/README.md +++ b/README.md @@ -84,13 +84,13 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features -- A simple and familiar **syntax** to support engineers reading and writing specifications -- An expressive **type systems** to ensure the domain model is coherent -- A novel **effect system** to ensure state updates are coherent -- **IDE support** via LSP, giving real time feedback when writing specifications -- A **REPL** enabling interactive exploration of specifications -- A **simulator** enabling tests, trace generation, and exploration of your system -- **Symbolic model checking** to verify your specifications via [Apalache][apalache] +- A simple and familiar **syntax** :: to support engineers reading and writing specifications +- An expressive **type systems** :: to ensure the domain model is coherent +- A novel **effect system** :: to ensure state updates are coherent +- **IDE support** via LSP :: giving real time feedback when writing specifications +- A **REPL** :: enabling interactive exploration of specifications +- A **simulator** :: enabling tests, trace generation, and exploration of your system +- **Symbolic model checking** :: to verify your specifications via [Apalache][apalache] ### Motivation From 232f02cf9a898f62181540d4d94c6800406a3dcc Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 10:57:58 -0300 Subject: [PATCH 115/428] Use definitions for features --- README.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d0621af49..1091d2cb3 100644 --- a/README.md +++ b/README.md @@ -83,14 +83,28 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features +

+
A simple and familiar syntax
+
to support engineers reading and writing specifications
-- A simple and familiar **syntax** :: to support engineers reading and writing specifications -- An expressive **type systems** :: to ensure the domain model is coherent -- A novel **effect system** :: to ensure state updates are coherent -- **IDE support** via LSP :: giving real time feedback when writing specifications -- A **REPL** :: enabling interactive exploration of specifications -- A **simulator** :: enabling tests, trace generation, and exploration of your system -- **Symbolic model checking** :: to verify your specifications via [Apalache][apalache] +
An expressive **type systems**
+
to ensure the domain model is coherent
+ +
A novel **effect system**
+
to ensure state updates are coherent
+ +
**IDE support** via LSP
+
giving real time feedback when writing specifications
+ +
A **REPL**
+
enabling interactive exploration of specifications
+ +
A **simulator**
+
enabling tests, trace generation, and exploration of your system
+ +
**Symbolic model checking**
+
to verify your specifications via [Apalache][apalache]
+
### Motivation From fee1e156b264388e64f062b1eaec878170113e33 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 11:04:08 -0300 Subject: [PATCH 116/428] Add simpler example --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1091d2cb3..014e5f667 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,45 @@ development tooling. Here's some example code in Quint: +``` bluespec +module tictactoe { + type Player = X | O + type Square = Occupied(Player) | Empty + + /// A 3x3 tic-tac-toe board + var board: int -> (int -> Square) + + /// Coordinates for board corners + pure val corners = Set((1,1), (3,1), (1,3), (3,3)) + + def square(coordinate: (int, int)): Square = + board.get(coordinate._1).get(coordinate._2) + + def isEmpty(coordinate) = match square(coordinate) { + | Empty => true + | _ => false + } + + /// A player makes a move on a board coordinate, if it is empty + action Move(player, coordinate) = all { + isEmpty(coordinate), + board' = board.setBy( + coordinate._1, + row => row.set(coordinate._2, Occupied(player)) + ), + } + + /// Nondeterministically pick a corner, and player X makes a move on that corner + action StartInCorner = + nondet corner = oneOf(corners) + Move(X, corner) +} +``` + +
+A comparisson between Quint and TLA+ code + +Quint: ```bluespec type Status = Working | Prepared | Committed | Aborted @@ -61,9 +100,7 @@ action prepare(rm) = all { } ``` -
-The equivalent TLA+ code - +TLA+: ```tla CONSTANT ResourceManagers VARIABLE statuses From a034e158214615f59759e9cb2f4def91a092d033 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 12:06:05 -0300 Subject: [PATCH 117/428] Fix bold inside HTML --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 014e5f667..e0f971652 100644 --- a/README.md +++ b/README.md @@ -124,22 +124,22 @@ Prepare(rm) == /\ statuses[rm] = "working"
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive **type systems**
+
An expressive type systems
to ensure the domain model is coherent
-
A novel **effect system**
+
A novel effect system
to ensure state updates are coherent
-
**IDE support** via LSP
+
IDE support via LSP
giving real time feedback when writing specifications
-
A **REPL**
+
A REPL
enabling interactive exploration of specifications
-
A **simulator**
+
A simulator
enabling tests, trace generation, and exploration of your system
-
**Symbolic model checking**
+
Symbolic model checking
to verify your specifications via [Apalache][apalache]
From ce4a039c9965df16ae47669749baacb3239529ab Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 12:07:19 -0300 Subject: [PATCH 118/428] Move comparisson to motivation section --- README.md | 83 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index e0f971652..61f7caa61 100644 --- a/README.md +++ b/README.md @@ -77,47 +77,6 @@ module tictactoe { } ``` -
-A comparisson between Quint and TLA+ code - -Quint: -```bluespec -type Status = Working | Prepared | Committed | Aborted - -const ResourceManagers: Set[str] -var statuses: str -> Status - -action init = { - statuses' = ResourceManagers.mapBy(_ => Working) -} - -val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) -val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) - -action prepare(rm) = all { - statuses.get(rm) == Working, - statuses' = statuses.set(rm, Prepared) -} -``` - -TLA+: -```tla -CONSTANT ResourceManagers -VARIABLE statuses - -TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] - -TCInit == statuses = [rm \in ResourceManagers |-> "working"] - -canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} - -notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" - -Prepare(rm) == /\ statuses[rm] = "working" - /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] -``` - -
### Features
@@ -162,6 +121,48 @@ The syntax also aims to be familiar to engineers: Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in. +
+A comparisson between Quint and TLA+ code + +Quint: +```bluespec +type Status = Working | Prepared | Committed | Aborted + +const ResourceManagers: Set[str] +var statuses: str -> Status + +action init = { + statuses' = ResourceManagers.mapBy(_ => Working) +} + +val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) +val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) + +action prepare(rm) = all { + statuses.get(rm) == Working, + statuses' = statuses.set(rm, Prepared) +} +``` + +TLA+: +```tla +CONSTANT ResourceManagers +VARIABLE statuses + +TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] + +TCInit == statuses = [rm \in ResourceManagers |-> "working"] + +canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} + +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" + +Prepare(rm) == /\ statuses[rm] = "working" + /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] +``` + +
+ To learn more about Quint's motivation and design philosophy, watch this [15 minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to Cosmos in 2023. From 40dd6edc6ec5da52372d92740405f9786f579d4a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 12:35:58 -0500 Subject: [PATCH 119/428] Add roadmap to documentation section --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 61f7caa61..d239a4228 100644 --- a/README.md +++ b/README.md @@ -202,8 +202,9 @@ Cosmos in 2023. - [CLI manual](./doc/quint.md) - [Literate executable specifications](./doc/literate.md) -- [Design Principles][] - +- Development plans: + - [Design Principles](./doc/design-principles.md) + - [Roadmap](./doc/roadmap.md) ## Community From 3b6911498582025a29266f7634ca5a1a335d2118 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 12:44:48 -0500 Subject: [PATCH 120/428] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d239a4228..a429cc93f 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in.
-A comparisson between Quint and TLA+ code +A comparison between Quint and TLA+ code Quint: ```bluespec From 17e89663f952c018440706e6c09e51a77dd6ca7e Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 17:54:19 -0300 Subject: [PATCH 121/428] Add secret santa example :santa: --- .../puzzles/secret-santa/secret_santa.qnt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 examples/puzzles/secret-santa/secret_santa.qnt diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt new file mode 100644 index 000000000..cbb036e9c --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -0,0 +1,34 @@ +module secret_santa { + const names: Set[str] + + /// giftees.get(A) == B if A is B's secret santa + var giftees: str -> str + + /// the bowl of names, containg a paper piece for each participant with their name + var bowl: Set[str] + + action init = all { + giftees' = Map(), + bowl' = names, + } + + action step = all { + bowl.size() > 0, + nondet picker = names.filter(name => not(giftees.keys().contains(name))).oneOf() + nondet giftee = bowl.oneOf() + all { + giftees' = giftees.put(picker, giftee), + bowl' = bowl.exclude(Set(giftee)), + } + } + + val everyone_gets_a_santa = bowl.size() == 0 implies (names == giftees.keys().map(k => giftees.get(k))) + + val no_person_gets_themself = names.forall(name => + giftees.keys().contains(name) implies giftees.get(name) != name + ) +} + +module quint_team_secret_santa { + import secret_santa(names = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} From ebfa66daa2d86776b8607d7720c1b236ac8b3724 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 18:13:46 -0300 Subject: [PATCH 122/428] Rename many things --- .../puzzles/secret-santa/secret_santa.qnt | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index cbb036e9c..60d733a27 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -1,34 +1,40 @@ module secret_santa { - const names: Set[str] + import commonSpells.* from "../../spells/commonSpells" - /// giftees.get(A) == B if A is B's secret santa - var giftees: str -> str + const participants: Set[str] - /// the bowl of names, containg a paper piece for each participant with their name + /// person_to_gift.get(A) == B if A is B's secret santa + var person_to_gift: str -> str + + /// the bowl of participants, containg a paper piece for each participant with their participant var bowl: Set[str] action init = all { - giftees' = Map(), - bowl' = names, + person_to_gift' = Map(), + bowl' = participants, } - action step = all { - bowl.size() > 0, - nondet picker = names.filter(name => not(giftees.keys().contains(name))).oneOf() - nondet giftee = bowl.oneOf() + action draw_name(picker: str): bool = { + nondet drawed_name = bowl.oneOf() all { - giftees' = giftees.put(picker, giftee), - bowl' = bowl.exclude(Set(giftee)), + person_to_gift' = person_to_gift.put(picker, drawed_name), + bowl' = bowl.exclude(Set(drawed_name)), } } - val everyone_gets_a_santa = bowl.size() == 0 implies (names == giftees.keys().map(k => giftees.get(k))) + action step = all { + bowl.size() > 0, + nondet picker = participants.filter(participant => not(participant.in(person_to_gift.keys()))).oneOf() + draw_name(picker) + } + + val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = names.forall(name => - giftees.keys().contains(name) implies giftees.get(name) != name + val no_person_gets_themself = participants.forall(participant => + participant.in(person_to_gift.keys()) implies person_to_gift.get(participant) != participant ) } module quint_team_secret_santa { - import secret_santa(names = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } From fcbe7e8548979e42334a15043bacbbee43365729 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 18:39:35 -0300 Subject: [PATCH 123/428] Draft exploration scenarios --- .../puzzles/secret-santa/secret_santa.qnt | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index 60d733a27..9ed480a5e 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -30,11 +30,63 @@ module secret_santa { val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = participants.forall(participant => - participant.in(person_to_gift.keys()) implies person_to_gift.get(participant) != participant + val no_person_gets_themself = person_to_gift.keys().forall(participant => + person_to_gift.get(participant) != participant ) } module quint_team_secret_santa { import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } + +// Below here, more complex things that might be interesting for a tutorial. +// This is not in the state I want it to be yet, which should be: +// 1. the version with redraw should show that, if the last person picks themself, theres's no solution +// - Additionally, it would be nice to show that you can find information about who is your secret santa in this method. +// That is, if you pick yourself and redraw, but there is only one person after you, you know that person will be your (non)secret santa. +// 2. the version with reset should show that, eventually, the game is valid (no one gets themselves) + +module secret_santa_with_redraw { + // When a participant draws themself, they put their name back and draw again + + import basicSpells.* from "../../spells/basicSpells" + import secret_santa.* + export secret_santa.* + + action step_with_redraw = + val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) + if (participants_who_got_themselves.size() > 0) { + nondet participant = participants_who_got_themselves.oneOf() + all { + bowl' = bowl.union(Set(participant)), + person_to_gift' = person_to_gift.mapRemove(participant), + } + } else { + step + } + + val inv = bowl.size() == 0 implies no_person_gets_themself +} + +module secret_santa_with_reset { +// When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa.* + export secret_santa.* + + action step_with_reset = + if (person_to_gift.keys().exists(participant => person_to_gift.get(participant) == participant)) { + init + } else { + step + } + + val inv = bowl.size() == 0 implies no_person_gets_themself +} + +// module quint_team_secret_santa { +// import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } + +// module quint_team_secret_santa { +// import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } From 33259b6d8b3aa4c5dcca5087131688bdc576741b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 20:28:23 -0500 Subject: [PATCH 124/428] Clean up whitespace and move FAQ section --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a429cc93f..6a2c5218e 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,18 @@

- build badge - Visual Studio Marketplace Version - npm (scoped)

@@ -155,7 +155,7 @@ TCInit == statuses = [rm \in ResourceManagers |-> "working"] canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} -notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" Prepare(rm) == /\ statuses[rm] = "working" /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] @@ -186,8 +186,6 @@ Cosmos in 2023. ## Documentation -- [Frequently asked questions](./doc/faq.md) - - Quint by example: - [Cheatsheet](./doc/quint-cheatsheet.pdf) - [Language tutorials](./tutorials/README.md) @@ -206,10 +204,13 @@ Cosmos in 2023. - [Design Principles](./doc/design-principles.md) - [Roadmap](./doc/roadmap.md) +- Miscellaneous + - [Frequently asked questions](./doc/faq.md) + ## Community - Join the chat in the [Quint zulip stream][] -- Join the [Quint discussions][] +- Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell][] to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint @@ -270,5 +271,4 @@ Supported by the Vienna Business Agency.
[Vienna Business Agency Date: Thu, 14 Dec 2023 10:21:11 -0300 Subject: [PATCH 125/428] Add test and improve exploration scenarios --- .../puzzles/secret-santa/secret_santa.qnt | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index 9ed480a5e..2ba6db93c 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -14,12 +14,14 @@ module secret_santa { bowl' = participants, } + action assign_santa(p1: str, p2:str): bool = all { + person_to_gift' = person_to_gift.put(p1, p2), + bowl' = bowl.exclude(Set(p2)), + } + action draw_name(picker: str): bool = { nondet drawed_name = bowl.oneOf() - all { - person_to_gift' = person_to_gift.put(picker, drawed_name), - bowl' = bowl.exclude(Set(drawed_name)), - } + assign_santa(picker, drawed_name) } action step = all { @@ -30,14 +32,14 @@ module secret_santa { val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = person_to_gift.keys().forall(participant => + val no_person_gets_themself = person_to_gift.keys().forall(participant => person_to_gift.get(participant) != participant ) } -module quint_team_secret_santa { - import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -} +// module quint_team_secret_santa { +// import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } // Below here, more complex things that might be interesting for a tutorial. // This is not in the state I want it to be yet, which should be: @@ -53,19 +55,27 @@ module secret_santa_with_redraw { import secret_santa.* export secret_santa.* + action redraw(participant: str): bool = { + nondet new_name = bowl.oneOf() + all { + bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), + person_to_gift' = person_to_gift.set(participant, new_name), + } + } + action step_with_redraw = val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) if (participants_who_got_themselves.size() > 0) { nondet participant = participants_who_got_themselves.oneOf() - all { - bowl' = bowl.union(Set(participant)), - person_to_gift' = person_to_gift.mapRemove(participant), - } + redraw(participant) } else { step } val inv = bowl.size() == 0 implies no_person_gets_themself + + // We need fairness for this to work + temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) } module secret_santa_with_reset { @@ -81,11 +91,23 @@ module secret_santa_with_reset { } val inv = bowl.size() == 0 implies no_person_gets_themself + + // We need fairness for this to work + temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) } -// module quint_team_secret_santa { -// import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } +module quint_team_secret_santa { + import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* + + run finding_out_my_santa_Test = init + .then(assign_santa("Igor", "Jure")) + .then(assign_santa("Thomas", "Shon")) + .then(assign_santa("Jure", "Igor")) + .then(assign_santa("Gabriela", "Gabriela")) + .then(redraw("Gabriela")) + .then(draw_name("Shon")) + .expect(person_to_gift.get("Shon") == "Gabriela") +} // module quint_team_secret_santa { // import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* From 05c32299c88a7fac43fd3c74ab85b0b5ec62db4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 14 Dec 2023 18:05:41 -0300 Subject: [PATCH 126/428] Add secret santa example to the README --- README.md | 88 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6a2c5218e..0686d1a91 100644 --- a/README.md +++ b/README.md @@ -43,40 +43,82 @@ development tooling. Here's some example code in Quint: ``` bluespec -module tictactoe { - type Player = X | O - type Square = Occupied(Player) | Empty +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + import commonSpells.* from "../../spells/commonSpells" - /// A 3x3 tic-tac-toe board - var board: int -> (int -> Square) + const participants: Set[str] - /// Coordinates for board corners - pure val corners = Set((1,1), (3,1), (1,3), (3,3)) + /// santa_for.get(A) == B if A is B's secret santa + var santa_for: str -> str - def square(coordinate: (int, int)): Square = - board.get(coordinate._1).get(coordinate._2) + /// the bowl of participants, containig a paper piece for each participant name + var bowl: Set[str] - def isEmpty(coordinate) = match square(coordinate) { - | Empty => true - | _ => false + action init = all { + santa_for' = Map(), + bowl' = participants, } - /// A player makes a move on a board coordinate, if it is empty - action Move(player, coordinate) = all { - isEmpty(coordinate), - board' = board.setBy( - coordinate._1, - row => row.set(coordinate._2, Occupied(player)) - ), + action draw_name(picker: str): bool = { + nondet drawed_name = bowl.oneOf() + all { + santa_for' = santa_for.put(picker, drawed_name), + bowl' = bowl.setRemove(drawed_name), + } } - /// Nondeterministically pick a corner, and player X makes a move on that corner - action StartInCorner = - nondet corner = oneOf(corners) - Move(X, corner) + action step = all { + bowl.size() > 0, + nondet picker = participants.filter(participant => not(participant.in(santa_for.keys()))).oneOf() + draw_name(picker) + } + + val everyone_gets_a_santa = bowl.size() == 0 implies participants == santa_for.mapValuesSet() + + val no_person_gets_themself = santa_for.keys().forall(participant => + santa_for.get(participant) != participant + ) +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } ``` +
+Checking if everyone gets a santa +Quint (with the help of [Apalache][apalache]) can check if, when the bowl gets empty, every participant has a santa! No kids crying at revelation :gift:. +``` bluespec +quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json +[ok] No violation found (2119ms). +You may increase --max-steps. +``` +
+ +
+Checking if no one gets themself +This specification has no safe guards agains people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. +``` bluespec +quint verify secret_santa.qnt --invariant=no_person_gets_themself --main=quint_team_secret_santa +An example execution: + +[State 0] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::santa_for: Map() +} + +[State 1] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::santa_for: Map("Gabriela" -> "Gabriela") +} + +[violation] Found an issue (2047ms). +error: found a counterexample +``` +
### Features
From 90ca9db0be4100d06925af0cf96cdfb568cf717f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:08:40 -0500 Subject: [PATCH 127/428] More santas in the santa spec --- README.md | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0686d1a91..6145924da 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -Here's some example code in Quint: +Here's some example code in Quint :mrs_claus: :gift: :santa: : ``` bluespec module secret_santa { @@ -49,36 +49,42 @@ module secret_santa { const participants: Set[str] - /// santa_for.get(A) == B if A is B's secret santa - var santa_for: str -> str + /// get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str - /// the bowl of participants, containig a paper piece for each participant name + /// the bowl of participants, containig a paper piece for each participant name var bowl: Set[str] + val santas = recipient_for_santa.keys() + val recipients = recipient_for_santa.mapValuesSet() + + /// The initial state action init = all { - santa_for' = Map(), - bowl' = participants, + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl } - action draw_name(picker: str): bool = { - nondet drawed_name = bowl.oneOf() + action draw_recipient(santa: str): bool = { + nondet recipient = bowl.oneOf() all { - santa_for' = santa_for.put(picker, drawed_name), - bowl' = bowl.setRemove(drawed_name), + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), } } action step = all { bowl.size() > 0, - nondet picker = participants.filter(participant => not(participant.in(santa_for.keys()))).oneOf() - draw_name(picker) + nondet next_santa = participants.filter(p => not(p.in(santas))).oneOf() + draw_recipient(next_santa) } - val everyone_gets_a_santa = bowl.size() == 0 implies participants == santa_for.mapValuesSet() + val everyone_gets_a_santa = bowl.size() == 0 implies participants == recipients - val no_person_gets_themself = santa_for.keys().forall(participant => - santa_for.get(participant) != participant + val no_person_is_self_santa = santas.forall(person => + get(recipient_for_santa, person) != person ) + + val invariant = everyone_gets_a_santa and no_person_is_self_santa } module quint_team_secret_santa { From 001d3101ac51d6e6c3c5e7f37b45023f07d2ac52 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:12:09 -0500 Subject: [PATCH 128/428] Update verification examples --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6145924da..360554922 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,8 @@ module quint_team_secret_santa {
Checking if everyone gets a santa -Quint (with the help of [Apalache][apalache]) can check if, when the bowl gets empty, every participant has a santa! No kids crying at revelation :gift:. +Quint (with the help of [Apalache][apalache]) can check to ensure that after the bowl is +empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. ``` bluespec quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json [ok] No violation found (2119ms). @@ -104,21 +105,23 @@ You may increase --max-steps.
Checking if no one gets themself -This specification has no safe guards agains people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. +This specification has no safeguards against people being their own santa! Quint +(with the help of [Apalache][apalache]) can easily find a minimal example where +this happens. Sorry kids, I hope you don't mind buying your own present :cry:! ``` bluespec -quint verify secret_santa.qnt --invariant=no_person_gets_themself --main=quint_team_secret_santa +quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa An example execution: [State 0] { quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), - quint_team_secret_santa::secret_santa::santa_for: Map() + quint_team_secret_santa::secret_santa::recipient_for_santa: Map() } [State 1] { quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), - quint_team_secret_santa::secret_santa::santa_for: Map("Gabriela" -> "Gabriela") + quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") } [violation] Found an issue (2047ms). From d2a938b0d2c46498f368a9160b829c0a8e8e3a1d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:12:24 -0500 Subject: [PATCH 129/428] Fix link and use strong instaed of b See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b > If you wish to indicate an element is of special importance, you > should use the element. --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 360554922..c6cf65fab 100644 --- a/README.md +++ b/README.md @@ -131,26 +131,26 @@ error: found a counterexample ### Features
-
A simple and familiar syntax
+
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive type systems
+
An expressive type systems
to ensure the domain model is coherent
-
A novel effect system
+
A novel effect system
to ensure state updates are coherent
-
IDE support via LSP
+
IDE support via LSP
giving real time feedback when writing specifications
-
A REPL
+
A REPL
enabling interactive exploration of specifications
-
A simulator
+
A simulator
enabling tests, trace generation, and exploration of your system
-
Symbolic model checking
-
to verify your specifications via [Apalache][apalache]
+
Symbolic model checking
+
to verify your specifications via Apalache
### Motivation From 53b13316c46fe27c7532d56429ebe3bddfeb4a85 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:32:44 -0500 Subject: [PATCH 130/428] Move documentation links into doc/README.md --- README.md | 25 +------------------------ doc/README.md | 20 ++++++++++++++++++++ tutorials/repl/repl.md | 2 +- 3 files changed, 22 insertions(+), 25 deletions(-) create mode 100644 doc/README.md diff --git a/README.md b/README.md index c6cf65fab..4907ec387 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

Installation • - Documentation • + DocumentationCommunity

@@ -235,29 +235,6 @@ Cosmos in 2023. 3. _Optionally_, you may also install the [VSCode plugin for visualizing traces](https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer). -## Documentation - -- Quint by example: - - [Cheatsheet](./doc/quint-cheatsheet.pdf) - - [Language tutorials](./tutorials/README.md) - - [REPL tutorial](./tutorials/repl/repl.md) - - [Example specifications](./examples) - -- Language reference: - - [Syntax documentation](./doc/lang.md) - - [Reference API documentation for built-in operators](./doc/builtin.md) - -- Tooling manuals - - [CLI manual](./doc/quint.md) - - [Literate executable specifications](./doc/literate.md) - -- Development plans: - - [Design Principles](./doc/design-principles.md) - - [Roadmap](./doc/roadmap.md) - -- Miscellaneous - - [Frequently asked questions](./doc/faq.md) - ## Community - Join the chat in the [Quint zulip stream][] diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000..694a3f972 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,20 @@ +# Documentation + +## Language + +- [Language tutorials](./tutorials/README.md) +- [Syntax specification](./doc/lang.md) +- [Cheatsheet](./doc/quint-cheatsheet.pdf) +- [API documentation for built-in operators](./doc/builtin.md) + +## Tooling + +- [REPL tutorial](./tutorials/repl/repl.md) +- [CLI manual](./doc/quint.md) +- [Literate executable specifications](./doc/literate.md) + +## Design and Development + +- [Design Principles](./doc/design-principles.md) +- [Roadmap](./doc/roadmap.md) +- [Frequently asked questions](./doc/faq.md) diff --git a/tutorials/repl/repl.md b/tutorials/repl/repl.md index 66757d574..54069bcf7 100644 --- a/tutorials/repl/repl.md +++ b/tutorials/repl/repl.md @@ -40,7 +40,7 @@ state machine that describes how it works from the user's point of view: ## 1. Installation -You have to install `quint` first. See [README](../quint/README.md). +You have to install `quint` first. See the [README](../../README.md#installation). ## 2. Running REPL From 913cbe64301951a4519be0f769673d57a808bdee Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:33:52 -0500 Subject: [PATCH 131/428] Fix link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4907ec387..661a58b52 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

Installation • - Documentation • + DocumentationCommunity

From 4b2915749e5500d749de2f56741191157ce9928e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:43:44 -0500 Subject: [PATCH 132/428] Fix the links --- README.md | 55 +++++++------------------------------------------------ 1 file changed, 7 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 661a58b52..10db03201 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,9 @@ error: found a counterexample ```
+[Apalache]: https://github.com/informalsystems/apalache +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions + ### Features
A simple and familiar syntax
@@ -218,6 +221,8 @@ To learn more about Quint's motivation and design philosophy, watch this [15 minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to Cosmos in 2023. +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html + ## Installation 1. Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): @@ -237,9 +242,9 @@ Cosmos in 2023. ## Community -- Join the chat in the [Quint zulip stream][] +- Join the chat in the [Quint zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) -- [Contribute your spell][] to the collection of Quint spells +- [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint ## On "Quint" @@ -254,49 +259,3 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). Supported by the Vienna Business Agency.
[Vienna Business Agency](https://viennabusinessagency.at/) - - -[Design Principles]: ./doc/design-principles.md -[Apalache]: https://github.com/informalsystems/apalache -[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler -[Imports]: ./doc/lang.md#imports-1 -[Module definitions]: ./doc/lang.md#module-definition -[Constant declarations]: ./doc/lang.md#constant-declarations -[Assumptions]: ./doc/lang.md#assumptions -[Variable definitions]: ./doc/lang.md#variable-definitions -[Operator definitions]: ./doc/lang.md#variable-definitions -[Module instances]: ./doc/lang.md#module-instances -[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators -[Booleans]: ./doc/lang.md#boolean-operators-and-equality -[Integers]: ./doc/lang.md#integers -[Sets]: ./doc/lang.md#sets -[Lists]: ./doc/lang.md#lists-aka-sequences -[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions -[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions -[if-then-else]: ./doc/lang.md#condition -[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice -[Maps]: ./doc/lang.md#maps-aka-functions -[Records]: ./doc/lang.md#records -[Tuples]: ./doc/lang.md#tuples -[Sum types]: ./doc/lang.md#sum-types -[Delayed assignment]: ./doc/lang.md#delayed-assignment -[Runs]: ./doc/lang.md#runs -[Temporal operators]: ./doc/lang.md#temporal-operators -[Fairness]: ./doc/lang.md#fairness -[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers -[Modes]: ./doc/lang.md#modes -[Spells]: ./examples/spells/README.md -[Contribute your spell]: ./examples/spells/contribute-your-spell.md -[539]: https://github.com/informalsystems/quint/issues/539 -[221]: https://github.com/informalsystems/quint/issues/221 -[235]: https://github.com/informalsystems/quint/issues/235 -[8]: https://github.com/informalsystems/quint/issues/8 -[1034]: https://github.com/informalsystems/quint/issues/1034 -[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions -[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings -[TLA+]: https://lamport.azurewebsites.net/tla/tla.html -[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions -[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[Tutorials]: ./tutorials/README.md -[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint -[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html From bc902e2d6fe0c830df6a1cb3ff48ab66dbe6bc64 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:59:40 -0500 Subject: [PATCH 133/428] Add acknowledgment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 😢💜 --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 10db03201..4d401d9bd 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,16 @@ element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to become referenced artifacts. +## Acknowledgments + +Quint has been designed and developed by the [Apalache][] team: [Gabriela +Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), +[Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), +and [Thomas Pani](https://thpani.net/). :heart: + +Thanks for notable contributions goes to @romac, @p-offtermatt, @ivan-gavran, +and, @rnbguy. + --- Quint is developed at [Informal Systems](https://informal.systems/). From 97789d585669eff6fbd3469625454b5895a07acb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:02:05 -0500 Subject: [PATCH 134/428] Add empty lines before closing detail tags Othewise it breaks the closing bracket fence --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 4d401d9bd..5ea8a96da 100644 --- a/README.md +++ b/README.md @@ -94,20 +94,25 @@ module quint_team_secret_santa {
Checking if everyone gets a santa + Quint (with the help of [Apalache][apalache]) can check to ensure that after the bowl is empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. + ``` bluespec quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json [ok] No violation found (2119ms). You may increase --max-steps. ``` +
Checking if no one gets themself + This specification has no safeguards against people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. Sorry kids, I hope you don't mind buying your own present :cry:! + ``` bluespec quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa An example execution: @@ -127,6 +132,7 @@ An example execution: [violation] Found an issue (2047ms). error: found a counterexample ``` +
[Apalache]: https://github.com/informalsystems/apalache From 9b65f3c39d751d8bb87dc9f02e2dd8385a614e5a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:03:12 -0500 Subject: [PATCH 135/428] Move to heading --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ea8a96da..06e1904f6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -Here's some example code in Quint :mrs_claus: :gift: :santa: : +### Example code in Quint :mrs_claus: :gift: :santa: ``` bluespec module secret_santa { From d22598b39725254eec885d469d2dc9f9bb143f33 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:05:54 -0500 Subject: [PATCH 136/428] Use more explicit syntax `implies` isn't highlighted on github so the grouping isn't clear otherwise. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06e1904f6..248b62df3 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ module secret_santa { draw_recipient(next_santa) } - val everyone_gets_a_santa = bowl.size() == 0 implies participants == recipients + val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) val no_person_is_self_santa = santas.forall(person => get(recipient_for_santa, person) != person From b63f4f52cb2343a4c7a8a76de5ca588e2db7db58 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:12:33 -0500 Subject: [PATCH 137/428] Fix links --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 248b62df3..b981a07ce 100644 --- a/README.md +++ b/README.md @@ -267,8 +267,9 @@ Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), [Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), and [Thomas Pani](https://thpani.net/). :heart: -Thanks for notable contributions goes to @romac, @p-offtermatt, @ivan-gavran, -and, @rnbguy. +Thanks for notable contributions goes to [Romain Ruetschi](https://romac.me/), +[Philip Offtermatt](https://p-offtermatt.github.io/), [Ivan Gavran](https://ivan-gavran.github.io/), +and, [Ranadeep Biswas](https://ranadeep.in/). --- From bd32d0c513ffd8e9d0980d41b108c6e70f0a4916 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:46:11 -0500 Subject: [PATCH 138/428] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b981a07ce..6de6a0cd2 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ module secret_santa { /// get(recipient_for_santa, S) is the recipient for secret santa S var recipient_for_santa: str -> str - /// the bowl of participants, containig a paper piece for each participant name + /// the bowl of participants, containing a paper piece for each participant name var bowl: Set[str] val santas = recipient_for_santa.keys() From ea3613aef78baa49b07ee65b46971dbf656f5a5f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:50:21 -0500 Subject: [PATCH 139/428] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6de6a0cd2..a63077c95 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ module secret_santa { } action draw_recipient(santa: str): bool = { - nondet recipient = bowl.oneOf() + nondet recipient = oneOf(bowl) all { recipient_for_santa' = put(recipient_for_santa, santa, recipient), bowl' = bowl.setRemove(recipient), From baf1848d08bc6d34055f589c92004ccc8c013872 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:52:00 -0500 Subject: [PATCH 140/428] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a63077c95..f6aa13a61 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ module secret_santa { action step = all { bowl.size() > 0, - nondet next_santa = participants.filter(p => not(p.in(santas))).oneOf() + nondet next_santa = participants.exclude(santas).oneOf() draw_recipient(next_santa) } From 252814c4289a63624ceea69b01d0a774d00f4371 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:56:42 -0500 Subject: [PATCH 141/428] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6aa13a61..348c30d36 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in.
-A comparison between Quint and TLA+ code +An example that highlights differences between Quint and TLA+ Quint: ```bluespec From 83730cebf889961820b04751e5e132ab2166403f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:57:13 -0500 Subject: [PATCH 142/428] Two rephrasings --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 348c30d36..b63fd8291 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ error: found a counterexample
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive type systems
+
An expressive type system
to ensure the domain model is coherent
A novel effect system
@@ -158,7 +158,7 @@ error: found a counterexample
A simulator
enabling tests, trace generation, and exploration of your system
-
Symbolic model checking
+
A symbolic model checker
to verify your specifications via Apalache
From adb0046e887e568498fdee251ebb9874402f1f98 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:59:16 -0500 Subject: [PATCH 143/428] Fix missing link --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b63fd8291..f76c5362f 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,9 @@ error: found a counterexample Quint is inspired by [TLA+][] (the language) but provides an alternative surface syntax for specifying systems in TLA (the logic). The most important feature of our syntax is that it is minimal and regular, making Quint an easy target for -advanced developer tooling and static analysis (see our [design principles][] -and [previews](./doc/previews.md) of the tooling). +advanced developer tooling and static analysis (see our [design +principles](./doc/design-principles.md) and [previews](./doc/previews.md) of the +tooling). The syntax also aims to be familiar to engineers: From 758f08a549e7bce9b734bd74bcdbacd2ce268370 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:23:24 -0300 Subject: [PATCH 144/428] Remove `mapValuesSet` usage in example --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b63fd8291..fcdd3fa58 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ development tooling. ``` bluespec module secret_santa { import basicSpells.* from "../../spells/basicSpells" - import commonSpells.* from "../../spells/commonSpells" const participants: Set[str] @@ -56,7 +55,7 @@ module secret_santa { var bowl: Set[str] val santas = recipient_for_santa.keys() - val recipients = recipient_for_santa.mapValuesSet() + val recipients = participants.map(p => recipient_for_santa.get(p)) /// The initial state action init = all { From 4f241cd06d655433083ed0ba20cd069f9eee6073 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:25:18 -0300 Subject: [PATCH 145/428] Remove padding from logo --- logos/quint-logo.png | Bin 360413 -> 212293 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logos/quint-logo.png b/logos/quint-logo.png index 25db008ec428b2bcf473282229c8f8a8b570dca8..8331051c7813c0bb4a091e7dcbd75950b08309da 100644 GIT binary patch literal 212293 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�PR!xMI6cJOw_h)u$oCpL! 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

74rcosKM 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 NoxEX^HoClzYAvAm&8A*n^Idx&OaKx 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

4fY#%$3!sIZy^WVvi2j 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 Date: Fri, 15 Dec 2023 16:26:49 -0300 Subject: [PATCH 146/428] Reduce logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fcdd3fa58..83defed78 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

@@ -253,7 +258,7 @@ Cosmos in 2023. ## Community -- Join the chat in the [Quint zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) +- Join the chat in the [Telegram group](https://t.me/quint_lang) or in the [Zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint From 43c257f2761a8bc509cbb77bfc30ecb8436bea80 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:15:25 -0300 Subject: [PATCH 330/428] Update my website --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a20673bcd..ff6a1d059 100644 --- a/README.md +++ b/README.md @@ -285,7 +285,7 @@ become referenced artifacts. ## Acknowledgments Quint has been designed and developed by the [Apalache][] team: [Gabriela -Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), +Moreira](https://bugarela.com), [Igor Konnov](https://konnov.github.io/), [Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), and [Thomas Pani](https://thpani.net/). :heart: From e5ee5863918b0b62d75228d93c73fc360ef5c5f5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:27:34 -0300 Subject: [PATCH 331/428] Update logo --- README.md | 8 +++-- logos/quint-logo-dark.png | Bin 0 -> 17315 bytes logos/quint-logo-dark.svg | 1 + logos/quint-logo-light.png | Bin 0 -> 16157 bytes logos/quint-logo-light.svg | 1 + logos/quint-logo.png | Bin 212293 -> 0 bytes logos/quint-logo.svg | 68 ------------------------------------- 7 files changed, 7 insertions(+), 71 deletions(-) create mode 100644 logos/quint-logo-dark.png create mode 100644 logos/quint-logo-dark.svg create mode 100644 logos/quint-logo-light.png create mode 100644 logos/quint-logo-light.svg delete mode 100644 logos/quint-logo.png delete mode 100644 logos/quint-logo.svg diff --git a/README.md b/README.md index ff6a1d059..5de7beac9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@
-Quint Lang Logo -

Quint Lang

+ + + Quint Lang +

@@ -37,7 +39,7 @@

-## Overview +# The Quint specification language Quint is a modern specification language that is a particularly good fit for distributed systems, such as blockchain protocols, distributed databases, and diff --git a/logos/quint-logo-dark.png b/logos/quint-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..68ecce9ba96de3ab75852825dfcc818b41ef05da GIT binary patch literal 17315 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

Y!!s6zs~eIF34IrNWQ*yLbqMDk4V>@p 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 Bj3@vA literal 0 HcmV?d00001 diff --git a/logos/quint-logo-dark.svg b/logos/quint-logo-dark.svg new file mode 100644 index 000000000..ce1ea6852 --- /dev/null +++ b/logos/quint-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/quint-logo-light.png b/logos/quint-logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3346cdb9fc7ee186be33341f2e1daf57cb78b2e3 GIT binary patch literal 16157 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 literal 0 HcmV?d00001 diff --git a/logos/quint-logo-light.svg b/logos/quint-logo-light.svg new file mode 100644 index 000000000..199760f66 --- /dev/null +++ b/logos/quint-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/quint-logo.png b/logos/quint-logo.png deleted file mode 100644 index 8331051c7813c0bb4a091e7dcbd75950b08309da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212293 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 - - - - - - From 8868336289a57592d174b6082db6144090595a83 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Fri, 5 Apr 2024 16:32:26 -0300 Subject: [PATCH 332/428] Adjust logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5de7beac9..9b48a769c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ - Quint Lang + Quint Lang From fd3f19bf0e2769812c70b5f7531414b5e33787e7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:40:23 -0300 Subject: [PATCH 333/428] Update logo on VSCode extension --- vscode/quint-vscode/CHANGELOG.md | 3 +++ vscode/quint-vscode/quint-logo-vscode.png | Bin 3292 -> 11953 bytes 2 files changed, 3 insertions(+) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index fb5e62dec..01cbf258a 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + +- Updated the logo + ### Deprecated ### Removed ### Fixed diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png index d42c03f1f0824838fd6ba4e08a47f82847d79bbb..1864749aa116d35b5255a72a5c3c732f06afec1f 100644 GIT binary patch literal 11953 zcmYLPcRbX8{QsPhlXb=yWgbpLNHVg?Cd&7lh%?LC^N!2B$~a^sBW0A4ZyAw&W}H!E z7P32pWJNap-sk)H{eFLR`n<>M{aWw$`}KalUeVW0^jJ=wJ_$h(i-Eqj83e)BA&BM- z`~+wrHrNe-KaAe`mVOX)!I1h777&QN20_A*fwty9_>AR=PdJhl( z{Sj{P)5i^OY1B%lXR#DMU;6fhr1QXo;~yqZ*C2YPJ@g%WIy14x^W`R?2Vv|2gGp!C zx|u&Pq~H57+jO)$F9d^FZ{7M-o0pQen&c^lzBd0bx1BVpw!h3^ zz+@1+7`)c7opW7Giyw-=e(O_8o@tQUPjjhmufVg6^rB?gvr0CT31oH_m@_*}%i1yf%6kLb5{2pKtn|TXdT?Z8cXm(E_6+M*Y^Bf)0`sl1j*qu8IgS zMtbD*g0HKn6^~o(#U_#NGA3%Md-B=cqK0ItXsd~Kw!dc|aQQ)nXA-kim5Aw2e)!|$_;Nn?W_ zHHm5S)&s`Uw)uETmjR3nL5_{*IeEcEs(ZDVNz)=6Zz(lL6FkgTnBbcx3w?F#eZPuo zC@VoF0)gi1RsPP1PO}$Nxc8%Q>#ckVxk~9{+4V-4RIQPf`SL-)9byW8GBPl5CFEa* z+UfZT<#&HAYNRC!&YI5|Eon`&A+z45k8kb1o)4~0YM*=q69F>o57-Xjc4iG{^hQMz%pDy5v5#tc z{WDTn>}-GRwW6}~rgReP6`Qqtp&zu|3q@6#*rz)jZf3#FDK4efA?h8%ykfZ_kA4*5 z1fp{vsyc+@4|HR^E{pNx3kNP=*_j%`-EolQndL9gi9{rf8L!7j99%dZfq1>eADmzB zDIN1c-ZQFJgDL7FYm2kGCl`%A{HUW{)t1Z?1w=>xu!JIS5ioJ(H z>$OjI$~DMT$A@xX4l&cxKfhVPI7T^TvYg3dZFhLV=iFHNmPSuWQ zw+Tj`ZL;N3G|tlUmb_^O>iMSy^1y&ZX8IJNJhM@dK~BH&F3X1IaXG+a0=kP>ziL&DOHSQQUewolMz5Q`D8hd5cdh6b%?R&{gzCCTz=%70DZcdhU zuHGjMTEr;1WTrKBdot~KDryB&Wtq}OCPs;`WT0-6(%3n{d0xIJ&KaUg&mUD zPpL0YiIp`7>#tp5K&}jHdCo-_^vq_(F_;V-HUGJTW~krG^|-Fh5MCqnoOP2+`r=}j zRjpnxA-4kaZ}9T$Vt{U?|J8uNfO*3|G*8qH#ZN!+e&PS3%Pcr-ZY5Aj$hat0pB*{L zqHY&oo$7{l#4py}tNX|Gh;iv0`n4(2{XU06|yb=RdbT<-^yK z>YprG&tqEIEuyos ze5mNiKCKq=7f=2)h8g?bs;n{;p>^QRX%H48B-JPhyzln1M%sWBQ%e``U?8M*aFJ6c zLNZx)z4Me9a4l|H^x9`9V+qZplUl(|(eSmtNrPvWJTT>Dw#5jX0Fgtpkv7hw?wU4X zJ6iK1y~7J8){0a&f5&z*w>jnQb0V}lrnSQApBxc;&71fsCfFIRZwy~g1LLhmG7<(C z%!ykLoGbjzFMGr$`YMlT#}?JWr0RCzr!*Cqj4-R=`(o?-_hM6a{^n$#me~>3s;A?u z^)s2aP|=%oKpnMe)8UP4&gLVQV-B=d{;WREQ%L&C(JgoKK&k<#uX%VZxLxiDEJo3dxG|G zJN;K#Xt>f;-N@NXokpzdFURjmsM8Is3DqiCH-}Z`-d6at*6>JraM#WWt(|Si;v=q| zkCEJNkKOR8|CePmI&Zr@zj>%*F}So;Dn}X>sR+v|VerA7+Zq}5ZQ`1m&)@S<65^6+ zsU;(t*jGRQy>)FRO1AXY*kb6pYAsA%1Akk$rL-iO$ARp~susid);rIiEK#`OTZCfq z3yZAJLu4E5O_1RD_rkmx)QvFyF+*WJ zF8!31|5Itmk7ZrLAiF45Y@*3#GP=vdvBbR#%5tsyilOvZ z@Za&XH1tH8oCzd>3q{FjMv0I)I^T_<)JWkhFO%lDDD%FB3RQIj?^2moBYXs!Z;XDg zmROfPbN7P+>Cgd9&@)>9l>E%C_W1|ys=H8!+by4~wfBzn2d|B7Bo6N@AA`-Q{S(c|>9NYZ9kvQM*_%*o0b7EC>vI{oe zr{LHN^i|2}ovHB*wJ8Au^QO&e9z6S6mmBlNKWwZgU(JYiU$pxjM>!55z^$M-lA9O% z`NaFYVDX+S_yfV&o|Bk%9Ms@ejkzLWs+TlB^SXq5g&|=|p|)J}1%BCbcXbFiEo`8w zp5;Jfo9np=`UY>WTpJpwVHG~VocNS)y{abq4fRwpr@mgp>q}Z67|sH+Upyas%)%{aH8Xj0P`m=CPYpQ2`Vek$wUdEAzXDUmj?6Utcr!e^(+Pas_ zMOH%#|CT(9*g3^h_@CR8-OS)Vf@flTF}3rXF#Nz|%vKam0Dq%m>_?ebL3x~DTIF~f zicWFba^L+|*lc4jA}s<3dmF7v=E+$UX8prDbXR&Hn>WEDYqA$E9n`z409bBf5i;nU&VE_W$&%(To(AJo_|vm6`m` zadMWs6)1V-0{@|C^L_2gt9rT)I-ZNh?RA|p;XB6lPbxGBw9#%4gB{R%-_$DVM8u1( zW;n_7(J3ZIF9v&yKAR{?FK#bBZc7tszVF^w>A8YN%Q?oHx}Tyr8muy_hrPx>V(vs} zdiLD8;d+Wv)UvNfpgkqpd9C4fq0_+jnaY#v=})_ds(ZoopOu!rrlcQ zUV%#;N-WvR@E1Ape$$?tqH{H3=ejY5$wQ>)Jq%0U#d}SDzA5|bFz2OKF!uuPTQEB< z8p01`B~0BOzClP|jC{xKl?c(5 z;?&|xoz!eEXcJ9o>cunC^HO|Rpi6R@Y^e^7fzFQEJh?lp>(O}%S+<-#nfMH54ZLhw zvEV?uij;pyl%hbqz55CS1L4Jp`D#RU(dH?NsDYPiqhRRMXb&u;YHy{g=#}t%mw7$9 zW4MLQJ(srhBIno-;#;fk9@JrW0#A$Sk)-)Ih#3fU9C)7E4?}w?Y*cb&;{yd$ ze(TUFLZXAa)4I&}8C?c`(+5W=vUnV+#=Mk*exhT({&;CjY9u5egrYk>YCW~!fgo^! zqV{~X?pfXXq?5+8#!lg6dwajYv&|g~J$~B5AlpC7{V}i0cI7l>o>FybYKVfT(FoqD z=>UE3^Tt362@Z`oI-xaQncR*GVDwq3+;Ve3L(tDb zHQ%i^QatnT(-g;b_Zrgx%HvDWVhsnaU2ss?$JD?yM3lPh5)CwceYxK2nfIZxk`<#* zP*DpkkNBk~tRZ~IV&E%d7@PESOCWHEgPb6_-|9y}q~d|yU#!A+i`oyB&pR^uSRIr2 zr>OlQufWFpjz~qT#iP=b42iVnGoke8=<<`>7$?9D_De~-SJ6^urzKi0_p16+MD_Yv zV31!jGpKQy0-0v>Oz{G+Rd1VQj{of!4pt7;2AmRT#H~44qBdZ3ZOogj+=dYS`RI#?x1RE!IKyru&+i)!K;^`LaL=`pgoO; z&(-&P+O{KhYVj4_4Bt=Eo@G(rKHy#6YYjm*Zb;7vyREk|zfjqP?aGY)jta-)nSeE3 zcmY4OS$WNmE#I)tK(Kk)1MTtJ^9(#Bxk}mWm!pwA_wWG;Nh`&%5F`p_T#^Y~X7i8O zDGXy|m_eT6)NRmiz>!Kb}}=q&q=O5wtElJ z$i@IOW`D}W83KhmE4FUtZ3Hmj1Um(qUfU?G>o;oJy-jS|d9OHfd)(p##AgK7Yc{Oc zt6!oc3}Mx#F%ALY_=MCUdPw7rXEBrhcS!#Q7{l<>c zyDi}o0eZr`#W+?W@Q6?Pc&Q7;K>H)c0A0aY-tJwKql0!Z!9R$If< zx@@b$w*In@o+k@x_5{pxD2yJ_OZYS$b3AMD6DvD@M2}oy>y4sq4n6J%-(!nMYbzYk zmh)Tjw#BRqRoPLBGv=lpJmL_4)ybs0ZJm zX|~_FxA?)IIQZG0!~iTRj10#sTaPNvueYtl5|clO-CD3kTfb?y+P^&v&p zPaXw)9!GQeUl$bx0YuYbX~~oLa2YXAc`^u$;hm9!gE8)V*_3mvdP<5{!kWv#(zAA) z6wxjbj*jyHc&dIUC43k6#ah3J9AZIL%WIdnsJ6u(lsQGMi0a|mGLAD?Q!V}ipe_iC z&dFZDnpO=)`QsqyB-Kv1aC`vJ00gz2GITGXg?<9d=#O0AW2Z0&USV;hg+Wdh(X@~; zFjYQ|g)vuo0{n$R1d)amYhr@?5(IHQ!n7&dp(a0l1lv!azc(g8gBVc$4jAM5D`1|c ze>3-JAi{kxi;?drr>d3Z%(oM=5aCqSVBNP143J$Uf&sF)4UGBDmOQ@scQNn`h|5Et zm>s|24H5E@V~Y?Z76S%7wGRzc0QeIWEkZW!NLPfKx#BzuW={D)gx9uW4P{{WLHr5J zSP0_KA<{xcs(|KsfX>-@+(m1=0ZJt%E1-v^Haq&QF=k!qdOppXCDVqwY|l>BM} zgrYdVqt!aV)(6o+PXWu@LqI_qUjZY8{FhY2nt-J*umF93!K&5#(HR&ZC5HDW!k~+- zhV^{U#-JB`q4EA2)Invr_nt9CBUWASfMel>{uGLbVl<`%LG+HONtndCXC!qiQhJJ* z^gkPlkn2uUZTnr$fW+hko zm7zK+hbA%Gvy!^M|49AU;-L4p6{c|67VO@4!q|-XP}?*U{l%`&Npci_vNVMMYekY2a?%;+BXokzs+kVP-4E9C>8Xqh=vDM?p zw<3r;&;F(Uhh(*~*9vaG+8QBh3#-+ljS4u6R_myjE`GIbng^P*hYe2nPBHvE=@b1@ zx^WHMu9wrmy*}*(+L+e!vz1~xcw`9<7bPYV(7jP!2+AQ|wB!u^byjYvi3!19n&J4c zotzWbPsStatib2KmbKE_1hjQJ7Sj&9Q&RG*Yq&+jWw`4g&xj900KS1dON}>Dq^Q0uVc{deX0V*1`X{xyrgve>SI$8 zBPRrE{%qs9Likz1IVujK3Om(Iw)zrszG&*!NGzi#w+1C*ceY!@qTJ_8LXfEY|v^XfsKDIt?Oj=RwNZTzHRT0Gl& zTUj=wTy~lv@f}$B)D@SZvlKW%Ek!39s-mAOPAS)%FOREeQ5uNE(l# z92sRk^Rk%G1VJu7!3m^a+5Niaf!4AH!R|*sY8Sq*`}eR%@ETZ{i6E7bQK!eXC==3i*hVvYzU(h%70yeCuU&US z+I*fjwDv6|Hw8BehrUbQpGrqwgzCYh-CY6Q#G5s<0VpX0BOe_XXH3o?h@c0Sa;#{z z3=g!Q0vss*BQzQFClj{gCmKl#e`nsDJ&e=}MlQ-UFHv5bQp#i@0r2uYH|+KBVo5M- zz&$B#qLKUd)?MVQTA1REptgluOG=lxv42TLFs)0-9OScMDEv&#jEW4a5yR|-(u{vm zrrOdyY!!tVykjEp85b%n7fcc7sfG{P6Qk}#!e#J4c)~aT$h#yY!6L+<6CC4Ju6tP2 zBK4KzQ&{M9VKHDy>Ey+wnI}7fTffGyKXOmwC8nK=4o3< zKV~ij=O!R*qrc#%)QGWWP{ofomc;u~A@C#X9lwz98nWwn%dP%0R<5@t&!Wfqg2H*Q zN@GTQCxJ^!tAq8ZwuH#B;q~xUaCEm25xb+L3XQn$HyS z2#vjFbx+~}f9Gw!X(JiV2GaoGye_{#?6dkr@3%{OJmA-Gs-nrjyx+e|x>yPKiPp=$ zAj5p3lNsju9jN80Jd0Jtj@dwF|9oVS6V@IaeqJR2NB1a($43=wS;tH_1%CsJ(k@?? zkF4GF8rrr?OS7PEU9ZS&A-XGxmubeScs7yp*rf}RHm+zcc%@t?k(N=U`I=7o6L$e% zVe8+#h*=FSxcA?~sR_xd!}B9w&?`EB>oR-JW$|BBpNFliZ zmZL4ZwtIM=H}qyKIShPARnt(G&gBI!8;7&$_H?D zP27bOYygfPZ8J8OSdTLTD8& zQklw2QnqGr?{h0DJMCufg&jX*@#XXxc_q(`3~Y;+nmKO-d~vGOXk|S-<{XHG5TfO zc;L*8S?L%6`4PXJzo5--M|*XPfmh%Chari|Cr+IjhCTV3p8`J#WeRsMnT8B>mq$@6u)w;7r-x zt;Vr0Jd*U+E^fGl6|d^~JB9o^r=t@^MpY;6w}SkLCXaH?Kvs}#)t^#a)~nug@i!;V z6oCC=adi?oZ|`RlifZAH{P8BeGem%6a`EG<$IG?jTGqbvGZ}x+&D`+3*;pz`oA1&Z zB);ciwk^D^f=`XT&wn*Tw_1h$`vU#9%#@#}zh-sGkWs@6Ra|4XS46tm>Aq#=+xqb? zyfZ36O4Yu$3%kv8-)_ivW2F4(gpP$r>!?L|K)jmC{KE(w`^$W6_D-3nSV-#T7ZQT5 zj0+ae+3%6nAdRA{N!~ULc0__)%EsA%J4ttQPqw@+{H`Tcvzwmy)?K;Z)(rTM=glL4 ze&aU^Eh1(#tgODLQ9h)M-<31_jkw}f;Pt%Iqv;n*Mq`3Vvk#&8=C*}lu*pUcLF8NEik%2F?P|F&F18-l=3uh*>VUK)B_;hg{2sFYBw zV>w6hTx2a*?bTbiiAHqyVupPGG!=tfkQm&vB8JubbvGgnAE_eO^g-@Sj-8d&9KfaB z3pK?;LBd7nkNa5=Sa_-$wJFqo7vp+`_DC2FYtPB1H~mYd`)+p9Rcnz>$AAKwx@$(} zpmac8>v{X-`bfwtMUcXwDOgyU_tN=JmwBCP=u4qO4=uhZ;pS=trAN!yJBEc8ed*m_ zBhUL95ufrE1z|_V=UQ#H(kuQLBzAl&hp&lM(wfU-zP4@&J?oopRiHV*6p^!U6NRh& zB?1Iv;2sg1rHAv@o;Ovw;xO=nfA1}H2$RFA0FWMWUn;92bE2a=aWZ_Pz4Q>Xu}XKj z2r;c(nt4=iu%AtLuL)>ijC1Fgvw?A)F{VO5XVy`Y^K)vS@01p+MTo(^_(ngf0J0wE`n#aJBssnfC0YL|XSf~bv~ z!5?IEf*w)GQ+yHN-=}s(0#FwM`{YUM2dWMgwI)~>w0;bHeFl)*_mXySPZRqXPG}XYd)# z0eYAqtHk<6aSHq84=h-KhTcB}r@p~n7m4*w#EB|F1m#=uYIYN)eWhZE?e zk?jjQE;7L8{_5eY9TB?$xIs0@O3^M-4(c!&(NUF2R&kS~sr_}2;cNfIwSna8caw~; z?f4XYnA3U3!e8aqX=)r_SRd?;kyyp%{_}_%B3kvfjrP4v+$5zb~Chx|1mcs-bjGmOnRF`q0wP?IN>)c}{zYG?#xl zD$TMOzJJy_c4cFslp~?F)*8{MP%>k|<~vs037#^ylGH4RVVu@B95PxeQfa;kIr*iy z4;pDL7vZn;t9@ZT+xPOE-DA5_#&>75))hG8bO>oq7ZjS$Mku5&M1BbnQRGbMZ5Zdq zbyvR(c^p)J|3O7zSs6|MzG6O*2$_Pcz7OArPc{iIbAA$`i98@HW}Wq>`R}4ePHkd` z^s86ZdbMbps(vO=Bo;^6c@{1-oFsK+-vq?0>tpWrw-emav3}kM7auE|MK=V{)~S9h zZcH1Bn7$0EcN}WZV_q<2*&&R7Jtd{WPLB<|vrPFTUVUk$s}k<5GRS&ZQ&B>zSNCKS z+-7WG0eC5cdrqKZMx`p&NsV>isHVE$8M}! z6wghr+4k3@3IWR1$7=V!?+9e>m-LqkO@Tj0G-sS6bt3EqNYCw0(Rh-qY#jTG<0cbOD45_WcXyyjuJk zUZc9zkHI@Kx4&2zOtq=BYRE2L>g12}jF>j&r#=}y#Tu$hME!(n`!9GEkzp3;M9qsY z(UpEbAD=U)K;0Fv@?^J8E#8DAshYDWQ!wJGOK*qte>6^kTEeHUz3!*zIJx6I(;bur zG`PTtJG`>L(k}oS>`|=3+{_Oc6LhP)5fmt=&nEd2NErDUW4oA3pmi>wL$&2) zzoaPO?q7hOq~}?ICl`=J9Kb*_&pK779(mW0F4JNQXo+THgx}Rbn3*2~7M=$KeDt=xXe8yV5GL>si+RfBCxPIBMVg;ZW3 zSP52Y^BKO_br^%R%|ri+)L86^9eTmdE9h;4SV46gMh>(2h(|BqYng z#Z^vEh=BS@ee*h{45DszpEEX=3#h_nd3PuOzxi5#-A=7Kvx7UpwSefCfGqCR`)aZH zKjB0G7~c5-+*47yxmMbMov+Tfq8!2FOe5Dy418Jw?m%o!YhfdMoWTu;3k+rC<<Sv(-M#ExWr!F!y+ ze6UCx=c#HBoWlpaJPiXe*1C+&SSBhT9P0;ob?W~S4A(QN76FE=2Yb4}%?sx0FAG2I z9l~)DbgKzKsJ3T447ZX>ijRf54-913A^eoe3Isgktj$<(CD%hct(hNY$E?}#o##AO z$a4&U%NLp++EJ6<(CG;k;G_{*eB zY6Y#psOCkLlV8|QPsEe`KDm{bH zyR?9ZVYlmwyf_243`EyIch$fIR!S zQJ@PX3e zPhMBrxm+rRlKwc52yz6(Z<@z>0L3CUTxrKi{|NoY z{y2~oB6fl-%j3;Yq_ADu~WQ*)Fwrtrm$(DUKlr@CxTahB6v4t>E#E?PO zVr-?X(;#d4d(ZiQem~sjo^wCm=REh^C&|*>h=q}l5dZ)d<7@iXr;Pg-Fox6FqvcLI zC3xU9hY$b&ng0vW*$7PismL2@U>|C8*E=-aJ=hBf4-c333-Ax|a1Zp7zZ>jRxT(np z0L*^I`noqFiZ+V<1GC3@`%Z?B0yr{t4DdiZ{Ap8D(+tubWu#%lE?Yi|3?;K#i%pB& zB!EWULs#!KlSk8Xt+LEia%Thm^7$&~97k@CV**!G>5HsCd@AEK4Vwh4TE%n-?JGYM z#EQ#wJ{@gFdxT&pgzchj&FPh{l`DHZmQq}d_pd(r4|>Fu@ddQZv7mTlawg0SjME$Q z5nxS_-Uu`Gcmi?D{NB{>poPEhro=<;WDS(Y@dAzRoD6|5omhA@F!yZjkTOtO6iIxQ zHyqD_1M%4j6{zd--(<98BmR?j@D~=H6sde*z46V$CHOr}m?fbck(JiA*}Wu0Xc zIU)r9*)M@LE>%!%KdU_6nci3n?Mkj=>)4};6(J(dmK6%zGo8B5D_iZ$7^<;i9mF>@ z-Y??XIRz)D&r&UP>=+JNY#;F!o9~bHs_|;a_pEP!+fE4(7XlD@&(3Yn|z|NW>k^{Gm6Hx~UVp30=4xx4XjRn+~$~6;YG!MKh5*YeNXv zR>Hfdm|Yq4S@+6MeyOrh5E*h@uZ-mxf@AIvSwaG`7vc!bvBuSPZVyse1?2Ieg6bYk zC#SwTb0$2O2T|n~%kA`_0w;{WffKV&% zcwebs=awsDp_bX&a{C`uNJroi%f&muBx#EAN3LUs9eFGrH=){pX~gpFbguTfck|w< zCRza7evXJdrnWN-i_brVPl@_D;g<^ zJ@GWcZ?5qkHf`Gyz6~Yg(2;fEj132i%It}=XBxyQ4zgTzbb;kHSCl(^?^6_(s)46Z zi=BkIWuw7};&<19<-)2IVhdNuuhNH!Wvf*`p`Z(d=B_t27Z02`7m5v|&GzJ& zqi%FU1O(W$eoA|Ys?WjK?YpBWsmq#*w#pGovO-B@(x1=R1XQ0QGHd@5r;FkbvCDp| zkH)kL8zkiCMWSaw$?t07g z5a!*^Cij%2_-0_9expPud%O?JVXI->Z)Bs|F9xN18Ptv&b2ox#3f@iZUim;rckA41 zd($!vklJyCs4!ts8k;*3Oi-5q7;I8Axz%j7b;@#ezFN=CV|%E*EKgsWMSBnWP-7;n zhej-EQbai0sGF%p@qnq2^^<-{xg~&S<*uSYAtY@V^k8`UWOniPo|1>Zguw{6++P=E z?)SGd`SbU6Q4}iIe?vBu6h+g#Kw}F=?jnV`q)^hWPc@6J!zn_ zPn*khXPN+~+lw}%`auBa;DjzQ0Ox4VNC}gXw@Q4F$q!(pzC@v(sv_WssoDTRBS)M{ zqbqu2d1z~qyU}!BP(iX3cWv@Umz-Xw^1`4fE}|9W51Kb)XfZ8_+A(N& ziT3H~>GuKn&x_#ev&`@C==k3`PH>B{7(Gs`O!6nKk$!(+Pf5t4(772Xa@2b@Z{3{I zVy{rL9hl*uLfbQiUK$6ezzuedq_2jgD>Y#hUy&$=8mlS5?ec4K@ZSv5+BgM=IY%YexDYZ=W+^wn}=5KGT0K zkRDD)Rq_YY)C3sjYkQho z5n+D%;uIFtPe`-ERuM2C@DqGlcI~)onZM^ODAAZc9LSi}-lNc>PBf7Fw*42=FG7YnJp5xzYv^mPa)YynhMD~;oTJW%(!ShYVhxMeR&4T` zB~7)R4U}hB3>sW-l1Y=)&VEyprzW`8L5*zaBfm}Fc!~F6*EJ-O&noY>j;xPSv%{Kw z*gFzMSHOn)z(VB9=NJmf0~{9n;)*ck_^+t>c$uL-*q1U<7_th7abru z?QFfER-!J5QTr;mvUWHnQ=s=elWF+N2;PT2!;HoY^C~<(EhSg4)%lJN8A!E>@M8lO zj6t4-#{<`d*PJ?ztPcg4Z%X<7b@$Sn??9p3@GFq{`^&7N*zAW@A4E#imZU)u;s>v7 zp$cC0>m*UAak;kR!X%5PC{QOR1lU{H>0;t{ZW{EMk`w|%87*MM>-|EV4xafj0O}yX zTQbNQa5>HJ?BAF+7;aroqWG5|zNKboOQn{P=-&?oz@$-iVy4LV$JTjWboGa?q`}!Nba4Ij(c-DruCnf-E0|VyBlm>#9*w zk2U;#acNZO0lL(gs_e~Z49)r$rdBt9eD7DqE-v34b#5SM*=SNiUJ_4R>X1rUW~zAb z)0h==nEd$loBJ{^@gtTZurm7Kbm8lTe|~=}=DfhUjWN;7wH!{!-@--O)W6;V$t(u( zPv*pl8@M^poF>Iqe0g0Mx~)H!I$jPjy&BU%s9G;adC6(^ z>$$h=D41-0g*@y0s*FeMBOMh!6Tp>Q7kRqNtfF$b6${y#fyaS;4d!`EqcHc^`?NBJ zCP-x_cQyZLl+)M~d4I6wMLtfU|aNp6$4 zWW;mahIiJyAeK}w*Avwspn#%*FNp%g3+$f2+Yj?O`=5#13yRNPB@d@8X9Ktz{rXZ~ ztKSD|tR2^VV=_X(0CSRXJCE5ia7h|)Gi6`*=$+6E{Bq^tvy%4qVdG#VK(y0$n@*7k zPAWPJC>|61IPAW2?}sr{XjT8w-v8h1AB7yVf@;hIKbkOIIsHrkV*_*j+N*A{{{xYr B0 Date: Mon, 8 Apr 2024 15:18:50 -0300 Subject: [PATCH 334/428] Update VSCode icons --- vscode/quint-vscode/icons/logo-dark.png | Bin 0 -> 15790 bytes vscode/quint-vscode/icons/logo-dark.svg | 1 + vscode/quint-vscode/icons/logo-light.png | Bin 0 -> 15038 bytes vscode/quint-vscode/icons/logo-light.svg | 1 + vscode/quint-vscode/icons/logo.png | Bin 0 -> 14962 bytes vscode/quint-vscode/package.json | 25 +++++++++------------- vscode/quint-vscode/quint-logo-vscode.png | Bin 11953 -> 0 bytes 7 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 vscode/quint-vscode/icons/logo-dark.png create mode 100644 vscode/quint-vscode/icons/logo-dark.svg create mode 100644 vscode/quint-vscode/icons/logo-light.png create mode 100644 vscode/quint-vscode/icons/logo-light.svg create mode 100644 vscode/quint-vscode/icons/logo.png delete mode 100644 vscode/quint-vscode/quint-logo-vscode.png diff --git a/vscode/quint-vscode/icons/logo-dark.png b/vscode/quint-vscode/icons/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf93ffe94987f14c0bc640fd11ede3e25d924bf GIT binary patch literal 15790 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 ZJ$gIy0|rwMj;KQP^^8sw{^D@u{{X3*Fhl?V literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/icons/logo-dark.svg b/vscode/quint-vscode/icons/logo-dark.svg new file mode 100644 index 000000000..02dd4820d --- /dev/null +++ b/vscode/quint-vscode/icons/logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo-light.png b/vscode/quint-vscode/icons/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe58ea30f970837a9b43fec6c3b14e4bab1522c GIT binary patch literal 15038 zcmeHuc|4Wh_wO0ZbD5KwgmBFBAwtMJWp;4LJdcrcN<@QXtc*p)(IHAAJfRdqA~PqI zkPMk+xcm4F-_Q4TfA@7?-`DHj|Gu2Zd7i!3UVE+gT6;Zvuf3(1n;J0E9ifB4V2p;R zPg%lX@Ky3fLj_7YKTW2BuU_m~LoY)^2^bA{0F-bF7#!TKfeWCgMebP59J2sboe-bWcY7>6K+t9slBj=E4MA zhtQ!Qe-oxKE+r&J2WiaE3|~@}8^s4N(0U%VFb!i9KjBV$_|)-pMHeMbwD}Ae%BC0Z zmLw;%EgOHed}{+2Zb$g`3aDRL(%KwVAFk+-$VNx=Q-to-@k`yN5yda z+;x2odk*xuyCRLl1MUV8NhvsFd>~Vk6iR&sJ%H7X6wxv%K1(stGjsPBv?SHrJiY#D zxP2CRvy|AU480OWx!jwNNQ>H7TVG$iZJMAZ#1Wc=wZ0$-Trk?l`fT`FlQU`_K>^Yj z&mecKbaX&4*|EkhaWavz#Z%D6R0V)*w8E_;Nz(&WT$9?G6~kjp7S{!8;Z4x zHMRDL_482m6w*S|X+*051_9V`j6igNe_)tew5HGjUo~(~E|w7zI3Nl4(-b-j+(EhDR{ zsw#t$laZ5?0u)kVF@fQjXsN(3VKR$9c$~t9d4&1|hx-Ht3XpkX+=C**HHCygy})1c z1q7Rz{LMZv>`xQ`9x~CGU>R9yluST?%s*R%h3iEECVvX_Keh<7jtR!fSYpG1B0@c| zdXd<`aN&Ql@bvh*eQ-pm|A9K59x_;eYycn)1HH=rTbJYk_je021l~RY!3V7X*#AZu z?&I|@u>MUpa?OD{{}co?|C{f>QU9g;0WqL5F;P1e7LEz@z>--3=F&cZ zkC&o?Cq`C9UP?(Gt16{{QSg#dl|`YXJUzUWJXEk)PdP=Ef3PqM^#NXq@&Bh(WLBPl zm6E%cs;q~qf|Q~s_@khJ#Y(wjRWVW+MMadmlB$Zl913&5%F{zlKPWT+1I+0Yfbqu4 z1P6K_RFDBzJ85pHDI_P2`d5j$KPKD@G|&_};}aMW{jUmZp8%{?IEIX-tg@_}qN%YRV6iQwV^@sRmb|yidK3*~ZH)`_W5zqkiz~rZW z!a)Bq2StC3C@XBpA5VWg`uiLVB>{nhL7|56_(O#-OeEIxKu*Bxk1CIIm_TnVh#r5s z>tE$Q|AQ-dVC20NJd_lrP>RZmQVR0&%D{dYc`12!B{@$y6*;V|yVAdN4-4`NkHUmv zPkI9!0an004_;6L#}5o8{_oUL=dffe0KlYB;G^;vU@CtCCiADlGUS-?m&O`0{~IP6 z2L%5JGN9cbWgvKgSSa&%F#HoUa@hI*`17YN{y+8rSpT<^{|Mjz!u4Oc{v!nbBjW#h z*MH&qj}Z8ei2v(d|Igr}``2;`8wh4WQDCtYo!WR9EVQWHjSWu0_Q}6RjSn+G32pFc z`!EpNPTF`&xzk<=Q-*257ks}ChZV?j&)n*d$LyJsj=6O??lgB(6r8xUtKoLbxq%_v zaP9`mm80%R^uExZT_LptLL|*xaDrxA69)X7-`B{fhnJndr~&gk%qcJo=d#%|7(`xYxtM0x zpx#A|Xg|cC%sjuuKS?D`WlEdK8P(a&ZhI!GgGs!6Gw>V+^D1B<9K zMK5Ktd~)5*_vz3iPmEFz-8=1^ZKW<{SQFhm9fRwY{f;nbT`=*t=6PrK>HGLXq+`@@ zv8LIM|H7(%fyom~x!%$V=3k$o3COU`p!Dk0bhTB&JNaRD44P$=YN=FOvyE@cfAiRq zUCym6y!4t&ZY45~Iv1LfQTe4yf>>IP_MB@@ih-dGoucA{bNClBs~xpoq7g+VvAAjnXEnLe-EgB;)XY-7DKPa;9(U@>Xh_Vq+9l ztl#>wwcA6MmPL)$-M;)v?H#JPFBHuCdQ(3N{mp^RJLL>1@1{xIp zJUY=GHRB&p{D?ftxI5v6hu2|R$Q!`-P7%rjNy1SPez|EBrUKm;TpH5$a`$1TQmHM? z)cI>MQ<7^>=P^R>Lrl|=B|o?8bWD}h zbqp#cVE8<)o$s~zj^c+MrQ5l;^J?+y`{_RDg`UMua@I@@ik~vi`2(tO-?5%Kgkxvh z)+utP+%H!~ckIotmEAa#J-Q*u#HDJR*#W>H?zW29JtmVjdZ-=eIG$|-NUd@!&%{{| zPhyy=q(TPd)*N!p=%9tREtZI_Ms9j1_)({cuG3WY68zJP5)D(d;q4#q!RB4rE?@0l zb;%k;n%)l*Q;xjx_WBdXH-((AJ;>8m>MT1JwpIwzA zB)XDe?MQ>0Z@iAK@Y3dS=mgjPYKi*p2pc@4tnlH-IQ9JS+ZqE6cDddxcVOciluTlc z>@5!v4M{8)JVZGqy4vB-5kV{dFMS>*+)MXnj+XE&k}O5J-l;2k>!MwrR=H2>pL zmD=P3nqNT7&kaW#r@_uE{+f3&yBvFUv3DQ`)5NwEKNUMG-h9=CTBYWt>W7Q1aj;;4 zstj+B;tI;Az=_`!&~eWg33l~RqHWTD_&ZKXBBh3IKp`oUbrBa!=+v z%n!-K+N`O?T$j9g8OPCm42pQ{b^hf;ovWP&3v-WA{6=FYKTv(!-EmKn=yzZ$ClXQZ zbImTmL^KS@Y?+{iTKEJ#L*=VyPf7*{q}mqy8@X@ci5F;Bw4HF@+K%kH^+*M|bg#y5 zJ5ueCsxM6=1?-&9umXn?klrv|KcyYcl)H6f-?FOAU-4b3 zA+^KLv+(z%$*4yqT-`Hc4vG1ydn87w^CP(x-Rd}w{>rG{rw{uG^+c9}W#6-3ar}Bt z^7~ehbmY%Ud1e(_m8Nv>6%AgX{UD}^a_Q=k=zuyP?NCDbWHayw&?eZPlwNa9lj3@URfN}qSu(W$EYmZ ze4^H1uhzA5y}UIf*H&9GE1pX|X1t^EUtP6YN#FI1%wAEe>dd&sDaL7$ZxaZ}& zbUe|85omiE67!ATU4^mYGdcyLI6@1Pwo72Ixu)jglHr7bP30e^Zol;l8t2Kwpz#oR zy;ZVoC|2GzY;*q7%_ykxbD($mM!ZI_`S6p$kis>D3jHQvKOL)g?qpmtQBM}Ga?i`7 zfYAx*&y?quyOE|}pve?>yRK_K0P8&WDUKI5|7AcxJzUBss);rPd4t_gVZIsOj<99$tI*fo7Y?~K=2?ko%uX9yv&Eoso2nmd6}f-4g7?OEhLwd+Z)+Z2VVy=ZYS`Z| z4x-AlMVH;2?|o*D;lrgJ@_xo#wi)~#W`{^lWI1NP`?Y>80{1b6=T$$(;?8a8;gOhi zd4demnVxmV5B3~Mu#J0Uh4;Ym*N-^%6{G1?5;sqkG2NxmgvS-7d$T@nVhC@v&y_KW z3u-cXoxIISaw9QCnGnuYEi%L<*CqN7?B1#yFTcw3E^5ZXEtlFYp}g_16LT=KDxT)^ z^Q4$kC%cI&dv`W>BeUYUw6Gbx^%Ek!lkhQ$6Lud2yD6LKKk%hgvUD-Kf<6vyu@HEL$Ldcy+(%cS=V*y z37Zd38foIx5`*<=UX6d4J2Y2=3xZK2WNe}zvEs%nq8qo~I#>Seo-~Q8bb9@)nxA@| zQE<$s^vA;ie`+`HDY0A+3AHY7{QDy@)4$rN>V5g9g|F0%h*<|mGsDlrnN_wPufJ+y z52mfMWZyr+s?4(elBcdeBW+A^GO&%i#%9IaEr+GWl`#y2F(tRCDdjO6|6a6SgzN2h zOwRNl@+(c9_+z)|BBvV?S@>!@wx65E%NJ2rSibta3m@uk{P?rirWwUgbCmYlj8`%IycxW2n!D+j98!;!&OGe!3r0YHLxfocGE` zK9)7JG@C>jD5-}Jh;$jSa88`9*J+Jq80tg~>O{^(A%DYVto_gNAgJvzNar=0740#D zZB6zgpFTop!9?ncDvnoc5WGz2hc@ZP zqA@kjT$|$J$J%3(F5vyP;9>oJCEFe<7EJUzLC6;9Ptb{@RIC(grGxO~=*OXWL$uJZ3ngO*6LSeAq)i3F?{Eny1#C3Yum^L+-0AtfbjOFEqwi1HC25%`!w=O zO$-6GvgYHq&(acRYa7op$9(9yOTIj}uENbk{u8f}?3Zqm9ea;fx`- zoY>c4T#P$*gyD7NNo_klf5r+&e8>)0T}NnnTEi+rg|e;;(MsFKOPx~U;2;!h}NO5B!gYh*fR2{fMA>&bcjk}xXRLF+<-fMVbxT4{Cxh`X98SQJQmApNPt3-&)xU=DCwY~Hh!$lt) zPmREhALf6fDwsIwU=jg>jjI?sX#kfmRf;D*ZP9>@B05Dht|eb7WHKD@Ej1IqASEZi zTzquqs|wQDhud-@<>7YOh{n{ZI!>w5`s4ix)N$&|mK^k>l@JPPUZxO8%TxCdSr@6j!33Jg3v zeF^70R`pujE-LCfvST6c^gZ3p5Sq_2wwAPYRM8rrzwEoUDDTPj`eE#+rVfdlM&Cx{ zdC+E^&e=l*`?lzE8RTh5BAuOm>D>lSrR{Q%P8vT-bV7_}%si2~?$^LGGiR!2!5~Cr z$Z-#Fg*S2Q9Iq%jEQj2r4H-{lGdZU?+8wFfJ8)SaxoEaJ6hyJ-OPh5o^v!wtXu%JH z{_qNaQJ`DlzQFtIoL+Fw-{UX(*a`%QD+OO)Asf!>BAv&-HPes{pw4T zKq6}RSDDTp(~kVBFD|Md9%xg=etUU+6>WDHKIS%SEi02T?Y~h>RgWhwEa892cp4Q@ z@KuGE-vTQ`QDSWF9hm>z#tc>cwuJ>7d`RS#ZgW~V=hV%KE`D4JE!B2x$yVt#hSiR< zhlT_|Z<>jy&R=C0onv|GBwy*e(sBh-GKQ}e+H{(mz3YSmvQ60|8BxklJY0%*45;eW z9>X|gBgI3(Ju~<4NR#j@hlz8u)*(IF`z2n&#@7QmZTwttm;x6wL7-ZEJWditxm49;4W_w+~pf>@&)xU-Jw`WnaI@ z5FRmPS)wdRWYqAUwMI4@F6FkTPYBrnd@(*#x2}tC@ywcV+~R1@fIL!oR|N97Ku4|> zCb9Bk3H&-UPr}RbcKGv$8CGph70z^dB%W{^8@57pN!|DA0D18 zHqIJ++s@u*cczB5^Kw?+Y#^vpIx`==Ppc6$Y%QE7!ZE`lHgbmJ*QxbKo&>%C9h_4Sfivb@NI?foZ!P(w}CZ%cFmJZrED4 z?C~`fuCpJj0mONSN}fIH(r~+jwPMuFA6jOj(05P*+z8`$QYg1iIQ_C&V_eO&H8_f> z@EZm&>cjL!BfDgViU|)2WP;9FZO3zalFNyalA@oAn>~|>cVhGEi037!GA16FC0%?d z;8PZFD|cztw(C}G>zTgTuY5S!?DyJs-+iC^y7O-Lv$QxFKRgn9dDZsx>WU@OnKyGp zofwmS#^?=Q0Rrh9TO+MkejkyWHzb?(%pX8z*U-OERQS}tJfx_3&gUkcs66G+X{k2m z>ICu|hH|~42Nzh88r}kVl3Sid#^kH9yHrH%Rtdi8O-1QF}O$&pOrE??j1 znKxIvtcsY9P%*43JWA3>wz8^Cyny5n6k8}7Em`A>S3tG&l_g~#d;C5#7Uy$N^D=K} z`G!%2ae8cLYMYpKSuUeS-~p%>6DJ?`7t7cs)myh~o6Xj|e^H`5`$>C)O@xrVIuXJs z+iUYh+w7e`$-dJI_yBLL?_w`?`o!}(%b>I3Prk(S<$93$NcTPz;hO1mR2wiPuShEL zhA_=%BWJ;MU$6(Za+rSg*$#)ZqWs~rny)6a?X$bJ?Whx3=%!9=WFq1PP!n@yUixr? zNcc<2C4~_8JizdD>f#IASE8aeGM%?3w&~53e^s>ik-f$n#|_5Gos#Ddo;?+@6>Bv6 zH0A@0Dt4LW0Zg7%eO?jw#MVqv4*f*C(7Ol(Wd5{ckuO{E&raN(Dp>?&yR>{Ozk#2-vs78Qw`=f5_mTT}*(?^_wJ4t2;%63tLV&v=LSW$0?MtAwK zc<&k6JU@AHaJ%uk#$E4Oz-Pjfl+|`4=0w%SQY%LP43g|57J#yrR#u{n$8x)A8b6ef z%!%7|b5GW!er}@JI}r2$X(k#y{u2bj5blui%b6OKXP$0!BCTBU< z|EMRF*P6{M*TNQF$M=FTNHDmv*k`q}*QUnhQ~dPK&u4fOfE6F9SigYXwihsuITEe% z>dOW7kg1#2ii_0Q#`C$ZFurQCOcpelBTH@FYcKv#Vmy=7arKWEmcG2Q!tt2sEW9lyhjt_N&`$2 zB$#*`(oEson{K=8Rg&4N0pk}9ynW}6tMV`Z2Q~`51Db(Gt98l9WJk1UAVrAj>D0QHCM1x;GVE2j6K|5?NXpNF%416DZx(#oER7zS)*h zv*sw664ir1BqN+FBK#g>=rUfaqlW(`SymZ+)Q4(m`8Ej9G-zp0@V8*oJ#qiA9LLaA1+ms~#-~!nc%rm5@y8w^ zF}X@Ggx^P;eLt;E=A>K03u7hJ5n!oxd*-uQTh9RSxyIkP z=3{X?qa1oq8nD)gb@&_6*!e-YjH3>iCp?A`McxlDz%Jo+uiiWR#ZMD3k=>_lr=vp?hTn&KiJ~)k@oDuTSL=(^wK&ddea2`oj6HQkcMp?=Sas~% zJH|WpMymbh!ZmlB)>`O7O4{dna=tW^s=jZ&&lN6Bgv>v^Hdvf%UI1(7h`uo#w&@|R z^YH^PjdechG%Xv^fIPoF%ZMuV zN%l?usn%TDypL~dVr=`h?OHm5`g*9n?A%l&k>5G>WZ!g@BSAJXSR$nOerA5!?*g8g z@-vSn%_1fW8*}QgrTsY=G~Fh=DsoEqHiOgGdZ0r2w-e=08v3+JkM13hDCU}|U6x!Y#qSRVSbK;OyAaW0?%*`B4GCVm$g*O2Zlf1(Ueq@xw=qG&SS zrhnh{oNnnpm>t*F&%IuVVVJ zAU!CRovYh(%1%(O*9J^0U54Y&5PGX3DVsoU%3QKSlxAfsgQP@!dovKWH`sAxro2`Q z7G>*yh8kwTrYHOMm#=I~9BO&xX}+Xf$#-0(5(w3EfGRQvO}$Askh_eYbR(T}OV}_Q z6avZT8`SI667^YL$e(8zVzN!Dr0~+3E`$psJOi3iY>C6rCJ&SNtHmKAMG30*O=CtIrKu5LejoV z*fVWnEZF3AXqun)IcR%>1UXxE<)B=It)S14Te@SyH zNy|o-XERo~$K}~ekR|obLBBYjYK7;wS)vNEpVF7E(V-c149HsS(qhazsmO67=J5*N z@o_b8{oGGW(p>6|fHT8o31HoX&#qs;QGPC03z0YF?Hf5$ZCq%__S&M&xy!bK#A0A2 z{mq{3wdyzT^W}ElXo^jV<*@hV@o-sY74{ZZ+Yu(`I|<1N90S|eem>KOO;VX2Pj%1z zMzqOI6Kayts=tU~3KkA_5$6By?Hdu)twDLG@_1@#2Y>Pg$i?KqTxkT))Xrrwuh`&^ z4wc^1&7<%K=BFm-v)2-$q6A+ej#8a@ylK8cNd!(1!C6!mp4*Jv6dkbdUYlHlO)7L@ zi+)_+Nv|WFDP45NF|!ov`v<&}RnNvRK88rH6A>*wdKCGh7<#+3`MpF>iI=ZKI z6}c8PNGzl&mX>frVO(yS#E&f-x9H2s+YD6^!aaLl1K4Dua#JTgMrlcu^!f-xlt2j8 zjviRtyRT(1tt>eN1? zxCd^E*!yZzq&!ukB6Y3d3hVVbj&rT}OE_0#p@i$nNBb>tT)h-~+GE?{p4XES1cQ_O zp8YW4L7Cw>Y%SQnBMQrABR(R>5J#!U_;qqWvw!#?ux~ci@GI(5)u9(WL&fRdGO>zp zwe5l^w?o@rpHQk?_KD`+WDm9ksffx{G}udnCnHAT_kE-3jv-igCcx};Td02!9*DFh zZk0vTZgPi6c2n!pT+r!1FNo$Ef~g>e@?*PPTyKg)6W28wJ`i+33yJ>c6b?{z0i%nE zDVIix6TRzI{;!vC*KrlfsI8vr@fc!@;w%)+qilufoP{G>^QD>(z)arSFq9HpDq z)IHP}_(oZpH1fuV!nyQ>yPA{^PT#zp9wL7auCi&+#;H&Y_Pe}gVTM#lm$Z>X9Im4; z7b@98tV-f}Vx}c7gX!k7IX{yVY+kPsEp~@~o?EA`gFw2Dh_l4G(=0o0s^ilRi@jiM zZJ(q6#YqwddGCI!;@6*rqojs;F*Ne2_f)vJ7|%Si$mRFTZN`WJbSP3yQZh!Bgrs@> zk;`xPsOG(LJDHrvd&|6`0qDFhYK(x3*QKc(!E+)znc@_x1eY+RUC03|w&0r?^i$kz zP`_aOM;TZw1k$bzT$%K;Q|;%69Ro@7a-Z*wY|D)sNl-&af-TaPB3lXK9R8wxKiyl} zQUv4}IOhm3yKJpho0Y>==V?A?Q?y2FZ*A;8`?1U{+!QH!inNf9AiX61a+ zy5}7$doOGpuX>0fy6pc1i<(L{y(dD;%fA~~n?Eg3MKTD!OrF|n1^*^sPCg58GgK4A z4I}7rTl@4}Gis8M?!6H$(Lb68-D{ffFBByr*4q=4ml=Y!=P*pYZ)?1-{7y03n49N} zf{*e{gN-8JM_P3AR69w7W^avN9i6HsX2mFsysf#La<{PVv%z;Z=sm=DUE_E1LtUzR zOQtpNE5`9Iw|g-gAaF`Qb~EgzkUq0SC25lbNdPnAQhD-$IMo? z#sBPSe{UK4kyX1U-Fq-rqTjGd*DfJ(`zVRJjd!Hr#{+5_$PRaR&O8}R%iA^@CSPsL zHb(4@A^q8D24mFvmnUt_@Y`#gRmYV?o4n_fO5GFa<~en8ogW?nf@5)#S9l2Lmb(O{ zHNwM%dyd7Z0l|sIP43)t>K_u!uJ19BH_wPS6hR`2fM{-w7~yPJAaz1pU>!3%3w*Rb zd7Fmx_E&Pqx#ay#r7Ay~&qTFBuxeU_Iq8q(>d}9{KZ z2)g*N6hF%7)@C;|xGTkl1u-A6z5SeNEgc%fA#oP*tL;14n~&mCy>}vtn~p614p$C| zX;f{aOl|^hk`N1&Gp6UCyMzk>M-C#ki#kV+B`!tvtRi&dt)>drJv4b>8uUjQohIJa za2GH|2=kYfonKVa&E?UlgKx4dXB17uzEovZ=|?44Z5(cXSNZ$*>M+!kve+Rb2i}0j z#vJoz@ZU&&DfJ(s&J^ExN}gGqY0tXay>qh;X3onFeQA50hW-Fvtc?==Yt2~&2+=i3 zM>fC1laCkQ-AkCTg-N+hvb3D&nRfI8X)!zj$NcHskX6Us+lvan=2a^Z+%uMwm$%)( z_JPCFk0(oJclao4=>#=C+dGw*C#VPW3?vkyk#(0;F75VQ*I4PK2K31n6atOz{nSG9Z0d|FInQ2_j#pXs zyQC?B$}5B3L82gBcFckO{Cb%o1DFXZ4BD)goK#I*y6FATPA8sm>hO~?8MT!YRbj$C z3s1^{F&7xuU={j#DpB4vpIv&4DwDRU@qUI0tU1XklR0Kj0g32+|tn9NyP9U#`~8u^yF<=O%GN3CGZx!)>aZoLQ1z4I^i6 z&4G|915ZX~u=01XOexRsINE>{EOSTZz~07sjN)?fHA-nOR9@9~}4obboK*R(y3 z6-7E*@?JK;>88}Yu~I^)+#m1{3N* zBN4Nj5Hs$o1k0Q*J_xq>qL0^bmS zG!fBiPrZ2oB%3f;G7$HF<795_-IIq8v8xRKv?UjLW`E=9 zvB0&c1GaOY%CzX`sn3){!P&^}KoE=_?8zQGV+PsbhuOJ0NAY3c2*UABkOQ!WXNJMuaFizF(~9(n~`{#J1T>`+<;sI9f9TG97~$>^zuClA9~^yHYU~AGuqnz4PgUj3nXp3*pR?ug~uMOha%YT7d+dI9f1U zZSUv+68x0oRY?XLUucfH-am#5(Ruqc$%xd-&fWJ7N&u;P8-gT&?HP#Jvu%ccGPP!nnKwBqEM2cq%;>(jB1`dpFA% zZE?Ch_R-|9Z*3YyE!=XlKmpdtI!S2uj}ZOuVaES60;|(|TKI(H+qw3`vf$_`%uvtt K6j8_R;{O6V4ofTm literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/icons/logo-light.svg b/vscode/quint-vscode/icons/logo-light.svg new file mode 100644 index 000000000..0e218eca8 --- /dev/null +++ b/vscode/quint-vscode/icons/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo.png b/vscode/quint-vscode/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..563a196a67fcd5b3c4d037d8c5375964392286ed GIT binary patch literal 14962 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 literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index ee5f35fa2..b5bd72d62 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,15 +2,13 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "icon": "quint-logo-vscode.png", + "icon": "./icons/logo.png", "version": "0.14.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" }, - "categories": [ - "Programming Languages" - ], + "categories": ["Programming Languages"], "bugs": { "url": "https://github.com/informalsystems/quint/issues" }, @@ -18,22 +16,19 @@ "type": "git", "url": "https://github.com/informalsystems/quint.git" }, - "activationEvents": [ - "onLanguage:quint" - ], + "activationEvents": ["onLanguage:quint"], "main": "./client/out/extension", "contributes": { "languages": [ { "id": "quint", - "aliases": [ - "Quint", - "quint" - ], - "extensions": [ - ".qnt" - ], - "configuration": "./language-configuration.json" + "aliases": ["Quint", "quint"], + "extensions": [".qnt"], + "configuration": "./language-configuration.json", + "icon": { + "light": "./icons/logo-dark.png", + "dark": "./icons/logo-light.png" + } } ], "grammars": [ diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png deleted file mode 100644 index 1864749aa116d35b5255a72a5c3c732f06afec1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11953 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 Date: Tue, 9 Apr 2024 14:05:05 -0300 Subject: [PATCH 335/428] Release v0.19.2 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66f38e3ad..2e8bfec05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.2 -- 2024-04-09 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 7585f9ed7..7e9b8fb70 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 118b36ce6..9ef9ff759 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index b49c84d06..8e013601f 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.1' +export const version = '0.19.2' From da7ef9815900c4575bd875c8c5e28b5d6e4ee661 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Apr 2024 14:32:41 -0300 Subject: [PATCH 336/428] VSCode Release v0.14.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 19 ++++++++++++++----- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 01cbf258a..2e94f2ad2 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.14.1 -- 2024-04-09 + ### Added ### Changed diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 900f52373..fd065d03f 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.0", + "version": "0.14.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b5bd72d62..b80840a9a 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,12 +3,14 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.0", + "version": "0.14.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" }, - "categories": ["Programming Languages"], + "categories": [ + "Programming Languages" + ], "bugs": { "url": "https://github.com/informalsystems/quint/issues" }, @@ -16,14 +18,21 @@ "type": "git", "url": "https://github.com/informalsystems/quint.git" }, - "activationEvents": ["onLanguage:quint"], + "activationEvents": [ + "onLanguage:quint" + ], "main": "./client/out/extension", "contributes": { "languages": [ { "id": "quint", - "aliases": ["Quint", "quint"], - "extensions": [".qnt"], + "aliases": [ + "Quint", + "quint" + ], + "extensions": [ + ".qnt" + ], "configuration": "./language-configuration.json", "icon": { "light": "./icons/logo-dark.png", diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index b9ff769fe..61531e915 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.0", + "version": "0.14.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.0", + "@informalsystems/quint": "^0.19.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", - "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", + "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7182,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", - "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", + "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index fbd39ff11..069a23dec 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.0", + "version": "0.14.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.0", + "@informalsystems/quint": "^0.19.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 77ab9ba4a99cf05c5ce26fc99505d53789efe3a2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Apr 2024 14:50:24 -0300 Subject: [PATCH 337/428] Sketch solution to store chosen actions and nondet values --- quint/src/runtime/compile.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 68 ++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..a3c49753b 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -27,6 +27,7 @@ import { QuintError } from '../quintError' * The name of the shadow variable that stores the last found trace. */ export const lastTraceName = 'q::lastTrace' +export const traceMetaName = 'q::traceMeta' /** * The name of a definition that wraps the user input, e.g., in REPL. diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e08509e2..078f39d4d 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -35,7 +35,7 @@ import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' import { ErrorCode, QuintError } from '../../quintError' -import { inputDefName, lastTraceName } from '../compile' +import { inputDefName, lastTraceName, traceMetaName } from '../compile' import { prettyQuintEx, terminalWidth } from '../../graphics' import { format } from '../../prettierimp' import { unreachable } from '../../util' @@ -119,8 +119,14 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') ) + const traceMeta = mkRegister('shadow', traceMetaName, just(rv.mkList([])), () => + state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::traceMeta is not set') + ) + state.shadowVars.push(lastTrace) + state.shadowVars.push(traceMeta) state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) + state.context.set(kindName(traceMeta.kind, traceMeta.name), traceMeta) return state } @@ -163,6 +169,9 @@ export class CompilerVisitor implements IRVisitor { private rand // execution listener private execListener: ExecutionListener + + private actionTaken: Maybe = none() + private nondetPicks: Maybe = none() // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -259,6 +268,11 @@ export class CompilerVisitor implements IRVisitor { const evalApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: '_', args: [app] } boundValue = { eval: () => { + if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + this.nondetPicks = just(rv.mkRecord([])) + } + if (app.opcode === inputDefName) { this.execListener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames @@ -294,6 +308,20 @@ export class CompilerVisitor implements IRVisitor { // bind the callable under its name as well this.context.set(kindName('callable', opdef.name), boundValue) } + + if (opdef.qualifier === 'action' && opdef.expr.kind === 'lambda') { + const unwrappedValue = boundValue + boundValue = { + eval: () => { + if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + this.nondetPicks = just(rv.mkRecord([])) + } + + return unwrappedValue.eval() + }, + } + } } exitLet(letDef: ir.QuintLet) { @@ -327,13 +355,19 @@ export class CompilerVisitor implements IRVisitor { // a new random value may be produced later. const undecoratedEval = exprUnderLet.eval const boundValueEval = boundValue.eval - exprUnderLet.eval = function (): Maybe { + exprUnderLet.eval = () => { const cachedValue = boundValueEval() boundValue.eval = function () { return cachedValue } // compute the result and immediately reset the cache const result = undecoratedEval() + + if (result.isJust() && qualifier === 'nondet') { + this.nondetPicks = just( + rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue)) + ) + } boundValue.eval = boundValueEval return result } @@ -1472,6 +1506,8 @@ export class CompilerVisitor implements IRVisitor { // we use a random number generator. This may change in the future. const lazyCompute = () => { // save the values of the next variables, as actions may update them + this.actionTaken = none() + this.nondetPicks = none() const valuesBefore = this.snapshotNextVars() // we store the potential successor values in this array const successors: Maybe[][] = [] @@ -1623,6 +1659,12 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() failure = nextResult.isNone() || failure + const r = this.context.get(kindName('shadow', traceMetaName))! as Register + r.registerValue.map(v => { + const s = prettyQuintEx(v.toQuintEx(zerog)) + console.log(format(80, 0, s)) + }) + if (isTrue(nextResult)) { this.shiftVars() this.extendTrace() @@ -1680,6 +1722,13 @@ export class CompilerVisitor implements IRVisitor { const extended = this.trace().push(this.varsToRecord()) trace.registerValue = just(rv.mkList(extended)) } + let meta = this.shadowVars.find(r => r.name === traceMetaName) + if (meta) { + meta.registerValue = just(this.metaVarsToRecord()) + // console.log('reseting') + this.actionTaken = none() + this.nondetPicks = none() + } } // convert the current variable values to a record @@ -1690,6 +1739,13 @@ export class CompilerVisitor implements IRVisitor { return rv.mkRecord(map) } + private metaVarsToRecord(): RuntimeValue { + return rv.mkRecord([ + ['action_taken', this.actionTaken.value!], + ['action_args', this.nondetPicks.value!], + ]) + } + private shiftVars() { this.recoverVars(this.snapshotNextVars()) this.nextVars.forEach(r => (r.registerValue = none())) @@ -1697,22 +1753,26 @@ export class CompilerVisitor implements IRVisitor { // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue) + return this.vars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue) + return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] + this.nondetPicks = values[this.vars.length + 1] } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] + this.nondetPicks = values[this.vars.length + 1] } private contextGet(name: string | bigint, kinds: ComputableKind[]) { From 671b962b4405c4eaa14c80953fd1ee48f9586d00 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Apr 2024 15:56:14 -0300 Subject: [PATCH 338/428] Add metadata to trace instead of separate variable --- quint/src/runtime/compile.ts | 1 - quint/src/runtime/impl/compilerImpl.ts | 31 +++++--------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index a3c49753b..fbec5aeca 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -27,7 +27,6 @@ import { QuintError } from '../quintError' * The name of the shadow variable that stores the last found trace. */ export const lastTraceName = 'q::lastTrace' -export const traceMetaName = 'q::traceMeta' /** * The name of a definition that wraps the user input, e.g., in REPL. diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 078f39d4d..d72781ff2 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -35,7 +35,7 @@ import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' import { ErrorCode, QuintError } from '../../quintError' -import { inputDefName, lastTraceName, traceMetaName } from '../compile' +import { inputDefName, lastTraceName } from '../compile' import { prettyQuintEx, terminalWidth } from '../../graphics' import { format } from '../../prettierimp' import { unreachable } from '../../util' @@ -119,14 +119,9 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') ) - const traceMeta = mkRegister('shadow', traceMetaName, just(rv.mkList([])), () => - state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::traceMeta is not set') - ) state.shadowVars.push(lastTrace) - state.shadowVars.push(traceMeta) state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) - state.context.set(kindName(traceMeta.kind, traceMeta.name), traceMeta) return state } @@ -1659,11 +1654,6 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() failure = nextResult.isNone() || failure - const r = this.context.get(kindName('shadow', traceMetaName))! as Register - r.registerValue.map(v => { - const s = prettyQuintEx(v.toQuintEx(zerog)) - console.log(format(80, 0, s)) - }) if (isTrue(nextResult)) { this.shiftVars() @@ -1722,13 +1712,6 @@ export class CompilerVisitor implements IRVisitor { const extended = this.trace().push(this.varsToRecord()) trace.registerValue = just(rv.mkList(extended)) } - let meta = this.shadowVars.find(r => r.name === traceMetaName) - if (meta) { - meta.registerValue = just(this.metaVarsToRecord()) - // console.log('reseting') - this.actionTaken = none() - this.nondetPicks = none() - } } // convert the current variable values to a record @@ -1736,14 +1719,12 @@ export class CompilerVisitor implements IRVisitor { const map: [string, RuntimeValue][] = this.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) - return rv.mkRecord(map) - } - private metaVarsToRecord(): RuntimeValue { - return rv.mkRecord([ - ['action_taken', this.actionTaken.value!], - ['action_args', this.nondetPicks.value!], - ]) + if (true) { + map.push(['action_taken', this.actionTaken.value!], ['nondet_picks', this.nondetPicks.value!]) + } + + return rv.mkRecord(map) } private shiftVars() { From 26e40bbde86d7fe5f2c19410c056bd937c1f45a3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 09:52:32 -0300 Subject: [PATCH 339/428] Add mbt flag and fix callable for lambdas --- quint/src/cli.ts | 5 +++ quint/src/cliCommands.ts | 1 + quint/src/repl.ts | 7 ++-- quint/src/runtime/compile.ts | 23 +++++++---- quint/src/runtime/impl/compilerImpl.ts | 55 +++++++++++++++----------- quint/src/runtime/testing.ts | 9 ++++- quint/src/simulation.ts | 11 +++++- quint/test/runtime/compile.test.ts | 31 +++++++++++---- 8 files changed, 99 insertions(+), 43 deletions(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 7bcf81866..c0fb17326 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -246,6 +246,11 @@ const runCmd = { desc: 'control how much output is produced (0 to 5)', type: 'number', default: verbosity.defaultLevel, + }) + .option('mbt', { + desc: 'whether to produce info to be used by model-based testing', + type: 'boolean', + default: false, }), // Timeouts are postponed for: // https://github.com/informalsystems/quint/issues/633 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index e05438d9d..17182dbff 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -546,6 +546,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise 0 || context.compileErrors.length > 0 || context.analysisErrors.length > 0) { printErrors(out, state, context, newInput) @@ -582,7 +583,7 @@ function tryEval(out: writer, state: ReplState, newInput: string): boolean { } if (parseResult.kind === 'declaration') { // compile the module and add it to history if everything worked - const context = compileDecls(state.compilationState, state.evaluationState, state.rng, parseResult.decls) + const context = compileDecls(state.compilationState, state.evaluationState, state.rng, false, parseResult.decls) if ( context.evaluationState.context.size === 0 || diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..0c22af170 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -140,11 +140,10 @@ export function compile( evaluationState: EvaluationState, lookupTable: LookupTable, rand: (bound: bigint) => bigint, + storeMetadata: boolean, defs: QuintDef[] ): CompilationContext { - const { analysisOutput } = compilationState - - const visitor = new CompilerVisitor(lookupTable, analysisOutput.types, rand, evaluationState) + const visitor = new CompilerVisitor(lookupTable, rand, evaluationState, storeMetadata) defs.forEach(def => walkDefinition(visitor, def)) @@ -177,6 +176,7 @@ export function compileExpr( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, expr: QuintEx ): CompilationContext { // Create a definition to encapsulate the parsed expression. @@ -184,7 +184,7 @@ export function compileExpr( // Hence, we have to compile it via an auxilliary definition. const def: QuintDef = { kind: 'def', qualifier: 'action', name: inputDefName, expr, id: state.idGen.nextId() } - return compileDecls(state, evaluationState, rng, [def]) + return compileDecls(state, evaluationState, rng, storeMetadata, [def]) } /** @@ -203,6 +203,7 @@ export function compileDecls( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, decls: QuintDeclaration[] ): CompilationContext { if (state.originalModules.length === 0 || state.modules.length === 0) { @@ -253,7 +254,7 @@ export function compileDecls( // Filter definitions that were not compiled yet const defsToCompile = flatDefinitions.filter(d => !mainModule.declarations.some(d2 => d2.id === d.id)) - const ctx = compile(newState, evaluationState, flattenedTable, rng.next, defsToCompile) + const ctx = compile(newState, evaluationState, flattenedTable, rng.next, storeMetadata, defsToCompile) return { ...ctx, analysisErrors } } @@ -276,7 +277,8 @@ export function compileFromCode( mainName: string, mainPath: SourceLookupPath, execListener: ExecutionListener, - rand: (bound: bigint) => bigint + rand: (bound: bigint) => bigint, + storeMetadata: boolean ): CompilationContext { // parse the module text // FIXME(#1052): We should build a proper sourceCode map from the files we previously loaded @@ -313,7 +315,14 @@ export function compileFromCode( }, ] const defsToCompile = main ? main.declarations : [] - const ctx = compile(compilationState, newEvaluationState(execListener), flattenedTable, rand, defsToCompile) + const ctx = compile( + compilationState, + newEvaluationState(execListener), + flattenedTable, + rand, + storeMetadata, + defsToCompile + ) return { ...ctx, diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index d72781ff2..ee8d2b1bc 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -141,8 +141,6 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable - // types assigned to expressions and definitions - private types: Map // the stack of computable values private compStack: Computable[] = [] // The map of identifiers (and sometimes, names) to their compiled values: @@ -165,6 +163,7 @@ export class CompilerVisitor implements IRVisitor { // execution listener private execListener: ExecutionListener + private storeMetadata: boolean private actionTaken: Maybe = none() private nondetPicks: Maybe = none() // the current depth of operator definitions: top-level defs are depth 0 @@ -174,13 +173,13 @@ export class CompilerVisitor implements IRVisitor { constructor( lookupTable: LookupTable, - types: Map, rand: (bound: bigint) => bigint, - evaluationState: EvaluationState + evaluationState: EvaluationState, + storeMetadata: boolean ) { this.lookupTable = lookupTable - this.types = types this.rand = rand + this.storeMetadata = storeMetadata this.context = evaluationState.context this.vars = evaluationState.vars @@ -242,7 +241,7 @@ export class CompilerVisitor implements IRVisitor { exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. - let boundValue = this.compStack.pop() + let boundValue = this.compStack.pop() as Callable if (boundValue === undefined) { this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return @@ -278,6 +277,7 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorReturn(app, [], r) return r }, + nparams: unwrappedValue.nparams, } } @@ -295,28 +295,30 @@ export class CompilerVisitor implements IRVisitor { } } - const kname = kindName('callable', opdef.id) - // bind the callable from the stack - this.context.set(kname, boundValue) - - if (specialNames.includes(opdef.name)) { - // bind the callable under its name as well - this.context.set(kindName('callable', opdef.name), boundValue) - } - if (opdef.qualifier === 'action' && opdef.expr.kind === 'lambda') { const unwrappedValue = boundValue boundValue = { - eval: () => { + eval: (args?: Maybe[]) => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) this.nondetPicks = just(rv.mkRecord([])) } - return unwrappedValue.eval() + const r: Maybe = unwrappedValue.eval(args) + return r }, + nparams: unwrappedValue.nparams, } } + + const kname = kindName('callable', opdef.id) + // bind the callable from the stack + this.context.set(kname, boundValue) + + if (specialNames.includes(opdef.name)) { + // bind the callable under its name as well + this.context.set(kindName('callable', opdef.name), boundValue) + } } exitLet(letDef: ir.QuintLet) { @@ -1038,7 +1040,7 @@ export class CompilerVisitor implements IRVisitor { // this function gives us access to the compiled operator later let callableRef: () => Maybe - if (lookupEntry === undefined || lookupEntry.kind !== 'param') { + if (lookupEntry.kind !== 'param') { // The common case: the operator has been defined elsewhere. // We simply look up for the operator and return it via callableRef. const callable = this.contextLookup(app.id, ['callable']) as Callable @@ -1720,8 +1722,13 @@ export class CompilerVisitor implements IRVisitor { .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) - if (true) { - map.push(['action_taken', this.actionTaken.value!], ['nondet_picks', this.nondetPicks.value!]) + if (this.storeMetadata) { + if (this.actionTaken.isJust()) { + map.push(['action_taken', this.actionTaken.value!]) + } + if (this.nondetPicks.isJust()) { + map.push(['nondet_picks', this.nondetPicks.value!]) + } } return rv.mkRecord(map) @@ -1745,15 +1752,15 @@ export class CompilerVisitor implements IRVisitor { // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) - this.actionTaken = values[this.vars.length] - this.nondetPicks = values[this.vars.length + 1] + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1] ?? none() } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) - this.actionTaken = values[this.vars.length] - this.nondetPicks = values[this.vars.length + 1] + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1] ?? none() } private contextGet(name: string | bigint, kinds: ComputableKind[]) { diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 291de5443..bf8c35157 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -90,7 +90,14 @@ export function compileAndTest( } const recorder = newTraceRecorder(options.verbosity, options.rng) - const ctx = compile(compilationState, newEvaluationState(recorder), lookupTable, options.rng.next, main.declarations) + const ctx = compile( + compilationState, + newEvaluationState(recorder), + lookupTable, + options.rng.next, + false, + main.declarations + ) const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors, ctx.analysisErrors) if (ctxErrors.length > 0) { diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 49ab3374e..63f207107 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -33,6 +33,7 @@ export interface SimulatorOptions { maxSteps: number rng: Rng verbosity: number + storeMetadata: boolean } /** The outcome of a simulation @@ -107,7 +108,15 @@ export function compileAndRun( const codeWithExtraDefs = code.slice(0, mainStart) + newMainModuleCode + code.slice(mainEnd) const recorder = newTraceRecorder(options.verbosity, options.rng) - const ctx = compileFromCode(idGen, codeWithExtraDefs, mainName, mainPath, recorder, options.rng.next) + const ctx = compileFromCode( + idGen, + codeWithExtraDefs, + mainName, + mainPath, + recorder, + options.rng.next, + options.storeMetadata + ) const compilationErrors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) if (compilationErrors.length > 0) { diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 12deb53a5..5e5b2ddc3 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -36,7 +36,15 @@ const idGen = newIdGenerator() function assertResultAsString(input: string, expected: string | undefined, evalContext: string = '') { const moduleText = `module contextM { ${evalContext} } module __runtime { import contextM.*\n val ${inputDefName} = ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) assert.isEmpty(context.syntaxErrors, `Syntax errors: ${context.syntaxErrors.map(quintErrorToString).join(', ')}`) assert.isEmpty(context.compileErrors, `Compile errors: ${context.compileErrors.map(quintErrorToString).join(', ')}`) @@ -65,7 +73,15 @@ function assertComputableAsString(computable: Computable, expected: string | und function evalInContext(input: string, callable: (ctx: CompilationContext) => Either) { const moduleText = `module __runtime { ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) return callable(context) } @@ -1157,6 +1173,7 @@ describe('incremental compilation', () => { newEvaluationState(noExecutionListener), flattenedTable, dummyRng.next, + false, moduleToCompile.declarations ) } @@ -1172,7 +1189,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const expr = parsed.kind === 'expr' ? parsed.expr : undefined - const context = compileExpr(compilationState, evaluationState, dummyRng, expr!) + const context = compileExpr(compilationState, evaluationState, dummyRng, false, expr!) assert.deepEqual(context.compilationState.analysisOutput.types.get(expr!.id)?.type, { kind: 'int', id: 3n }) @@ -1191,7 +1208,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const defs = parsed.kind === 'declaration' ? parsed.decls : undefined - const context = compileDecls(compilationState, evaluationState, dummyRng, defs!) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, defs!) assert.deepEqual(context.compilationState.analysisOutput.types.get(defs![0].id)?.type, { kind: 'int', id: 3n }) @@ -1212,7 +1229,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert.sameDeepMembers(context.syntaxErrors, [ { @@ -1233,7 +1250,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) const typeDecl = decls[0] assert(typeDecl.kind === 'typedef') @@ -1252,7 +1269,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert(decls.find(t => t.kind === 'typedef' && t.name === 'T')) // Sum type declarations are expanded to add an From 85c02e303c301da7d9ac62d9d4490dad3d738369 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 10:18:08 -0300 Subject: [PATCH 340/428] Fix a nondet scenario --- quint/src/runtime/impl/compilerImpl.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index ee8d2b1bc..c3ef1a656 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -361,9 +361,15 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - this.nondetPicks = just( - rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue)) - ) + if (this.nondetPicks.isJust()) { + this.nondetPicks = just( + rv.mkRecord( + this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue) + ) + ) + } else { + this.nondetPicks = just(rv.mkRecord([[letDef.opdef.name, cachedValue.value as RuntimeValue]])) + } } boundValue.eval = boundValueEval return result From 30ce0e5c974a0e31a450e26dd30fec503b32db94 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 10:26:01 -0300 Subject: [PATCH 341/428] Remove unused import --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c3ef1a656..b8429cb33 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -15,7 +15,6 @@ import { List, OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' -import { TypeScheme } from '../../types/base' import { Callable, Computable, From 0a83e68dc44c6653edc8f59c3048e3d260011f00 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 18:57:34 -0300 Subject: [PATCH 342/428] Keep traces in an object instead of a shadow var We were only using shadow variables for this purpose, and it was a lot of additional complexity. --- quint/src/names/base.ts | 1 + quint/src/repl.ts | 2 - quint/src/runtime/compile.ts | 8 +- quint/src/runtime/impl/compilerImpl.ts | 380 ++++++++++++------------- quint/src/runtime/impl/trace.ts | 18 ++ quint/src/runtime/runtime.ts | 2 +- quint/src/runtime/testing.ts | 15 +- quint/src/simulation.ts | 3 +- 8 files changed, 209 insertions(+), 220 deletions(-) create mode 100644 quint/src/runtime/impl/trace.ts diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 3a4f63908..2451fbcc7 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -246,4 +246,5 @@ export const builtinNames = [ 'matchVariant', 'variant', 'q::debug', + 'q::lastTrace', ] diff --git a/quint/src/repl.ts b/quint/src/repl.ts index c2bc6c355..5c3dc8e13 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -25,7 +25,6 @@ import { compileFromCode, contextNameLookup, inputDefName, - lastTraceName, newCompilationState, } from './runtime/compile' import { createFinders, formatError } from './errorReporter' @@ -482,7 +481,6 @@ function saveVars(vars: Register[], nextvars: Register[]): Maybe { // In the future, we will declare them in a separate module. function simulatorBuiltins(st: CompilationState): QuintDef[] { return [ - parseDefOrThrow(`val ${lastTraceName} = []`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::test = (q::nruns, q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::testOnce = (q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), ] diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..0c4cd5a92 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -24,7 +24,7 @@ import { flattenModules } from '../flattening/fullFlattener' import { QuintError } from '../quintError' /** - * The name of the shadow variable that stores the last found trace. + * The name of the builtin name that returns the last found trace. */ export const lastTraceName = 'q::lastTrace' @@ -142,9 +142,7 @@ export function compile( rand: (bound: bigint) => bigint, defs: QuintDef[] ): CompilationContext { - const { analysisOutput } = compilationState - - const visitor = new CompilerVisitor(lookupTable, analysisOutput.types, rand, evaluationState) + const visitor = new CompilerVisitor(lookupTable, rand, evaluationState) defs.forEach(def => walkDefinition(visitor, def)) @@ -157,7 +155,7 @@ export function compile( return visitor.getRuntimeErrors().splice(0) }, compilationState, - evaluationState: visitor.getEvaluationState(), + evaluationState: visitor.evaluationState, } } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e08509e2..c66b8d244 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -15,7 +15,6 @@ import { List, OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' -import { TypeScheme } from '../../types/base' import { Callable, Computable, @@ -33,6 +32,7 @@ import { ExecutionListener } from '../trace' import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' +import { Trace } from './trace' import { ErrorCode, QuintError } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' @@ -72,8 +72,8 @@ export interface EvaluationState { vars: Register[] // The list of variables in the next state. nextVars: Register[] - // The list of shadow variables. - shadowVars: Register[] + // The current trace of states + trace: Trace // The error tracker for the evaluation to store errors on callbacks. errorTracker: CompilerErrorTracker // The execution listener that the compiled code uses to report execution info. @@ -103,25 +103,18 @@ export class CompilerErrorTracker { /** * Creates a new EvaluationState object with the initial state of the evaluation. * - * @returns a new EvaluationState object with the lastTrace shadow variable register + * @returns a new EvaluationState object */ export function newEvaluationState(listener: ExecutionListener): EvaluationState { const state: EvaluationState = { context: builtinContext(), vars: [], nextVars: [], - shadowVars: [], + trace: new Trace(), errorTracker: new CompilerErrorTracker(), listener: listener, } - // Initialize compiler state - const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => - state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') - ) - state.shadowVars.push(lastTrace) - state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) - return state } @@ -141,98 +134,42 @@ export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable // types assigned to expressions and definitions - private types: Map // the stack of computable values private compStack: Computable[] = [] - // The map of identifiers (and sometimes, names) to their compiled values: - // - wrappers around RuntimeValue - // - an instance of Register - // - an instance of Callable. - // The keys should be constructed via `kindName`. - private context: Map - - // all variables declared during compilation - private vars: Register[] - // the registers allocated for the next-state values of vars - private nextVars: Register[] - // shadow variables that are used by the simulator - private shadowVars: Register[] - // keeps errors in a state - private errorTracker: CompilerErrorTracker - // pre-initialized random number generator + private rand - // execution listener - private execListener: ExecutionListener // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 + evaluationState: EvaluationState - constructor( - lookupTable: LookupTable, - types: Map, - rand: (bound: bigint) => bigint, - evaluationState: EvaluationState - ) { + constructor(lookupTable: LookupTable, rand: (bound: bigint) => bigint, evaluationState: EvaluationState) { this.lookupTable = lookupTable - this.types = types this.rand = rand - this.context = evaluationState.context - this.vars = evaluationState.vars - this.nextVars = evaluationState.nextVars - this.shadowVars = evaluationState.shadowVars - this.errorTracker = evaluationState.errorTracker - this.execListener = evaluationState.listener - } - - /** - * Get the compiler state. - */ - getEvaluationState(): EvaluationState { - return { - context: this.context, - vars: this.vars, - nextVars: this.nextVars, - shadowVars: this.shadowVars, - errorTracker: this.errorTracker, - listener: this.execListener, - } - } - - /** - * Get the compiled context. - */ - getContext(): Map { - return this.context + this.evaluationState = evaluationState } /** * Get the names of the compiled variables. */ getVars(): string[] { - return this.vars.map(r => r.name) - } - - /** - * Get the names of the shadow variables. - */ - getShadowVars(): string[] { - return this.shadowVars.map(r => r.name) + return this.evaluationState.vars.map(r => r.name) } /** * Get the array of compile errors, which changes as the code gets executed. */ getCompileErrors(): QuintError[] { - return this.errorTracker.compileErrors + return this.evaluationState.errorTracker.compileErrors } /** * Get the array of runtime errors, which changes as the code gets executed. */ getRuntimeErrors(): QuintError[] { - return this.errorTracker.runtimeErrors + return this.evaluationState.errorTracker.runtimeErrors } exitOpDef(opdef: ir.QuintOpDef) { @@ -240,7 +177,11 @@ export class CompilerVisitor implements IRVisitor { // All of them are compiled to callables, which may have zero parameters. let boundValue = this.compStack.pop() if (boundValue === undefined) { - this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) + this.evaluationState.errorTracker.addCompileError( + opdef.id, + 'QNT501', + `No expression for ${opdef.name} on compStack` + ) return } @@ -260,13 +201,13 @@ export class CompilerVisitor implements IRVisitor { boundValue = { eval: () => { if (app.opcode === inputDefName) { - this.execListener.onUserOperatorCall(evalApp) + this.evaluationState.listener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames } else { - this.execListener.onUserOperatorCall(app) + this.evaluationState.listener.onUserOperatorCall(app) } const r: Maybe = unwrappedValue.eval() - this.execListener.onUserOperatorReturn(app, [], r) + this.evaluationState.listener.onUserOperatorReturn(app, [], r) return r }, } @@ -288,11 +229,11 @@ export class CompilerVisitor implements IRVisitor { const kname = kindName('callable', opdef.id) // bind the callable from the stack - this.context.set(kname, boundValue) + this.evaluationState.context.set(kname, boundValue) if (specialNames.includes(opdef.name)) { // bind the callable under its name as well - this.context.set(kindName('callable', opdef.name), boundValue) + this.evaluationState.context.set(kindName('callable', opdef.name), boundValue) } } @@ -311,7 +252,7 @@ export class CompilerVisitor implements IRVisitor { // get the expression that is evaluated in the context of let. const exprUnderLet = this.compStack.slice(-1).pop() if (exprUnderLet === undefined) { - this.errorTracker.addCompileError( + this.evaluationState.errorTracker.addCompileError( letDef.opdef.id, 'QNT501', `No expression for ${letDef.opdef.name} on compStack` @@ -320,7 +261,7 @@ export class CompilerVisitor implements IRVisitor { } const kname = kindName('callable', letDef.opdef.id) - const boundValue = this.context.get(kname) ?? fail + const boundValue = this.evaluationState.context.get(kname) ?? fail // Override the behavior of the expression under let: // It precomputes the bound value and uses it in the evaluation. // Once the evaluation is done, the value is reset, so that @@ -343,7 +284,7 @@ export class CompilerVisitor implements IRVisitor { // all constants should be instantiated before running the simulator const code: ErrorCode = 'QNT500' const msg = `Uninitialized const ${cdef.name}. Use: import (${cdef.name}=).*` - this.errorTracker.addCompileError(cdef.id, code, msg) + this.evaluationState.errorTracker.addCompileError(cdef.id, code, msg) } exitVar(vardef: ir.QuintVar) { @@ -353,13 +294,13 @@ export class CompilerVisitor implements IRVisitor { // definition. Don't overwrite the register if that happens. In some cases // (with instances), the variable can have a different ID, but the same // name. In that case, we assign the register with that name for the new ID. - if (this.context.has(kindName('var', varName))) { - const register = this.context.get(kindName('var', varName))! - this.context.set(kindName('var', vardef.id), register) + if (this.evaluationState.context.has(kindName('var', varName))) { + const register = this.evaluationState.context.get(kindName('var', varName))! + this.evaluationState.context.set(kindName('var', vardef.id), register) - if (this.context.has(kindName('nextvar', varName))) { - const register = this.context.get(kindName('nextvar', varName))! - this.context.set(kindName('nextvar', vardef.id), register) + if (this.evaluationState.context.has(kindName('nextvar', varName))) { + const register = this.evaluationState.context.get(kindName('nextvar', varName))! + this.evaluationState.context.set(kindName('nextvar', vardef.id), register) } return @@ -369,19 +310,19 @@ export class CompilerVisitor implements IRVisitor { // one for the variable, and // one for its next-state version const prevRegister = mkRegister('var', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) + this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) ) - this.vars.push(prevRegister) + this.evaluationState.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name - this.context.set(kindName('var', varName), prevRegister) - this.context.set(kindName('var', vardef.id), prevRegister) + this.evaluationState.context.set(kindName('var', varName), prevRegister) + this.evaluationState.context.set(kindName('var', vardef.id), prevRegister) const nextRegister = mkRegister('nextvar', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) + this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) ) - this.nextVars.push(nextRegister) + this.evaluationState.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name - this.context.set(kindName('nextvar', varName), nextRegister) - this.context.set(kindName('nextvar', vardef.id), nextRegister) + this.evaluationState.context.set(kindName('nextvar', varName), nextRegister) + this.evaluationState.context.set(kindName('nextvar', vardef.id), nextRegister) } enterLiteral(expr: ir.QuintBool | ir.QuintInt | ir.QuintStr) { @@ -404,11 +345,14 @@ export class CompilerVisitor implements IRVisitor { } enterName(name: ir.QuintName) { + if (name.name === lastTraceName) { + this.compStack.push(mkConstComputable(rv.mkList(this.evaluationState.trace.get()))) + return + } // The name belongs to one of the objects: // a shadow variable, a variable, an argument, a callable. // The order is important, as defines the name priority. const comp = - this.contextGet(name.name, ['shadow']) ?? this.contextLookup(name.id, ['arg', 'var', 'callable']) ?? // a backup case for Nat, Int, and Bool, and special names such as q::input this.contextGet(name.name, ['arg', 'callable']) @@ -417,7 +361,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(comp) } else { // this should not happen, due to the name resolver - this.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) + this.evaluationState.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) this.compStack.push(fail) } } @@ -435,7 +379,11 @@ export class CompilerVisitor implements IRVisitor { const nextvar = this.contextGet(name, ['nextvar']) this.compStack.push(nextvar ?? fail) } else { - this.errorTracker.addCompileError(app.id, 'QNT502', 'Operator next(...) needs one argument') + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT502', + 'Operator next(...) needs one argument' + ) this.compStack.push(fail) } } @@ -512,7 +460,7 @@ export class CompilerVisitor implements IRVisitor { if (q.toInt() !== 0n) { return just(rv.mkInt(p.toInt() / q.toInt())) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') return none() } }) @@ -525,9 +473,9 @@ export class CompilerVisitor implements IRVisitor { case 'ipow': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() == 0n && p.toInt() == 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') } else if (q.toInt() < 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') } else { return just(rv.mkInt(p.toInt() ** q.toInt())) } @@ -581,7 +529,7 @@ export class CompilerVisitor implements IRVisitor { } return just(rv.mkList(arr)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) return none() } }) @@ -608,7 +556,7 @@ export class CompilerVisitor implements IRVisitor { if (l.size > 0) { return this.sliceList(app.id, l, 1, l.size) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') return none() } }) @@ -620,7 +568,7 @@ export class CompilerVisitor implements IRVisitor { if (s >= 0 && s <= l.size && e <= l.size && e >= s) { return this.sliceList(app.id, l, s, e) } else { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT506', `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` @@ -666,7 +614,11 @@ export class CompilerVisitor implements IRVisitor { if (fieldValue) { return just(fieldValue) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Accessing a missing record field ${name}`) + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT501', + `Accessing a missing record field ${name}` + ) return none() } }) @@ -691,7 +643,11 @@ export class CompilerVisitor implements IRVisitor { const newMap = rec.toOrderedMap().set(key, fieldValue) return just(rv.mkRecord(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Called 'with' with a non-existent key ${key}`) + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT501', + `Called 'with' with a non-existent key ${key}` + ) return none() } }) @@ -802,7 +758,11 @@ export class CompilerVisitor implements IRVisitor { return just(value) } else { // Should we print the key? It may be a complex expression. - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'get' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'get' with a non-existing key" + ) return none() } }) @@ -817,7 +777,11 @@ export class CompilerVisitor implements IRVisitor { const newMap = asMap.set(normalKey, newValue) return just(rv.fromMap(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'set' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'set' with a non-existing key" + ) return none() } }) @@ -845,7 +809,11 @@ export class CompilerVisitor implements IRVisitor { return rv.fromMap(newMap) }) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'setBy' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'setBy' with a non-existing key" + ) return none() } }) @@ -927,7 +895,7 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - this.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') return none() } return just(cond) @@ -964,7 +932,7 @@ export class CompilerVisitor implements IRVisitor { case 'eventually': case 'enabled': this.applyFun(app.id, 1, _ => { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -979,7 +947,7 @@ export class CompilerVisitor implements IRVisitor { case 'weakFair': case 'strongFair': this.applyFun(app.id, 2, _ => { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -996,7 +964,7 @@ export class CompilerVisitor implements IRVisitor { private applyUserDefined(app: ir.QuintApp) { const onError = (sourceId: bigint, msg: string): void => { - this.errorTracker.addCompileError(sourceId, 'QNT501', msg) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', msg) this.compStack.push(fail) } @@ -1041,18 +1009,18 @@ export class CompilerVisitor implements IRVisitor { // This code is similar to applyFun, but it calls the listener before const comp = { eval: (): Maybe => { - this.execListener.onUserOperatorCall(app) + this.evaluationState.listener.onUserOperatorCall(app) // compute the values of the arguments at this point const merged = merge(args.map(a => a.eval())) const callable = callableRef() if (merged.isNone() || callable.isNone()) { - this.execListener.onUserOperatorReturn(app, [], none()) + this.evaluationState.listener.onUserOperatorReturn(app, [], none()) return none() } return merged .map(values => { const result = callable.value.eval(values.map(just)) as Maybe - this.execListener.onUserOperatorReturn(app, values, result) + this.evaluationState.listener.onUserOperatorReturn(app, values, result) return result }) .join() @@ -1066,10 +1034,10 @@ export class CompilerVisitor implements IRVisitor { // introduce a register for every parameter lam.params.forEach(p => { const register = mkRegister('arg', p.name, none(), () => `Parameter ${p} is not set`) - this.context.set(kindName('arg', p.id), register) + this.evaluationState.context.set(kindName('arg', p.id), register) if (specialNames.includes(p.name)) { - this.context.set(kindName('arg', p.name), register) + this.evaluationState.context.set(kindName('arg', p.name), register) } }) // After this point, the body of the lambda gets compiled. @@ -1088,10 +1056,10 @@ export class CompilerVisitor implements IRVisitor { const register = this.contextGet(id, ['arg']) as Register if (register && register.registerValue) { - this.context.delete(key) + this.evaluationState.context.delete(key) registers.push(register) } else { - this.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) + this.evaluationState.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) } }) @@ -1099,19 +1067,19 @@ export class CompilerVisitor implements IRVisitor { if (lambdaBody) { this.compStack.push(mkCallable(registers, lambdaBody)) } else { - this.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') + this.evaluationState.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') } } private translateAssign(sourceId: bigint): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) return } const [register, rhs] = this.compStack.splice(-2) const name = (register as Register).name if (name === undefined) { - this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) this.compStack.push(fail) return } @@ -1124,7 +1092,7 @@ export class CompilerVisitor implements IRVisitor { return just(rv.mkBool(true)) }) } else { - this.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) this.compStack.push(fail) } } @@ -1150,7 +1118,7 @@ export class CompilerVisitor implements IRVisitor { mapResultAndElems: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') return } // lambda translated to Callable @@ -1171,7 +1139,7 @@ export class CompilerVisitor implements IRVisitor { */ private applyFold(sourceId: bigint, order: 'fwd' | 'rev'): void { if (this.compStack.length < 3) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') return } // extract two arguments from the call stack and keep the set @@ -1212,7 +1180,7 @@ export class CompilerVisitor implements IRVisitor { // push the combined computable value on the stack private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => Maybe) { if (this.compStack.length < nargs) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop nargs elements of the compStack const args = this.compStack.splice(-nargs, nargs) @@ -1228,7 +1196,7 @@ export class CompilerVisitor implements IRVisitor { .join() } catch (error) { const msg = error instanceof Error ? error.message : 'unknown error' - this.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) return none() } }, @@ -1241,7 +1209,7 @@ export class CompilerVisitor implements IRVisitor { // as it should not evaluate both arms private translateIfThenElse(sourceId: bigint) { if (this.compStack.length < 3) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop 3 elements of the compStack const [cond, thenArm, elseArm] = this.compStack.splice(-3, 3) @@ -1271,7 +1239,8 @@ export class CompilerVisitor implements IRVisitor { ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() - const savedTrace = this.trace() + const savedTrace = this.evaluationState.trace.get() + let result: Maybe = just(rv.mkBool(true)) // Evaluate arguments iteratively. // Stop as soon as one of the arguments returns false. @@ -1287,12 +1256,12 @@ export class CompilerVisitor implements IRVisitor { // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) - this.resetTrace(just(rv.mkList(savedTrace))) + this.evaluationState.trace.reset(savedTrace) if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( actionId(actionNo), 'QNT513', `Cannot continue in A.then(B), A evaluates to 'false'` @@ -1307,9 +1276,9 @@ export class CompilerVisitor implements IRVisitor { if (kind === 'then' && nactionsLeft > 0) { const oldState: RuntimeValue = this.varsToRecord() this.shiftVars() - this.extendTrace() const newState: RuntimeValue = this.varsToRecord() - this.execListener.onNextState(oldState, newState) + this.evaluationState.trace.extend(newState) + this.evaluationState.listener.onNextState(oldState, newState) } } @@ -1319,7 +1288,11 @@ export class CompilerVisitor implements IRVisitor { // translate all { A, ..., C } or A.then(B) private translateAllOrThen(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const args = this.compStack.splice(-app.args.length) @@ -1342,26 +1315,30 @@ export class CompilerVisitor implements IRVisitor { // The code below is an adaption of chainAllOrThen. // If someone finds how to nicely combine both, please refactor. if (this.compStack.length !== 2) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const [action, pred] = this.compStack.splice(-2) const lazyCompute = (): Maybe => { const savedNextVars = this.snapshotNextVars() - const savedTrace = this.trace() + const savedTrace = this.evaluationState.trace.get() const actionResult = action.eval() if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { // 'A' evaluates to 'false', or produces an error. // Restore the values of the next variables. this.recoverNextVars(savedNextVars) - this.resetTrace(just(rv.mkList(savedTrace))) + this.evaluationState.trace.reset(savedTrace) // expect emits an error when the run could not finish - this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + this.evaluationState.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') return none() } else { const savedVarsAfterAction = this.snapshotVars() const savedNextVarsAfterAction = this.snapshotNextVars() - const savedTraceAfterAction = this.trace() + const savedTraceAfterAction = this.evaluationState.trace.get() // Temporarily, switch to the next frame, to make a look-ahead evaluation. // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. this.shiftVars() @@ -1373,9 +1350,13 @@ export class CompilerVisitor implements IRVisitor { // For example: `A.expect(P).then(B)`. this.recoverVars(savedVarsAfterAction) this.recoverNextVars(savedNextVarsAfterAction) - this.resetTrace(just(rv.mkList(savedTraceAfterAction))) + this.evaluationState.trace.reset(savedTraceAfterAction) if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { - this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') + this.evaluationState.errorTracker.addRuntimeError( + app.args[1].id, + 'QNT508', + 'Expect condition does not hold true' + ) return none() } return predResult @@ -1388,7 +1369,11 @@ export class CompilerVisitor implements IRVisitor { // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const [niterations, action] = this.compStack.splice(-2) @@ -1427,7 +1412,11 @@ export class CompilerVisitor implements IRVisitor { shortCircuit: (no: number, r: boolean) => Maybe ): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const args = this.compStack.splice(-app.args.length) @@ -1461,7 +1450,7 @@ export class CompilerVisitor implements IRVisitor { // translate any { A, ..., C } private translateOrAction(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') + this.evaluationState.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') return } const args = this.compStack.splice(-app.args.length) @@ -1480,10 +1469,10 @@ export class CompilerVisitor implements IRVisitor { args.forEach((arg, i) => { this.recoverNextVars(valuesBefore) // either the argument is evaluated to false, or fails - this.execListener.onAnyOptionCall(app, i) + this.evaluationState.listener.onAnyOptionCall(app, i) const result = arg.eval().or(just(rv.mkBool(false))) const boolResult = (result.unwrap() as RuntimeValue).toBool() - this.execListener.onAnyOptionReturn(app, i) + this.evaluationState.listener.onAnyOptionReturn(app, i) // if this arm evaluates to true, save it in the candidates if (boolResult === true) { successors.push(this.snapshotNextVars()) @@ -1496,7 +1485,7 @@ export class CompilerVisitor implements IRVisitor { if (ncandidates === 0) { // no successor: restore the state and return false this.recoverNextVars(valuesBefore) - this.execListener.onAnyReturn(args.length, -1) + this.evaluationState.listener.onAnyReturn(args.length, -1) return just(rv.mkBool(false)) } else if (ncandidates === 1) { // There is exactly one successor, the execution is deterministic. @@ -1508,7 +1497,7 @@ export class CompilerVisitor implements IRVisitor { } this.recoverNextVars(successors[choice]) - this.execListener.onAnyReturn(args.length, successorIndices[choice]) + this.evaluationState.listener.onAnyReturn(args.length, successorIndices[choice]) return just(rv.mkBool(true)) } @@ -1524,7 +1513,7 @@ export class CompilerVisitor implements IRVisitor { b .map(sz => { if (sz === 0n) { - this.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) } return this.rand(sz) }) @@ -1543,7 +1532,11 @@ export class CompilerVisitor implements IRVisitor { private test(sourceId: bigint) { if (this.compStack.length < 5) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::test"') + this.evaluationState.errorTracker.addCompileError( + sourceId, + 'QNT501', + 'Not enough arguments on stack for "q::test"' + ) return } @@ -1553,7 +1546,11 @@ export class CompilerVisitor implements IRVisitor { private testOnce(sourceId: bigint) { if (this.compStack.length < 4) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::testOnce"') + this.evaluationState.errorTracker.addCompileError( + sourceId, + 'QNT501', + 'Not enough arguments on stack for "q::testOnce"' + ) return } @@ -1590,23 +1587,23 @@ export class CompilerVisitor implements IRVisitor { // do multiple runs, stop at the first failing run const nruns = (nrunsRes as RuntimeValue).toInt() for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { - this.execListener.onRunCall() - this.resetTrace() + this.evaluationState.listener.onRunCall() + this.evaluationState.trace.reset() // check Init() const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } - this.execListener.onUserOperatorCall(initApp) + this.evaluationState.listener.onUserOperatorCall(initApp) const initResult = init.eval() failure = initResult.isNone() || failure if (!isTrue(initResult)) { - this.execListener.onUserOperatorReturn(initApp, [], initResult) + this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) } else { // The initial action evaluates to true. // Our guess of values was good. this.shiftVars() - this.extendTrace() + this.evaluationState.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() - this.execListener.onUserOperatorReturn(initApp, [], initResult) + this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) failure = invResult.isNone() || failure if (!isTrue(invResult)) { errorFound = true @@ -1620,14 +1617,15 @@ export class CompilerVisitor implements IRVisitor { opcode: 'q::stepAndInvariant', args: [], } - this.execListener.onUserOperatorCall(nextApp) + this.evaluationState.listener.onUserOperatorCall(nextApp) + // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { this.shiftVars() - this.extendTrace() + this.evaluationState.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) } else { // Otherwise, the run cannot be extended. // In some cases, this may indicate a deadlock. @@ -1636,15 +1634,15 @@ export class CompilerVisitor implements IRVisitor { // the run. Hence, do not report an error here, but simply // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) - this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace().toArray()) + this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) + this.evaluationState.listener.onRunReturn(just(rv.mkBool(true)), this.evaluationState.trace.get()) break } } } } const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() - this.execListener.onRunReturn(outcome, this.trace().toArray()) + this.evaluationState.listener.onRunReturn(outcome, this.evaluationState.trace.get()) // recover the state variables this.recoverVars(vars) this.recoverNextVars(nextVars) @@ -1658,33 +1656,9 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(mkFunComputable(doRun)) } - private trace(): List { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace && trace.registerValue.isJust()) { - return trace.registerValue.value.toList() - } else { - return List() - } - } - - private resetTrace(value: Maybe = just(rv.mkList([]))) { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - trace.registerValue = value - } - } - - private extendTrace() { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - const extended = this.trace().push(this.varsToRecord()) - trace.registerValue = just(rv.mkList(extended)) - } - } - // convert the current variable values to a record private varsToRecord(): RuntimeValue { - const map: [string, RuntimeValue][] = this.vars + const map: [string, RuntimeValue][] = this.evaluationState.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) return rv.mkRecord(map) @@ -1692,32 +1666,32 @@ export class CompilerVisitor implements IRVisitor { private shiftVars() { this.recoverVars(this.snapshotNextVars()) - this.nextVars.forEach(r => (r.registerValue = none())) + this.evaluationState.nextVars.forEach(r => (r.registerValue = none())) } // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue) + return this.evaluationState.vars.map(r => r.registerValue) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue) + return this.evaluationState.nextVars.map(r => r.registerValue) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { - this.vars.forEach((r, i) => (r.registerValue = values[i])) + this.evaluationState.vars.forEach((r, i) => (r.registerValue = values[i])) } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { - this.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.evaluationState.nextVars.forEach((r, i) => (r.registerValue = values[i])) } private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { - const value = this.context.get(kindName(k, name)) + const value = this.evaluationState.context.get(kindName(k, name)) if (value) { return value } @@ -1731,7 +1705,7 @@ export class CompilerVisitor implements IRVisitor { if (vdef) { const refId = vdef.id! for (const k of kinds) { - const value = this.context.get(kindName(k, refId)) + const value = this.evaluationState.context.get(kindName(k, refId)) if (value) { return value } @@ -1747,7 +1721,7 @@ export class CompilerVisitor implements IRVisitor { const elem = list.get(Number(idx)) return elem ? just(elem) : none() } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) return none() } } @@ -1757,7 +1731,11 @@ export class CompilerVisitor implements IRVisitor { if (idx >= 0n && idx < list.size) { return just(rv.mkList(list.set(Number(idx), value))) } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, replaceAt(..., ${idx}, ...)`) + this.evaluationState.errorTracker.addRuntimeError( + sourceId, + 'QNT510', + `Out of bounds, replaceAt(..., ${idx}, ...)` + ) return none() } } diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts new file mode 100644 index 000000000..e957ac3ab --- /dev/null +++ b/quint/src/runtime/impl/trace.ts @@ -0,0 +1,18 @@ +import { List } from 'immutable' +import { RuntimeValue } from './runtimeValue' + +export class Trace { + private states: List = List() + + get(): RuntimeValue[] { + return [...this.states.toArray()] + } + + reset(values: RuntimeValue[] = []) { + this.states = List(values) + } + + extend(state: RuntimeValue) { + this.states = this.states.push(state) + } +} diff --git a/quint/src/runtime/runtime.ts b/quint/src/runtime/runtime.ts index 4bda5b356..0b4a51dbf 100644 --- a/quint/src/runtime/runtime.ts +++ b/quint/src/runtime/runtime.ts @@ -59,7 +59,7 @@ export interface Computable { /** * The kind of a computable. */ -export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' | 'shadow' +export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' /** * Create a key that encodes its name and kind. This is only useful for diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 291de5443..6401678f2 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -9,17 +9,15 @@ */ import { Either, left, mergeInMany, right } from '@sweet-monads/either' -import { just } from '@sweet-monads/maybe' import { QuintEx, QuintOpDef } from '../ir/quintIr' -import { CompilationContext, CompilationState, compile, lastTraceName } from './compile' +import { CompilationContext, CompilationState, compile } from './compile' import { zerog } from './../idGenerator' import { LookupTable } from '../names/base' -import { Computable, Register, kindName } from './runtime' +import { Computable, kindName } from './runtime' import { ExecutionFrame, newTraceRecorder } from './trace' import { Rng } from '../rng' -import { RuntimeValue, rv } from './impl/runtimeValue' import { newEvaluationState } from './impl/compilerImpl' import { QuintError } from '../quintError' @@ -130,15 +128,14 @@ export function compileAndTest( seed = options.rng.getState() recorder.onRunCall() // reset the trace - const traceReg = ctx.evaluationState.context.get(kindName('shadow', lastTraceName)) as Register - traceReg.registerValue = just(rv.mkList([])) + ctx.evaluationState.trace.reset() // run the test const result = comp.eval() // extract the trace - const trace = traceReg.eval() + const trace = ctx.evaluationState.trace.get() - if (trace.isJust()) { - recorder.onRunReturn(result, [...(trace.value as RuntimeValue).toList()]) + if (trace.length > 0) { + recorder.onRunReturn(result, trace) } else { // Report a non-critical error console.error('Missing a trace') diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 49ab3374e..bcb131b59 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -10,7 +10,7 @@ import { Either } from '@sweet-monads/either' -import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' +import { compileFromCode, contextNameLookup } from './runtime/compile' import { QuintEx } from './ir/quintIr' import { Computable } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' @@ -94,7 +94,6 @@ export function compileAndRun( const o = options // Defs required by the simulator, to be added to the main module before compilation const extraDefs = [ - `val ${lastTraceName} = [];`, `def q::test(q::nrunsArg, q::nstepsArg, q::initArg, q::nextArg, q::invArg) = false`, `action q::init = { ${o.init} }`, `action q::step = { ${o.step} }`, From 453fa18cdeeaabcf78cf5781a2cd84d9b37eaa56 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 08:58:57 -0300 Subject: [PATCH 343/428] Go back to "delegated" attributes from evaluation state --- quint/src/runtime/compile.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 311 ++++++++++++------------- 2 files changed, 144 insertions(+), 169 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index 0c4cd5a92..7bc2d665b 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -155,7 +155,7 @@ export function compile( return visitor.getRuntimeErrors().splice(0) }, compilationState, - evaluationState: visitor.evaluationState, + evaluationState: visitor.getEvaluationState(), } } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c66b8d244..c01785c58 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -133,43 +133,78 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable - // types assigned to expressions and definitions // the stack of computable values private compStack: Computable[] = [] + // The map of identifiers (and sometimes, names) to their compiled values: + // - wrappers around RuntimeValue + // - an instance of Register + // - an instance of Callable. + // The keys should be constructed via `kindName`. + context: Map + // all variables declared during compilation + private vars: Register[] + // the registers allocated for the next-state values of vars + private nextVars: Register[] + // keeps errors in a state + private errorTracker: CompilerErrorTracker + // pre-initialized random number generator private rand + // execution listener + private execListener: ExecutionListener + // a tracker for the current execution trace + private trace: Trace + // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 - evaluationState: EvaluationState constructor(lookupTable: LookupTable, rand: (bound: bigint) => bigint, evaluationState: EvaluationState) { this.lookupTable = lookupTable this.rand = rand - this.evaluationState = evaluationState + this.context = evaluationState.context + this.vars = evaluationState.vars + this.nextVars = evaluationState.nextVars + this.errorTracker = evaluationState.errorTracker + this.execListener = evaluationState.listener + this.trace = evaluationState.trace + } + + /** + * Get the compiler state. + */ + getEvaluationState(): EvaluationState { + return { + context: this.context, + vars: this.vars, + nextVars: this.nextVars, + errorTracker: this.errorTracker, + listener: this.execListener, + trace: this.trace, + } } /** * Get the names of the compiled variables. */ getVars(): string[] { - return this.evaluationState.vars.map(r => r.name) + return this.vars.map(r => r.name) } /** * Get the array of compile errors, which changes as the code gets executed. */ getCompileErrors(): QuintError[] { - return this.evaluationState.errorTracker.compileErrors + return this.errorTracker.compileErrors } /** * Get the array of runtime errors, which changes as the code gets executed. */ getRuntimeErrors(): QuintError[] { - return this.evaluationState.errorTracker.runtimeErrors + return this.errorTracker.runtimeErrors } exitOpDef(opdef: ir.QuintOpDef) { @@ -177,11 +212,7 @@ export class CompilerVisitor implements IRVisitor { // All of them are compiled to callables, which may have zero parameters. let boundValue = this.compStack.pop() if (boundValue === undefined) { - this.evaluationState.errorTracker.addCompileError( - opdef.id, - 'QNT501', - `No expression for ${opdef.name} on compStack` - ) + this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return } @@ -201,13 +232,13 @@ export class CompilerVisitor implements IRVisitor { boundValue = { eval: () => { if (app.opcode === inputDefName) { - this.evaluationState.listener.onUserOperatorCall(evalApp) + this.execListener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames } else { - this.evaluationState.listener.onUserOperatorCall(app) + this.execListener.onUserOperatorCall(app) } const r: Maybe = unwrappedValue.eval() - this.evaluationState.listener.onUserOperatorReturn(app, [], r) + this.execListener.onUserOperatorReturn(app, [], r) return r }, } @@ -229,11 +260,11 @@ export class CompilerVisitor implements IRVisitor { const kname = kindName('callable', opdef.id) // bind the callable from the stack - this.evaluationState.context.set(kname, boundValue) + this.context.set(kname, boundValue) if (specialNames.includes(opdef.name)) { // bind the callable under its name as well - this.evaluationState.context.set(kindName('callable', opdef.name), boundValue) + this.context.set(kindName('callable', opdef.name), boundValue) } } @@ -252,7 +283,7 @@ export class CompilerVisitor implements IRVisitor { // get the expression that is evaluated in the context of let. const exprUnderLet = this.compStack.slice(-1).pop() if (exprUnderLet === undefined) { - this.evaluationState.errorTracker.addCompileError( + this.errorTracker.addCompileError( letDef.opdef.id, 'QNT501', `No expression for ${letDef.opdef.name} on compStack` @@ -261,7 +292,7 @@ export class CompilerVisitor implements IRVisitor { } const kname = kindName('callable', letDef.opdef.id) - const boundValue = this.evaluationState.context.get(kname) ?? fail + const boundValue = this.context.get(kname) ?? fail // Override the behavior of the expression under let: // It precomputes the bound value and uses it in the evaluation. // Once the evaluation is done, the value is reset, so that @@ -284,7 +315,7 @@ export class CompilerVisitor implements IRVisitor { // all constants should be instantiated before running the simulator const code: ErrorCode = 'QNT500' const msg = `Uninitialized const ${cdef.name}. Use: import (${cdef.name}=).*` - this.evaluationState.errorTracker.addCompileError(cdef.id, code, msg) + this.errorTracker.addCompileError(cdef.id, code, msg) } exitVar(vardef: ir.QuintVar) { @@ -294,13 +325,13 @@ export class CompilerVisitor implements IRVisitor { // definition. Don't overwrite the register if that happens. In some cases // (with instances), the variable can have a different ID, but the same // name. In that case, we assign the register with that name for the new ID. - if (this.evaluationState.context.has(kindName('var', varName))) { - const register = this.evaluationState.context.get(kindName('var', varName))! - this.evaluationState.context.set(kindName('var', vardef.id), register) + if (this.context.has(kindName('var', varName))) { + const register = this.context.get(kindName('var', varName))! + this.context.set(kindName('var', vardef.id), register) - if (this.evaluationState.context.has(kindName('nextvar', varName))) { - const register = this.evaluationState.context.get(kindName('nextvar', varName))! - this.evaluationState.context.set(kindName('nextvar', vardef.id), register) + if (this.context.has(kindName('nextvar', varName))) { + const register = this.context.get(kindName('nextvar', varName))! + this.context.set(kindName('nextvar', vardef.id), register) } return @@ -310,19 +341,19 @@ export class CompilerVisitor implements IRVisitor { // one for the variable, and // one for its next-state version const prevRegister = mkRegister('var', varName, none(), () => - this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) + this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) ) - this.evaluationState.vars.push(prevRegister) + this.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name - this.evaluationState.context.set(kindName('var', varName), prevRegister) - this.evaluationState.context.set(kindName('var', vardef.id), prevRegister) + this.context.set(kindName('var', varName), prevRegister) + this.context.set(kindName('var', vardef.id), prevRegister) const nextRegister = mkRegister('nextvar', varName, none(), () => - this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) + this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) ) - this.evaluationState.nextVars.push(nextRegister) + this.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name - this.evaluationState.context.set(kindName('nextvar', varName), nextRegister) - this.evaluationState.context.set(kindName('nextvar', vardef.id), nextRegister) + this.context.set(kindName('nextvar', varName), nextRegister) + this.context.set(kindName('nextvar', vardef.id), nextRegister) } enterLiteral(expr: ir.QuintBool | ir.QuintInt | ir.QuintStr) { @@ -346,7 +377,7 @@ export class CompilerVisitor implements IRVisitor { enterName(name: ir.QuintName) { if (name.name === lastTraceName) { - this.compStack.push(mkConstComputable(rv.mkList(this.evaluationState.trace.get()))) + this.compStack.push(mkConstComputable(rv.mkList(this.trace.get()))) return } // The name belongs to one of the objects: @@ -361,7 +392,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(comp) } else { // this should not happen, due to the name resolver - this.evaluationState.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) + this.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) this.compStack.push(fail) } } @@ -379,11 +410,7 @@ export class CompilerVisitor implements IRVisitor { const nextvar = this.contextGet(name, ['nextvar']) this.compStack.push(nextvar ?? fail) } else { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT502', - 'Operator next(...) needs one argument' - ) + this.errorTracker.addCompileError(app.id, 'QNT502', 'Operator next(...) needs one argument') this.compStack.push(fail) } } @@ -460,7 +487,7 @@ export class CompilerVisitor implements IRVisitor { if (q.toInt() !== 0n) { return just(rv.mkInt(p.toInt() / q.toInt())) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') + this.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') return none() } }) @@ -473,9 +500,9 @@ export class CompilerVisitor implements IRVisitor { case 'ipow': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() == 0n && p.toInt() == 0n) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') + this.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') } else if (q.toInt() < 0n) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') + this.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') } else { return just(rv.mkInt(p.toInt() ** q.toInt())) } @@ -529,7 +556,7 @@ export class CompilerVisitor implements IRVisitor { } return just(rv.mkList(arr)) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) + this.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) return none() } }) @@ -556,7 +583,7 @@ export class CompilerVisitor implements IRVisitor { if (l.size > 0) { return this.sliceList(app.id, l, 1, l.size) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') + this.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') return none() } }) @@ -568,7 +595,7 @@ export class CompilerVisitor implements IRVisitor { if (s >= 0 && s <= l.size && e <= l.size && e >= s) { return this.sliceList(app.id, l, s, e) } else { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT506', `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` @@ -614,11 +641,7 @@ export class CompilerVisitor implements IRVisitor { if (fieldValue) { return just(fieldValue) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Accessing a missing record field ${name}` - ) + this.errorTracker.addRuntimeError(app.id, 'QNT501', `Accessing a missing record field ${name}`) return none() } }) @@ -643,11 +666,7 @@ export class CompilerVisitor implements IRVisitor { const newMap = rec.toOrderedMap().set(key, fieldValue) return just(rv.mkRecord(newMap)) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Called 'with' with a non-existent key ${key}` - ) + this.errorTracker.addRuntimeError(app.id, 'QNT501', `Called 'with' with a non-existent key ${key}`) return none() } }) @@ -758,11 +777,7 @@ export class CompilerVisitor implements IRVisitor { return just(value) } else { // Should we print the key? It may be a complex expression. - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'get' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'get' with a non-existing key") return none() } }) @@ -777,11 +792,7 @@ export class CompilerVisitor implements IRVisitor { const newMap = asMap.set(normalKey, newValue) return just(rv.fromMap(newMap)) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'set' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'set' with a non-existing key") return none() } }) @@ -809,11 +820,7 @@ export class CompilerVisitor implements IRVisitor { return rv.fromMap(newMap) }) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'setBy' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'setBy' with a non-existing key") return none() } }) @@ -895,7 +902,7 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') + this.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') return none() } return just(cond) @@ -932,7 +939,7 @@ export class CompilerVisitor implements IRVisitor { case 'eventually': case 'enabled': this.applyFun(app.id, 1, _ => { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -947,7 +954,7 @@ export class CompilerVisitor implements IRVisitor { case 'weakFair': case 'strongFair': this.applyFun(app.id, 2, _ => { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -964,7 +971,7 @@ export class CompilerVisitor implements IRVisitor { private applyUserDefined(app: ir.QuintApp) { const onError = (sourceId: bigint, msg: string): void => { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', msg) + this.errorTracker.addCompileError(sourceId, 'QNT501', msg) this.compStack.push(fail) } @@ -1009,18 +1016,18 @@ export class CompilerVisitor implements IRVisitor { // This code is similar to applyFun, but it calls the listener before const comp = { eval: (): Maybe => { - this.evaluationState.listener.onUserOperatorCall(app) + this.execListener.onUserOperatorCall(app) // compute the values of the arguments at this point const merged = merge(args.map(a => a.eval())) const callable = callableRef() if (merged.isNone() || callable.isNone()) { - this.evaluationState.listener.onUserOperatorReturn(app, [], none()) + this.execListener.onUserOperatorReturn(app, [], none()) return none() } return merged .map(values => { const result = callable.value.eval(values.map(just)) as Maybe - this.evaluationState.listener.onUserOperatorReturn(app, values, result) + this.execListener.onUserOperatorReturn(app, values, result) return result }) .join() @@ -1034,10 +1041,10 @@ export class CompilerVisitor implements IRVisitor { // introduce a register for every parameter lam.params.forEach(p => { const register = mkRegister('arg', p.name, none(), () => `Parameter ${p} is not set`) - this.evaluationState.context.set(kindName('arg', p.id), register) + this.context.set(kindName('arg', p.id), register) if (specialNames.includes(p.name)) { - this.evaluationState.context.set(kindName('arg', p.name), register) + this.context.set(kindName('arg', p.name), register) } }) // After this point, the body of the lambda gets compiled. @@ -1056,10 +1063,10 @@ export class CompilerVisitor implements IRVisitor { const register = this.contextGet(id, ['arg']) as Register if (register && register.registerValue) { - this.evaluationState.context.delete(key) + this.context.delete(key) registers.push(register) } else { - this.evaluationState.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) + this.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) } }) @@ -1067,19 +1074,19 @@ export class CompilerVisitor implements IRVisitor { if (lambdaBody) { this.compStack.push(mkCallable(registers, lambdaBody)) } else { - this.evaluationState.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') + this.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') } } private translateAssign(sourceId: bigint): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) + this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) return } const [register, rhs] = this.compStack.splice(-2) const name = (register as Register).name if (name === undefined) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) + this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) this.compStack.push(fail) return } @@ -1092,7 +1099,7 @@ export class CompilerVisitor implements IRVisitor { return just(rv.mkBool(true)) }) } else { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) + this.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) this.compStack.push(fail) } } @@ -1118,7 +1125,7 @@ export class CompilerVisitor implements IRVisitor { mapResultAndElems: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') return } // lambda translated to Callable @@ -1139,7 +1146,7 @@ export class CompilerVisitor implements IRVisitor { */ private applyFold(sourceId: bigint, order: 'fwd' | 'rev'): void { if (this.compStack.length < 3) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') return } // extract two arguments from the call stack and keep the set @@ -1180,7 +1187,7 @@ export class CompilerVisitor implements IRVisitor { // push the combined computable value on the stack private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => Maybe) { if (this.compStack.length < nargs) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop nargs elements of the compStack const args = this.compStack.splice(-nargs, nargs) @@ -1196,7 +1203,7 @@ export class CompilerVisitor implements IRVisitor { .join() } catch (error) { const msg = error instanceof Error ? error.message : 'unknown error' - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) + this.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) return none() } }, @@ -1209,7 +1216,7 @@ export class CompilerVisitor implements IRVisitor { // as it should not evaluate both arms private translateIfThenElse(sourceId: bigint) { if (this.compStack.length < 3) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop 3 elements of the compStack const [cond, thenArm, elseArm] = this.compStack.splice(-3, 3) @@ -1239,7 +1246,7 @@ export class CompilerVisitor implements IRVisitor { ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() - const savedTrace = this.evaluationState.trace.get() + const savedTrace = this.trace.get() let result: Maybe = just(rv.mkBool(true)) // Evaluate arguments iteratively. @@ -1256,12 +1263,12 @@ export class CompilerVisitor implements IRVisitor { // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) - this.evaluationState.trace.reset(savedTrace) + this.trace.reset(savedTrace) if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( actionId(actionNo), 'QNT513', `Cannot continue in A.then(B), A evaluates to 'false'` @@ -1277,8 +1284,8 @@ export class CompilerVisitor implements IRVisitor { const oldState: RuntimeValue = this.varsToRecord() this.shiftVars() const newState: RuntimeValue = this.varsToRecord() - this.evaluationState.trace.extend(newState) - this.evaluationState.listener.onNextState(oldState, newState) + this.trace.extend(newState) + this.execListener.onNextState(oldState, newState) } } @@ -1288,11 +1295,7 @@ export class CompilerVisitor implements IRVisitor { // translate all { A, ..., C } or A.then(B) private translateAllOrThen(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const args = this.compStack.splice(-app.args.length) @@ -1315,30 +1318,26 @@ export class CompilerVisitor implements IRVisitor { // The code below is an adaption of chainAllOrThen. // If someone finds how to nicely combine both, please refactor. if (this.compStack.length !== 2) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const [action, pred] = this.compStack.splice(-2) const lazyCompute = (): Maybe => { const savedNextVars = this.snapshotNextVars() - const savedTrace = this.evaluationState.trace.get() + const savedTrace = this.trace.get() const actionResult = action.eval() if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { // 'A' evaluates to 'false', or produces an error. // Restore the values of the next variables. this.recoverNextVars(savedNextVars) - this.evaluationState.trace.reset(savedTrace) + this.trace.reset(savedTrace) // expect emits an error when the run could not finish - this.evaluationState.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') return none() } else { const savedVarsAfterAction = this.snapshotVars() const savedNextVarsAfterAction = this.snapshotNextVars() - const savedTraceAfterAction = this.evaluationState.trace.get() + const savedTraceAfterAction = this.trace.get() // Temporarily, switch to the next frame, to make a look-ahead evaluation. // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. this.shiftVars() @@ -1350,13 +1349,9 @@ export class CompilerVisitor implements IRVisitor { // For example: `A.expect(P).then(B)`. this.recoverVars(savedVarsAfterAction) this.recoverNextVars(savedNextVarsAfterAction) - this.evaluationState.trace.reset(savedTraceAfterAction) + this.trace.reset(savedTraceAfterAction) if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { - this.evaluationState.errorTracker.addRuntimeError( - app.args[1].id, - 'QNT508', - 'Expect condition does not hold true' - ) + this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') return none() } return predResult @@ -1369,11 +1364,7 @@ export class CompilerVisitor implements IRVisitor { // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const [niterations, action] = this.compStack.splice(-2) @@ -1412,11 +1403,7 @@ export class CompilerVisitor implements IRVisitor { shortCircuit: (no: number, r: boolean) => Maybe ): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const args = this.compStack.splice(-app.args.length) @@ -1450,7 +1437,7 @@ export class CompilerVisitor implements IRVisitor { // translate any { A, ..., C } private translateOrAction(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') + this.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') return } const args = this.compStack.splice(-app.args.length) @@ -1469,10 +1456,10 @@ export class CompilerVisitor implements IRVisitor { args.forEach((arg, i) => { this.recoverNextVars(valuesBefore) // either the argument is evaluated to false, or fails - this.evaluationState.listener.onAnyOptionCall(app, i) + this.execListener.onAnyOptionCall(app, i) const result = arg.eval().or(just(rv.mkBool(false))) const boolResult = (result.unwrap() as RuntimeValue).toBool() - this.evaluationState.listener.onAnyOptionReturn(app, i) + this.execListener.onAnyOptionReturn(app, i) // if this arm evaluates to true, save it in the candidates if (boolResult === true) { successors.push(this.snapshotNextVars()) @@ -1485,7 +1472,7 @@ export class CompilerVisitor implements IRVisitor { if (ncandidates === 0) { // no successor: restore the state and return false this.recoverNextVars(valuesBefore) - this.evaluationState.listener.onAnyReturn(args.length, -1) + this.execListener.onAnyReturn(args.length, -1) return just(rv.mkBool(false)) } else if (ncandidates === 1) { // There is exactly one successor, the execution is deterministic. @@ -1497,7 +1484,7 @@ export class CompilerVisitor implements IRVisitor { } this.recoverNextVars(successors[choice]) - this.evaluationState.listener.onAnyReturn(args.length, successorIndices[choice]) + this.execListener.onAnyReturn(args.length, successorIndices[choice]) return just(rv.mkBool(true)) } @@ -1513,7 +1500,7 @@ export class CompilerVisitor implements IRVisitor { b .map(sz => { if (sz === 0n) { - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) + this.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) } return this.rand(sz) }) @@ -1532,11 +1519,7 @@ export class CompilerVisitor implements IRVisitor { private test(sourceId: bigint) { if (this.compStack.length < 5) { - this.evaluationState.errorTracker.addCompileError( - sourceId, - 'QNT501', - 'Not enough arguments on stack for "q::test"' - ) + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::test"') return } @@ -1546,11 +1529,7 @@ export class CompilerVisitor implements IRVisitor { private testOnce(sourceId: bigint) { if (this.compStack.length < 4) { - this.evaluationState.errorTracker.addCompileError( - sourceId, - 'QNT501', - 'Not enough arguments on stack for "q::testOnce"' - ) + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::testOnce"') return } @@ -1587,23 +1566,23 @@ export class CompilerVisitor implements IRVisitor { // do multiple runs, stop at the first failing run const nruns = (nrunsRes as RuntimeValue).toInt() for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { - this.evaluationState.listener.onRunCall() - this.evaluationState.trace.reset() + this.execListener.onRunCall() + this.trace.reset() // check Init() const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } - this.evaluationState.listener.onUserOperatorCall(initApp) + this.execListener.onUserOperatorCall(initApp) const initResult = init.eval() failure = initResult.isNone() || failure if (!isTrue(initResult)) { - this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) + this.execListener.onUserOperatorReturn(initApp, [], initResult) } else { // The initial action evaluates to true. // Our guess of values was good. this.shiftVars() - this.evaluationState.trace.extend(this.varsToRecord()) + this.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() - this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) + this.execListener.onUserOperatorReturn(initApp, [], initResult) failure = invResult.isNone() || failure if (!isTrue(invResult)) { errorFound = true @@ -1617,15 +1596,15 @@ export class CompilerVisitor implements IRVisitor { opcode: 'q::stepAndInvariant', args: [], } - this.evaluationState.listener.onUserOperatorCall(nextApp) + this.execListener.onUserOperatorCall(nextApp) // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { this.shiftVars() - this.evaluationState.trace.extend(this.varsToRecord()) + this.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) - this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onUserOperatorReturn(nextApp, [], nextResult) } else { // Otherwise, the run cannot be extended. // In some cases, this may indicate a deadlock. @@ -1634,15 +1613,15 @@ export class CompilerVisitor implements IRVisitor { // the run. Hence, do not report an error here, but simply // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. - this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) - this.evaluationState.listener.onRunReturn(just(rv.mkBool(true)), this.evaluationState.trace.get()) + this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace.get()) break } } } } const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() - this.evaluationState.listener.onRunReturn(outcome, this.evaluationState.trace.get()) + this.execListener.onRunReturn(outcome, this.trace.get()) // recover the state variables this.recoverVars(vars) this.recoverNextVars(nextVars) @@ -1658,7 +1637,7 @@ export class CompilerVisitor implements IRVisitor { // convert the current variable values to a record private varsToRecord(): RuntimeValue { - const map: [string, RuntimeValue][] = this.evaluationState.vars + const map: [string, RuntimeValue][] = this.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) return rv.mkRecord(map) @@ -1666,32 +1645,32 @@ export class CompilerVisitor implements IRVisitor { private shiftVars() { this.recoverVars(this.snapshotNextVars()) - this.evaluationState.nextVars.forEach(r => (r.registerValue = none())) + this.nextVars.forEach(r => (r.registerValue = none())) } // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.evaluationState.vars.map(r => r.registerValue) + return this.vars.map(r => r.registerValue) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.evaluationState.nextVars.map(r => r.registerValue) + return this.nextVars.map(r => r.registerValue) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { - this.evaluationState.vars.forEach((r, i) => (r.registerValue = values[i])) + this.vars.forEach((r, i) => (r.registerValue = values[i])) } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { - this.evaluationState.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.nextVars.forEach((r, i) => (r.registerValue = values[i])) } private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { - const value = this.evaluationState.context.get(kindName(k, name)) + const value = this.context.get(kindName(k, name)) if (value) { return value } @@ -1705,7 +1684,7 @@ export class CompilerVisitor implements IRVisitor { if (vdef) { const refId = vdef.id! for (const k of kinds) { - const value = this.evaluationState.context.get(kindName(k, refId)) + const value = this.context.get(kindName(k, refId)) if (value) { return value } @@ -1721,7 +1700,7 @@ export class CompilerVisitor implements IRVisitor { const elem = list.get(Number(idx)) return elem ? just(elem) : none() } else { - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) + this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) return none() } } @@ -1731,11 +1710,7 @@ export class CompilerVisitor implements IRVisitor { if (idx >= 0n && idx < list.size) { return just(rv.mkList(list.set(Number(idx), value))) } else { - this.evaluationState.errorTracker.addRuntimeError( - sourceId, - 'QNT510', - `Out of bounds, replaceAt(..., ${idx}, ...)` - ) + this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, replaceAt(..., ${idx}, ...)`) return none() } } From 54787b91893a6ace76a83aeb1cd547c66e97bfd9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:12:31 -0300 Subject: [PATCH 344/428] Add builtin signatures for `q::lastTrace` --- quint/src/effects/builtinSignatures.ts | 1 + quint/src/types/builtinSignatures.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index f9de7f532..1938d6405 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -224,6 +224,7 @@ const otherOperators = [ { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, { name: 'q::debug', effect: propagateComponents(['read'])(2) }, + { name: 'q::lastTrace', effect: parseAndQuantify('Pure') }, // FIXME: Should be in run mode { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 9cd1ef4fb..fecaa0308 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -127,6 +127,7 @@ const otherOperators = [ { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, { name: 'q::debug', type: '(str, a) => a' }, + { name: 'q::lastTrace', type: 'List[a]' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { From c7beef5ec01b8a6e71039d5f1f2e91a0c20b4f26 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:30:31 -0300 Subject: [PATCH 345/428] Remove unecessary spread --- quint/src/runtime/impl/trace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts index e957ac3ab..e2af8d15e 100644 --- a/quint/src/runtime/impl/trace.ts +++ b/quint/src/runtime/impl/trace.ts @@ -5,7 +5,7 @@ export class Trace { private states: List = List() get(): RuntimeValue[] { - return [...this.states.toArray()] + return this.states.toArray() } reset(values: RuntimeValue[] = []) { From 24114db8ff4b76e13976ddf5a4106cae013bf475 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:31:59 -0300 Subject: [PATCH 346/428] Add doc header --- quint/src/runtime/impl/trace.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts index e2af8d15e..987dc548d 100644 --- a/quint/src/runtime/impl/trace.ts +++ b/quint/src/runtime/impl/trace.ts @@ -1,3 +1,17 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Trace of states representing a single execution path + * + * @author Gabriela Moreira + * + * @module + */ + import { List } from 'immutable' import { RuntimeValue } from './runtimeValue' From 43b8f6ca8b6b2f57388bf897c1770bbd9012ac6a Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:48:35 -0300 Subject: [PATCH 347/428] Remove debugging comment --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c01785c58..1348743fe 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1597,7 +1597,6 @@ export class CompilerVisitor implements IRVisitor { args: [], } this.execListener.onUserOperatorCall(nextApp) - // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { From ffe3020b0f2b55e6fc598ef3dacd359abfbbd627 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 25 Apr 2024 08:51:02 -0300 Subject: [PATCH 348/428] Use different action to setup jq in CI --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f98f79531..bbe65416e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,7 +108,7 @@ jobs: - run: npm install -g txm - name: Blackbox integration tests run: cd ./quint && txm cli-tests.md - - uses: freenet-actions/setup-jq@v2 + - uses: sergeysova/jq-action@v2 - name: Blackbox integration tests with I/O # This tests fail on windows currently # See https://github.com/anko/txm/issues/10 From a384209e8e63359c472d2193ee9b9fd1f4c03b72 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 25 Apr 2024 09:02:19 -0300 Subject: [PATCH 349/428] Use another jq setup action that should work on all platforms --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bbe65416e..480fa0eef 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,7 +108,7 @@ jobs: - run: npm install -g txm - name: Blackbox integration tests run: cd ./quint && txm cli-tests.md - - uses: sergeysova/jq-action@v2 + - uses: dcarbone/install-jq-action@v2 - name: Blackbox integration tests with I/O # This tests fail on windows currently # See https://github.com/anko/txm/issues/10 From 847b5b079abb25d5ea71401eaa0d37bda462e323 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 30 Apr 2024 23:28:35 -0300 Subject: [PATCH 350/428] Use either more consistently and extract some functionality from compilerImpl.ts --- quint/src/quintError.ts | 2 + quint/src/repl.ts | 49 +- quint/src/runtime/compile.ts | 3 +- quint/src/runtime/impl/base.ts | 110 ++++ quint/src/runtime/impl/compilerImpl.ts | 655 ++++++-------------- quint/src/runtime/impl/operatorEvaluator.ts | 162 +++++ quint/src/runtime/impl/runtimeValue.ts | 104 ++-- quint/src/runtime/runtime.ts | 26 +- quint/src/runtime/testing.ts | 8 +- quint/test/runtime/compile.test.ts | 63 +- 10 files changed, 605 insertions(+), 577 deletions(-) create mode 100644 quint/src/runtime/impl/base.ts create mode 100644 quint/src/runtime/impl/operatorEvaluator.ts diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 57c18af1b..82aaa49b4 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -105,6 +105,8 @@ export type ErrorCode = | 'QNT512' /* QNT513: Cannot continue in 'then' */ | 'QNT513' + /* QNT514: Cardinality is infinite */ + | 'QNT514' /* Additional data for a Quint error */ export interface QuintErrorData { diff --git a/quint/src/repl.ts b/quint/src/repl.ts index 5c3dc8e13..651d28ab8 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -12,7 +12,7 @@ import * as readline from 'readline' import { Readable, Writable } from 'stream' import { readFileSync, writeFileSync } from 'fs' import { Maybe, just, none } from '@sweet-monads/maybe' -import { Either, left, right } from '@sweet-monads/either' +import { Either, right } from '@sweet-monads/either' import chalk from 'chalk' import { format } from './prettierimp' @@ -39,10 +39,10 @@ import { fileSourceResolver } from './parsing/sourceResolver' import { cwd } from 'process' import { newIdGenerator } from './idGenerator' import { moduleToString } from './ir/IRprinting' -import { EvaluationState, newEvaluationState } from './runtime/impl/compilerImpl' import { mkErrorMessage } from './cliCommands' import { QuintError } from './quintError' import { ErrorMessage } from './ErrorMessage' +import { EvaluationState, newEvaluationState } from './runtime/impl/base' // tunable settings export const settings = { @@ -708,30 +708,27 @@ function countBraces(str: string): [number, number, number] { function evalExpr(state: ReplState, out: writer): Either { const computable = contextNameLookup(state.evaluationState.context, inputDefName, 'callable') const columns = terminalWidth() - const result = computable - .mapRight(comp => { - return comp - .eval() - .map(value => { - const ex = value.toQuintEx(state.compilationState.idGen) - out(format(columns, 0, prettyQuintEx(ex))) - out('\n') - - if (ex.kind === 'bool' && ex.value) { - // A Boolean expression may be an action or a run. - // Save the state, if there were any updates to variables. - saveVars(state.evaluationState.vars, state.evaluationState.nextVars).map(missing => { - if (missing.length > 0) { - out(chalk.yellow('[warning] some variables are undefined: ' + missing.join(', ') + '\n')) - } - }) - } - return right(ex) - }) - .or(just(left(''))) - .unwrap() - }) - .join() + const result = computable.chain(comp => { + return comp + .eval() + .chain(value => { + const ex = value.toQuintEx(state.compilationState.idGen) + out(format(columns, 0, prettyQuintEx(ex))) + out('\n') + + if (ex.kind === 'bool' && ex.value) { + // A Boolean expression may be an action or a run. + // Save the state, if there were any updates to variables. + saveVars(state.evaluationState.vars, state.evaluationState.nextVars).map(missing => { + if (missing.length > 0) { + out(chalk.yellow('[warning] some variables are undefined: ' + missing.join(', ') + '\n')) + } + }) + } + return right(ex) + }) + .mapLeft(_ => '') + }) if (verbosity.hasUserOpTracking(state.verbosity)) { const trace = state.recorder.getBestTrace() diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index 7bc2d665b..0c8bb4782 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -13,7 +13,7 @@ import { SourceMap, parse, parsePhase3importAndNameResolution } from '../parsing import { Computable, ComputableKind, kindName } from './runtime' import { ExecutionListener } from './trace' import { FlatModule, QuintDeclaration, QuintDef, QuintEx, QuintModule } from '../ir/quintIr' -import { CompilerVisitor, EvaluationState, newEvaluationState } from './impl/compilerImpl' +import { CompilerVisitor } from './impl/compilerImpl' import { walkDefinition } from '../ir/IRVisitor' import { LookupTable } from '../names/base' import { AnalysisOutput, analyzeInc, analyzeModules } from '../quintAnalyzer' @@ -22,6 +22,7 @@ import { SourceLookupPath } from '../parsing/sourceResolver' import { Rng } from '../rng' import { flattenModules } from '../flattening/fullFlattener' import { QuintError } from '../quintError' +import { EvaluationState, newEvaluationState } from './impl/base' /** * The name of the builtin name that returns the last found trace. diff --git a/quint/src/runtime/impl/base.ts b/quint/src/runtime/impl/base.ts new file mode 100644 index 000000000..73fa097cc --- /dev/null +++ b/quint/src/runtime/impl/base.ts @@ -0,0 +1,110 @@ +// Internal names in the compiler, which have special treatment. +// For some reason, if we replace 'q::input' with inputDefName, everything breaks. + +import { Maybe, just, none } from '@sweet-monads/maybe' +import { ErrorCode, QuintError } from '../../quintError' +import { Computable, EvaluationResult, Register, kindName, mkCallable } from '../runtime' +import { ExecutionListener } from '../trace' +import { Trace } from './trace' +import { Either, right } from '@sweet-monads/either' +import { RuntimeValue, rv } from './runtimeValue' + +// What kind of JS magic is that? +export const specialNames = ['q::input', 'q::runResult', 'q::nruns', 'q::nsteps', 'q::init', 'q::next', 'q::inv'] + +/** + * Returns a Map containing the built-in Computable objects for the Quint language. + * These include the callable objects for Bool, Int, and Nat. + * + * @returns a Map containing the built-in Computable objects. + */ +export function builtinContext() { + return new Map([ + [kindName('callable', 'Bool'), mkCallable([], mkConstComputable(rv.mkSet([rv.mkBool(false), rv.mkBool(true)])))], + [kindName('callable', 'Int'), mkCallable([], mkConstComputable(rv.mkInfSet('Int')))], + [kindName('callable', 'Nat'), mkCallable([], mkConstComputable(rv.mkInfSet('Nat')))], + ]) +} + +/** + * Represents the state of evaluation of Quint code. + * All the fields are mutated by CompilerVisitor, either directly, or via calls. + */ +export interface EvaluationState { + // The context of the evaluation, containing the Computable objects. + context: Map + // The list of variables in the current state. + vars: Register[] + // The list of variables in the next state. + nextVars: Register[] + // The current trace of states + trace: Trace + // The error tracker for the evaluation to store errors on callbacks. + errorTracker: CompilerErrorTracker + // The execution listener that the compiled code uses to report execution info. + listener: ExecutionListener +} + +/** + * Creates a new EvaluationState object. + * + * @returns a new EvaluationState object. + */ +export class CompilerErrorTracker { + // messages that are produced during compilation + compileErrors: QuintError[] = [] + // messages that get populated as the compiled code is executed + runtimeErrors: QuintError[] = [] + + addCompileError(reference: bigint, code: ErrorCode, message: string) { + this.compileErrors.push({ code, message, reference }) + } + + addRuntimeError(reference: bigint, error: QuintError) { + this.runtimeErrors.push({ ...error, reference }) + } +} + +/** + * Creates a new EvaluationState object with the initial state of the evaluation. + * + * @returns a new EvaluationState object + */ +export function newEvaluationState(listener: ExecutionListener): EvaluationState { + const state: EvaluationState = { + context: builtinContext(), + vars: [], + nextVars: [], + trace: new Trace(), + errorTracker: new CompilerErrorTracker(), + listener: listener, + } + + return state +} + +export function toMaybe(r: Either): Maybe { + if (r.isRight()) { + return just(r.value) + } else { + return none() + } +} + +// make a `Computable` that always returns a given runtime value +export function mkConstComputable(value: RuntimeValue) { + return { + eval: () => { + return right(value) + }, + } +} + +// make a `Computable` that always returns a given runtime value +export function mkFunComputable(fun: () => EvaluationResult) { + return { + eval: () => { + return fun() + }, + } +} diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1348743fe..0d854800b 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -10,8 +10,8 @@ */ import { strict as assert } from 'assert' -import { Maybe, just, merge, none } from '@sweet-monads/maybe' -import { List, OrderedMap, Set } from 'immutable' +import { Maybe, just, none } from '@sweet-monads/maybe' +import { OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' @@ -19,7 +19,7 @@ import { Callable, Computable, ComputableKind, - EvalResult, + EvaluationResult, Register, fail, kindName, @@ -33,7 +33,7 @@ import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' import { Trace } from './trace' -import { ErrorCode, QuintError } from '../../quintError' +import { ErrorCode, QuintError, quintErrorToString } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' import { prettyQuintEx, terminalWidth } from '../../graphics' @@ -41,82 +41,18 @@ import { format } from '../../prettierimp' import { unreachable } from '../../util' import { zerog } from '../../idGenerator' import { chunk } from 'lodash' - -// Internal names in the compiler, which have special treatment. -// For some reason, if we replace 'q::input' with inputDefName, everything breaks. -// What kind of JS magic is that? -const specialNames = ['q::input', 'q::runResult', 'q::nruns', 'q::nsteps', 'q::init', 'q::next', 'q::inv'] - -/** - * Returns a Map containing the built-in Computable objects for the Quint language. - * These include the callable objects for Bool, Int, and Nat. - * - * @returns a Map containing the built-in Computable objects. - */ -export function builtinContext() { - return new Map([ - [kindName('callable', 'Bool'), mkCallable([], mkConstComputable(rv.mkSet([rv.mkBool(false), rv.mkBool(true)])))], - [kindName('callable', 'Int'), mkCallable([], mkConstComputable(rv.mkInfSet('Int')))], - [kindName('callable', 'Nat'), mkCallable([], mkConstComputable(rv.mkInfSet('Nat')))], - ]) -} - -/** - * Represents the state of evaluation of Quint code. - * All the fields are mutated by CompilerVisitor, either directly, or via calls. - */ -export interface EvaluationState { - // The context of the evaluation, containing the Computable objects. - context: Map - // The list of variables in the current state. - vars: Register[] - // The list of variables in the next state. - nextVars: Register[] - // The current trace of states - trace: Trace - // The error tracker for the evaluation to store errors on callbacks. - errorTracker: CompilerErrorTracker - // The execution listener that the compiled code uses to report execution info. - listener: ExecutionListener -} - -/** - * Creates a new EvaluationState object. - * - * @returns a new EvaluationState object. - */ -export class CompilerErrorTracker { - // messages that are produced during compilation - compileErrors: QuintError[] = [] - // messages that get populated as the compiled code is executed - runtimeErrors: QuintError[] = [] - - addCompileError(reference: bigint, code: ErrorCode, message: string) { - this.compileErrors.push({ code, message, reference }) - } - - addRuntimeError(reference: bigint, code: ErrorCode, message: string) { - this.runtimeErrors.push({ code, message, reference }) - } -} - -/** - * Creates a new EvaluationState object with the initial state of the evaluation. - * - * @returns a new EvaluationState object - */ -export function newEvaluationState(listener: ExecutionListener): EvaluationState { - const state: EvaluationState = { - context: builtinContext(), - vars: [], - nextVars: [], - trace: new Trace(), - errorTracker: new CompilerErrorTracker(), - listener: listener, - } - - return state -} +import { Either, left, mergeInMany, right } from '@sweet-monads/either' +import { applyBoolOp, applyFold, applyFun, getListElem, mapLambdaThenReduce } from './operatorEvaluator' +import { + CompilerErrorTracker, + EvaluationState, + mkConstComputable, + mkFunComputable, + specialNames, + toMaybe, +} from './base' +import { updateList } from './operatorEvaluator' +import { sliceList } from './operatorEvaluator' /** * Compiler visitor turns Quint definitions and expressions into Computable @@ -237,8 +173,8 @@ export class CompilerVisitor implements IRVisitor { } else { this.execListener.onUserOperatorCall(app) } - const r: Maybe = unwrappedValue.eval() - this.execListener.onUserOperatorReturn(app, [], r) + const r = unwrappedValue.eval() + this.execListener.onUserOperatorReturn(app, [], toMaybe(r)) return r }, } @@ -247,8 +183,8 @@ export class CompilerVisitor implements IRVisitor { if (this.definitionDepth === 0 && opdef.qualifier === 'pureval') { // a pure value may be cached, once evaluated const originalEval = boundValue.eval - let cache: Maybe | undefined = undefined - boundValue.eval = (): Maybe => { + let cache: EvaluationResult | undefined = undefined + boundValue.eval = () => { if (cache !== undefined) { return cache } else { @@ -299,7 +235,7 @@ export class CompilerVisitor implements IRVisitor { // a new random value may be produced later. const undecoratedEval = exprUnderLet.eval const boundValueEval = boundValue.eval - exprUnderLet.eval = function (): Maybe { + exprUnderLet.eval = () => { const cachedValue = boundValueEval() boundValue.eval = function () { return cachedValue @@ -341,14 +277,14 @@ export class CompilerVisitor implements IRVisitor { // one for the variable, and // one for its next-state version const prevRegister = mkRegister('var', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) + this.errorTracker.addRuntimeError(vardef.id, { code: 'QNT502', message: `Variable ${varName} is not set` }) ) this.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name this.context.set(kindName('var', varName), prevRegister) this.context.set(kindName('var', vardef.id), prevRegister) const nextRegister = mkRegister('nextvar', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) + this.errorTracker.addRuntimeError(vardef.id, { code: 'QNT502', message: `${varName}' is not set` }) ) this.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name @@ -421,11 +357,11 @@ export class CompilerVisitor implements IRVisitor { break case 'eq': - this.applyFun(app.id, 2, (x, y) => just(rv.mkBool(x.equals(y)))) + this.applyFun(app.id, 2, (x, y) => right(rv.mkBool(x.equals(y)))) break case 'neq': - this.applyFun(app.id, 2, (x, y) => just(rv.mkBool(!x.equals(y)))) + this.applyFun(app.id, 2, (x, y) => right(rv.mkBool(!x.equals(y)))) break // conditional @@ -435,12 +371,12 @@ export class CompilerVisitor implements IRVisitor { // Booleans case 'not': - this.applyFun(app.id, 1, p => just(rv.mkBool(!p.toBool()))) + this.applyFun(app.id, 1, p => right(rv.mkBool(!p.toBool()))) break case 'and': // a conjunction over expressions is lazy - this.translateBoolOp(app, just(rv.mkBool(true)), (_, r) => (!r ? just(rv.mkBool(false)) : none())) + this.translateBoolOp(app, rv.mkBool(true), (_, r) => (!r ? rv.mkBool(false) : undefined)) break case 'actionAll': @@ -449,7 +385,7 @@ export class CompilerVisitor implements IRVisitor { case 'or': // a disjunction over expressions is lazy - this.translateBoolOp(app, just(rv.mkBool(false)), (_, r) => (r ? just(rv.mkBool(true)) : none())) + this.translateBoolOp(app, rv.mkBool(false), (_, r) => (r ? rv.mkBool(true) : undefined)) break case 'actionAny': @@ -458,92 +394,90 @@ export class CompilerVisitor implements IRVisitor { case 'implies': // an implication is lazy - this.translateBoolOp(app, just(rv.mkBool(false)), (n, r) => (n == 0 && !r ? just(rv.mkBool(true)) : none())) + this.translateBoolOp(app, rv.mkBool(false), (n, r) => (n == 0 && !r ? rv.mkBool(true) : undefined)) break case 'iff': - this.applyFun(app.id, 2, (p, q) => just(rv.mkBool(p.toBool() === q.toBool()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkBool(p.toBool() === q.toBool()))) break // integers case 'iuminus': - this.applyFun(app.id, 1, n => just(rv.mkInt(-n.toInt()))) + this.applyFun(app.id, 1, n => right(rv.mkInt(-n.toInt()))) break case 'iadd': - this.applyFun(app.id, 2, (p, q) => just(rv.mkInt(p.toInt() + q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkInt(p.toInt() + q.toInt()))) break case 'isub': - this.applyFun(app.id, 2, (p, q) => just(rv.mkInt(p.toInt() - q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkInt(p.toInt() - q.toInt()))) break case 'imul': - this.applyFun(app.id, 2, (p, q) => just(rv.mkInt(p.toInt() * q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkInt(p.toInt() * q.toInt()))) break case 'idiv': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() !== 0n) { - return just(rv.mkInt(p.toInt() / q.toInt())) + return right(rv.mkInt(p.toInt() / q.toInt())) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') - return none() + return left({ code: 'QNT503', message: 'Division by zero' }) } }) break case 'imod': - this.applyFun(app.id, 2, (p, q) => just(rv.mkInt(p.toInt() % q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkInt(p.toInt() % q.toInt()))) break case 'ipow': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() == 0n && p.toInt() == 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') + return left({ code: 'QNT503', message: '0^0 is undefined', reference: app.id }) } else if (q.toInt() < 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') + return left({ code: 'QNT503', message: 'i^j is undefined for j < 0', reference: app.id }) } else { - return just(rv.mkInt(p.toInt() ** q.toInt())) + return right(rv.mkInt(p.toInt() ** q.toInt())) } - return none() }) break case 'igt': - this.applyFun(app.id, 2, (p, q) => just(rv.mkBool(p.toInt() > q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkBool(p.toInt() > q.toInt()))) break case 'ilt': - this.applyFun(app.id, 2, (p, q) => just(rv.mkBool(p.toInt() < q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkBool(p.toInt() < q.toInt()))) break case 'igte': - this.applyFun(app.id, 2, (p, q) => just(rv.mkBool(p.toInt() >= q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkBool(p.toInt() >= q.toInt()))) break case 'ilte': - this.applyFun(app.id, 2, (p, q) => just(rv.mkBool(p.toInt() <= q.toInt()))) + this.applyFun(app.id, 2, (p, q) => right(rv.mkBool(p.toInt() <= q.toInt()))) break case 'Tup': // Construct a tuple from an array of values - this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => just(rv.mkTuple(values))) + this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => right(rv.mkTuple(values))) break case 'item': // Access a tuple: tuples are 1-indexed, that is, _1, _2, etc. - this.applyFun(app.id, 2, (tuple, idx) => this.getListElem(app.id, tuple.toList(), Number(idx.toInt()) - 1)) + this.applyFun(app.id, 2, (tuple, idx) => getListElem(tuple.toList(), Number(idx.toInt()) - 1)) break case 'tuples': // Construct a cross product - this.applyFun(app.id, app.args.length, (...sets: RuntimeValue[]) => just(rv.mkCrossProd(sets))) + this.applyFun(app.id, app.args.length, (...sets: RuntimeValue[]) => right(rv.mkCrossProd(sets))) break case 'List': // Construct a list from an array of values - this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => just(rv.mkList(values))) + this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => right(rv.mkList(values))) break case 'range': @@ -554,37 +488,33 @@ export class CompilerVisitor implements IRVisitor { for (let i = s; i < e; i++) { arr.push(rv.mkInt(BigInt(i))) } - return just(rv.mkList(arr)) + return right(rv.mkList(arr)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) - return none() + return left({ code: 'QNT504', message: `range(${s}, ${e}) is out of bounds` }) } }) break case 'nth': // Access a list - this.applyFun(app.id, 2, (list, idx) => this.getListElem(app.id, list.toList(), Number(idx.toInt()))) + this.applyFun(app.id, 2, (list, idx) => getListElem(list.toList(), Number(idx.toInt()))) break case 'replaceAt': - this.applyFun(app.id, 3, (list, idx, value) => - this.updateList(app.id, list.toList(), Number(idx.toInt()), value) - ) + this.applyFun(app.id, 3, (list, idx, value) => updateList(list.toList(), Number(idx.toInt()), value)) break case 'head': - this.applyFun(app.id, 1, list => this.getListElem(app.id, list.toList(), 0)) + this.applyFun(app.id, 1, list => getListElem(list.toList(), 0)) break case 'tail': this.applyFun(app.id, 1, list => { const l = list.toList() if (l.size > 0) { - return this.sliceList(app.id, l, 1, l.size) + return sliceList(l, 1, l.size) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') - return none() + return left({ code: 'QNT505', message: 'Applied tail to an empty list' }) } }) break @@ -593,32 +523,27 @@ export class CompilerVisitor implements IRVisitor { this.applyFun(app.id, 3, (list, start, end) => { const [l, s, e] = [list.toList(), Number(start.toInt()), Number(end.toInt())] if (s >= 0 && s <= l.size && e <= l.size && e >= s) { - return this.sliceList(app.id, l, s, e) + return sliceList(l, s, e) } else { - this.errorTracker.addRuntimeError( - app.id, - 'QNT506', - `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` - ) - return none() + return left({ code: 'QNT506', message: `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` }) } }) break case 'length': - this.applyFun(app.id, 1, list => just(rv.mkInt(BigInt(list.toList().size)))) + this.applyFun(app.id, 1, list => right(rv.mkInt(BigInt(list.toList().size)))) break case 'append': - this.applyFun(app.id, 2, (list, elem) => just(rv.mkList(list.toList().push(elem)))) + this.applyFun(app.id, 2, (list, elem) => right(rv.mkList(list.toList().push(elem)))) break case 'concat': - this.applyFun(app.id, 2, (list1, list2) => just(rv.mkList(list1.toList().concat(list2.toList())))) + this.applyFun(app.id, 2, (list1, list2) => right(rv.mkList(list1.toList().concat(list2.toList())))) break case 'indices': - this.applyFun(app.id, 1, list => just(rv.mkInterval(0n, BigInt(list.toList().size - 1)))) + this.applyFun(app.id, 1, list => right(rv.mkInterval(0n, BigInt(list.toList().size - 1)))) break case 'Rec': @@ -629,7 +554,7 @@ export class CompilerVisitor implements IRVisitor { const v = values[2 * i + 1] return v ? map.set(key, v) : map }, OrderedMap()) - return just(rv.mkRecord(map)) + return right(rv.mkRecord(map)) }) break @@ -639,10 +564,9 @@ export class CompilerVisitor implements IRVisitor { const name = fieldName.toStr() const fieldValue = rec.toOrderedMap().get(name) if (fieldValue) { - return just(fieldValue) + return right(fieldValue) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Accessing a missing record field ${name}`) - return none() + return left({ code: 'QNT501', message: `Accessing a missing record field ${name}` }) } }) break @@ -653,7 +577,7 @@ export class CompilerVisitor implements IRVisitor { .toOrderedMap() .keySeq() .map(key => rv.mkStr(key)) - return just(rv.mkSet(keysAsRuntimeValues)) + return right(rv.mkSet(keysAsRuntimeValues)) }) break @@ -664,17 +588,16 @@ export class CompilerVisitor implements IRVisitor { const key = fieldName.toStr() if (oldMap.has(key)) { const newMap = rec.toOrderedMap().set(key, fieldValue) - return just(rv.mkRecord(newMap)) + return right(rv.mkRecord(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Called 'with' with a non-existent key ${key}`) - return none() + return left({ code: 'QNT501', message: `Called 'with' with a non-existent key ${key}` }) } }) break case 'variant': // Construct a variant of a sum type. - this.applyFun(app.id, 2, (labelName, value) => just(rv.mkVariant(labelName.toStr(), value))) + this.applyFun(app.id, 2, (labelName, value) => right(rv.mkVariant(labelName.toStr(), value))) break case 'matchVariant': @@ -685,13 +608,14 @@ export class CompilerVisitor implements IRVisitor { const value = variantExpr.value // Find the eliminator marked with the variant's label - let result: Maybe | undefined + let result: EvaluationResult | undefined for (const [caseLabel, caseElim] of chunk(cases, 2)) { const caseLabelStr = caseLabel.toStr() if (caseLabelStr === '_' || caseLabelStr === label) { // Type checking ensures the second item of each case is a lambda + assert(caseElim instanceof RuntimeValueLambda, 'invalid eliminator in match expression') const eliminator = caseElim as RuntimeValueLambda - result = eliminator.eval([just(value)]).map(r => r as RuntimeValue) + result = eliminator.eval([right(value)]).map(r => r as RuntimeValue) break } } @@ -704,35 +628,35 @@ export class CompilerVisitor implements IRVisitor { case 'Set': // Construct a set from an array of values. - this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => just(rv.mkSet(values))) + this.applyFun(app.id, app.args.length, (...values: RuntimeValue[]) => right(rv.mkSet(values))) break case 'powerset': - this.applyFun(app.id, 1, (baseset: RuntimeValue) => just(rv.mkPowerset(baseset))) + this.applyFun(app.id, 1, (baseset: RuntimeValue) => right(rv.mkPowerset(baseset))) break case 'contains': - this.applyFun(app.id, 2, (set, value) => just(rv.mkBool(set.contains(value)))) + this.applyFun(app.id, 2, (set, value) => right(rv.mkBool(set.contains(value)))) break case 'in': - this.applyFun(app.id, 2, (value, set) => just(rv.mkBool(set.contains(value)))) + this.applyFun(app.id, 2, (value, set) => right(rv.mkBool(set.contains(value)))) break case 'subseteq': - this.applyFun(app.id, 2, (l, r) => just(rv.mkBool(l.isSubset(r)))) + this.applyFun(app.id, 2, (l, r) => right(rv.mkBool(l.isSubset(r)))) break case 'union': - this.applyFun(app.id, 2, (l, r) => just(rv.mkSet(l.toSet().union(r.toSet())))) + this.applyFun(app.id, 2, (l, r) => right(rv.mkSet(l.toSet().union(r.toSet())))) break case 'intersect': - this.applyFun(app.id, 2, (l, r) => just(rv.mkSet(l.toSet().intersect(r.toSet())))) + this.applyFun(app.id, 2, (l, r) => right(rv.mkSet(l.toSet().intersect(r.toSet())))) break case 'exclude': - this.applyFun(app.id, 2, (l, r) => just(rv.mkSet(l.toSet().subtract(r.toSet())))) + this.applyFun(app.id, 2, (l, r) => right(rv.mkSet(l.toSet().subtract(r.toSet())))) break case 'size': @@ -740,12 +664,12 @@ export class CompilerVisitor implements IRVisitor { break case 'isFinite': - // at the moment, we support only finite sets, so just return true - this.applyFun(app.id, 1, _set => just(rv.mkBool(true))) + // at the moment, we support only finite sets, so right return true + this.applyFun(app.id, 1, _set => right(rv.mkBool(true))) break case 'to': - this.applyFun(app.id, 2, (i, j) => just(rv.mkInterval(i.toInt(), j.toInt()))) + this.applyFun(app.id, 2, (i, j) => right(rv.mkInterval(i.toInt(), j.toInt()))) break case 'fold': @@ -765,7 +689,7 @@ export class CompilerVisitor implements IRVisitor { // unpack the sets from runtime values const setOfSets = set.toSet().map(e => e.toSet()) // and flatten the set of sets via immutable-js - return just(rv.mkSet(setOfSets.flatten(1) as Set)) + return right(rv.mkSet(setOfSets.flatten(1) as Set)) }) break @@ -774,11 +698,10 @@ export class CompilerVisitor implements IRVisitor { this.applyFun(app.id, 2, (map, key) => { const value = map.toMap().get(key.normalForm()) if (value) { - return just(value) + return right(value) } else { // Should we print the key? It may be a complex expression. - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'get' with a non-existing key") - return none() + return left({ code: 'QNT507', message: "Called 'get' with a non-existing key" }) } }) break @@ -790,10 +713,9 @@ export class CompilerVisitor implements IRVisitor { const asMap = map.toMap() if (asMap.has(normalKey)) { const newMap = asMap.set(normalKey, newValue) - return just(rv.fromMap(newMap)) + return right(rv.fromMap(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'set' with a non-existing key") - return none() + return left({ code: 'QNT507', message: "Called 'set' with a non-existing key" }) } }) break @@ -804,7 +726,7 @@ export class CompilerVisitor implements IRVisitor { const normalKey = key.normalForm() const asMap = map.toMap() const newMap = asMap.set(normalKey, newValue) - return just(rv.fromMap(newMap)) + return right(rv.fromMap(newMap)) }) break @@ -815,13 +737,12 @@ export class CompilerVisitor implements IRVisitor { const normalKey = key.normalForm() const asMap = map.toMap() if (asMap.has(normalKey)) { - return fun.eval([just(asMap.get(normalKey))]).map(newValue => { + return fun.eval([right(asMap.get(normalKey))]).map(newValue => { const newMap = asMap.set(normalKey, newValue as RuntimeValue) return rv.fromMap(newMap) }) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'setBy' with a non-existing key") - return none() + return left({ code: 'QNT507', message: "Called 'setBy' with a non-existing key" }) } }) break @@ -830,7 +751,7 @@ export class CompilerVisitor implements IRVisitor { case 'keys': // map keys as a set this.applyFun(app.id, 1, map => { - return just(rv.mkSet(map.toMap().keys())) + return right(rv.mkSet(map.toMap().keys())) }) break @@ -863,12 +784,12 @@ export class CompilerVisitor implements IRVisitor { break case 'Map': - this.applyFun(app.id, app.args.length, (...pairs: any[]) => just(rv.mkMap(pairs))) + this.applyFun(app.id, app.args.length, (...pairs: any[]) => right(rv.mkMap(pairs))) break case 'setToMap': this.applyFun(app.id, 1, (set: RuntimeValue) => - just( + right( rv.mkMap( set.toSet().map(p => { const arr = p.toList().toArray() @@ -881,7 +802,7 @@ export class CompilerVisitor implements IRVisitor { case 'setOfMaps': this.applyFun(app.id, 2, (dom, rng) => { - return just(rv.mkMapSet(dom, rng)) + return right(rv.mkMapSet(dom, rng)) }) break @@ -891,7 +812,7 @@ export class CompilerVisitor implements IRVisitor { case 'fail': this.applyFun(app.id, 1, result => { - return just(rv.mkBool(!result.toBool())) + return right(rv.mkBool(!result.toBool())) }) break @@ -902,10 +823,9 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - this.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') - return none() + return left({ code: 'QNT508', message: 'Assertion failed' }) } - return just(cond) + return right(cond) }) break @@ -928,7 +848,7 @@ export class CompilerVisitor implements IRVisitor { let columns = terminalWidth() let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) console.log('>', msg.toStr(), valuePretty.toString()) - return just(value) + return right(value) }) break @@ -939,12 +859,7 @@ export class CompilerVisitor implements IRVisitor { case 'eventually': case 'enabled': this.applyFun(app.id, 1, _ => { - this.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Runtime does not support the built-in operator '${app.opcode}'` - ) - return none() + return left({ code: 'QNT501', message: `Runtime does not support the built-in operator '${app.opcode}'` }) }) break @@ -954,12 +869,7 @@ export class CompilerVisitor implements IRVisitor { case 'weakFair': case 'strongFair': this.applyFun(app.id, 2, _ => { - this.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Runtime does not support the built-in operator '${app.opcode}'` - ) - return none() + return left({ code: 'QNT501', message: `Runtime does not support the built-in operator '${app.opcode}'` }) }) break @@ -971,18 +881,19 @@ export class CompilerVisitor implements IRVisitor { private applyUserDefined(app: ir.QuintApp) { const onError = (sourceId: bigint, msg: string): void => { + const error: EvaluationResult = left({ code: 'QNT501', message: msg, reference: sourceId }) this.errorTracker.addCompileError(sourceId, 'QNT501', msg) - this.compStack.push(fail) + this.compStack.push({ eval: () => error }) } - // look up for the operator to see, whether it's just an operator, or a parameter + // look up for the operator to see, whether it's right an operator, or a parameter const lookupEntry = this.lookupTable.get(app.id) if (lookupEntry === undefined) { return onError(app.id, `Called unknown operator ${app.opcode}`) } // this function gives us access to the compiled operator later - let callableRef: () => Maybe + let callableRef: () => Either if (lookupEntry === undefined || lookupEntry.kind !== 'param') { // The common case: the operator has been defined elsewhere. @@ -991,7 +902,7 @@ export class CompilerVisitor implements IRVisitor { if (callable === undefined || callable.nparams === undefined) { return onError(app.id, `Called unknown operator ${app.opcode}`) } - callableRef = () => just(callable) + callableRef = () => right(callable) } else { // The operator is a parameter of another operator. // We do not have access to the operator yet. @@ -1001,7 +912,12 @@ export class CompilerVisitor implements IRVisitor { } // every time we need a Callable, we retrieve it from the register callableRef = () => { - return register.registerValue.map(v => v as Callable) + const result = register.registerValue.map(v => v as Callable) + if (result.isJust()) { + return right(result.value) + } else { + return left({ code: 'QNT501', message: `Parameter ${app.opcode} is not set` }) + } } } @@ -1015,22 +931,19 @@ export class CompilerVisitor implements IRVisitor { // Produce the new computable value. // This code is similar to applyFun, but it calls the listener before const comp = { - eval: (): Maybe => { + eval: () => { this.execListener.onUserOperatorCall(app) // compute the values of the arguments at this point - const merged = merge(args.map(a => a.eval())) - const callable = callableRef() - if (merged.isNone() || callable.isNone()) { - this.execListener.onUserOperatorReturn(app, [], none()) - return none() - } - return merged - .map(values => { - const result = callable.value.eval(values.map(just)) as Maybe - this.execListener.onUserOperatorReturn(app, values, result) - return result - }) - .join() + // const merged = mergeInMany().mapLeft((errors): QuintError => { + // this.execListener.onUserOperatorReturn(app, [], none()) + // return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + // }) + const values = args.map(arg => arg.eval()) + const result = callableRef().chain(callable => { + return callable.eval(values) + }) + mergeInMany(values).map(vs => this.execListener.onUserOperatorReturn(app, vs, toMaybe(result))) + return result }, } this.compStack.push(comp) @@ -1049,7 +962,7 @@ export class CompilerVisitor implements IRVisitor { }) // After this point, the body of the lambda gets compiled. // The body of the lambda may refer to the parameter via names, - // which are stored in the registers we've just created. + // which are stored in the registers we've right created. } exitLambda(lam: ir.QuintLambda) { @@ -1096,7 +1009,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(rhs) this.applyFun(sourceId, 1, value => { nextvar.registerValue = just(value) - return just(rv.mkBool(true)) + return right(rv.mkBool(true)) }) } else { this.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) @@ -1122,94 +1035,38 @@ export class CompilerVisitor implements IRVisitor { */ private mapLambdaThenReduce( sourceId: bigint, - mapResultAndElems: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue + reduceFunction: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { - if (this.compStack.length < 2) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') - return - } - // lambda translated to Callable - const callable = this.compStack.pop() as Callable - // apply the lambda to a single element of the set - const evaluateElem = function (elem: RuntimeValue): Maybe<[RuntimeValue, RuntimeValue]> { - // evaluate the predicate against the actual arguments - const result = callable.eval([just(elem)]) - return result.map(result => [result as RuntimeValue, elem]) - } - this.applyFun(sourceId, 1, (iterable: Iterable): Maybe => { - return flatMap(iterable, evaluateElem).map(rs => mapResultAndElems(rs)) - }) + this.popArgs(2) + .map(args => mapLambdaThenReduce(reduceFunction, args)) + .map(comp => this.compStack.push(comp)) + .mapLeft(e => this.errorTracker.addRuntimeError(sourceId, e)) } /** * Translate one of the operators: fold, foldl, and foldr. */ private applyFold(sourceId: bigint, order: 'fwd' | 'rev'): void { - if (this.compStack.length < 3) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') - return - } - // extract two arguments from the call stack and keep the set - const callable = this.compStack.pop() as Callable - // this method supports only 2-argument callables - assert(callable.nparams === 2) - // compile the computation of the initial value - const initialComp = this.compStack.pop() ?? fail - // the register number depends on the traversal order - const accumIndex = order == 'fwd' ? 0 : 1 - // keep the iteration values in args - const args: Maybe[] = [none(), none()] - // apply the lambda to a single element of the set - const evaluateElem = function (elem: RuntimeValue): Maybe { - // The accumulator should have been set in the previous iteration. - // Set the other register to the element. - args[1 - accumIndex] = just(elem) - const result = callable.eval(args) - // save the result for the next iteration - args[accumIndex] = result - return result - } - // iterate over the iterable (a set or a list) - this.applyFun(sourceId, 1, (iterable: Iterable): Maybe => { - return initialComp - .eval() - .map(initialValue => { - // save the initial value - args[accumIndex] = just(initialValue) - // fold the iterable - return flatForEach(order, iterable, just(initialValue), evaluateElem) - }) - .join() - }) + this.popArgs(3) + .map(args => applyFold(order, args)) + .map(comp => this.compStack.push(comp)) + .mapLeft(e => this.errorTracker.addRuntimeError(sourceId, e)) } // pop nargs computable values, pass them the 'fun' function, and // push the combined computable value on the stack - private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => Maybe) { + private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => EvaluationResult) { + this.popArgs(nargs) + .map(args => applyFun(fun, args)) + .map(comp => this.compStack.push(comp)) + .mapLeft(e => this.errorTracker.addRuntimeError(sourceId, e)) + } + + private popArgs(nargs: number): Either { if (this.compStack.length < nargs) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') - } else { - // pop nargs elements of the compStack - const args = this.compStack.splice(-nargs, nargs) - // produce the new computable value - const comp = { - eval: (): Maybe => { - try { - // compute the values of the arguments at this point - const values = args.map(a => a.eval()) - // if they are all defined, apply the function 'fun' to the arguments - return merge(values) - .map(vs => fun(...vs.map(v => v as RuntimeValue))) - .join() - } catch (error) { - const msg = error instanceof Error ? error.message : 'unknown error' - this.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) - return none() - } - }, - } - this.compStack.push(comp) + return left({ code: 'QNT501', message: 'Not enough arguments' }) } + return right(this.compStack.splice(-nargs, nargs)) } // if-then-else requires special treatment, @@ -1243,12 +1100,12 @@ export class CompilerVisitor implements IRVisitor { actions: Computable[], kind: 'all' | 'then', actionId: (idx: number) => bigint - ): Maybe { + ): EvaluationResult { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() const savedTrace = this.trace.get() - let result: Maybe = just(rv.mkBool(true)) + let result: EvaluationResult = right(rv.mkBool(true)) // Evaluate arguments iteratively. // Stop as soon as one of the arguments returns false. // This is a form of Boolean short-circuiting. @@ -1256,8 +1113,8 @@ export class CompilerVisitor implements IRVisitor { for (const action of actions) { nactionsLeft-- result = action.eval() - const isFalse = result.isJust() && !(result.value as RuntimeValue).toBool() - if (result.isNone() || isFalse) { + const isFalse = result.isRight() && !(result.value as RuntimeValue).toBool() + if (result.isLeft() || isFalse) { // As soon as one of the arguments does not evaluate to true, // break out of the loop. // Restore the values of the next variables, @@ -1268,12 +1125,11 @@ export class CompilerVisitor implements IRVisitor { if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - this.errorTracker.addRuntimeError( - actionId(actionNo), - 'QNT513', - `Cannot continue in A.then(B), A evaluates to 'false'` - ) - return none() + return left({ + code: 'QNT513', + message: `Cannot continue in A.then(B), A evaluates to 'false'`, + reference: actionId(actionNo), + }) } else { return result } @@ -1322,18 +1178,17 @@ export class CompilerVisitor implements IRVisitor { return } const [action, pred] = this.compStack.splice(-2) - const lazyCompute = (): Maybe => { + const lazyCompute = (): EvaluationResult => { const savedNextVars = this.snapshotNextVars() const savedTrace = this.trace.get() const actionResult = action.eval() - if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { + if (actionResult.isLeft() || !(actionResult.value as RuntimeValue).toBool()) { // 'A' evaluates to 'false', or produces an error. // Restore the values of the next variables. this.recoverNextVars(savedNextVars) this.trace.reset(savedTrace) // expect emits an error when the run could not finish - this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') - return none() + return left({ code: 'QNT508', message: 'Cannot continue to "expect"', reference: app.args[0].id }) } else { const savedVarsAfterAction = this.snapshotVars() const savedNextVarsAfterAction = this.snapshotNextVars() @@ -1350,9 +1205,8 @@ export class CompilerVisitor implements IRVisitor { this.recoverVars(savedVarsAfterAction) this.recoverNextVars(savedNextVarsAfterAction) this.trace.reset(savedTraceAfterAction) - if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { - this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') - return none() + if (predResult.isLeft() || !(predResult.value as RuntimeValue).toBool()) { + return left({ code: 'QNT508', message: 'Expect condition does not hold true', reference: app.args[1].id }) } return predResult } @@ -1379,7 +1233,7 @@ export class CompilerVisitor implements IRVisitor { const actions = indices.map(i => { return { eval: () => { - return action.eval([just(rv.mkInt(BigInt(i)))]) + return action.eval([right(rv.mkInt(BigInt(i)))]) }, } }) @@ -1399,39 +1253,13 @@ export class CompilerVisitor implements IRVisitor { // - A implies B private translateBoolOp( app: ir.QuintApp, - defaultValue: Maybe, - shortCircuit: (no: number, r: boolean) => Maybe + defaultValue: RuntimeValue, + shortCircuit: (no: number, r: boolean) => RuntimeValue | undefined ): void { - if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) - return - } - const args = this.compStack.splice(-app.args.length) - - const lazyCompute = () => { - let result: Maybe = defaultValue - // Evaluate arguments iteratively. - // Stop as soon as shortCircuit tells us to stop. - let no = 0 - for (const arg of args) { - // either the argument is evaluated to a Boolean, or fails - result = arg.eval() - if (result.isNone()) { - return none() - } - - // if shortCircuit returns a value, return the value immediately - const b = shortCircuit(no, (result.value as RuntimeValue).toBool()) - if (b.isJust()) { - return b - } - no += 1 - } - - return result - } - - this.compStack.push(mkFunComputable(lazyCompute)) + this.popArgs(app.args.length) + .map(args => applyBoolOp(defaultValue, shortCircuit, args)) + .map(comp => this.compStack.push(comp)) + .mapLeft(e => this.errorTracker.addRuntimeError(app.id, e)) } // translate any { A, ..., C } @@ -1457,7 +1285,7 @@ export class CompilerVisitor implements IRVisitor { this.recoverNextVars(valuesBefore) // either the argument is evaluated to false, or fails this.execListener.onAnyOptionCall(app, i) - const result = arg.eval().or(just(rv.mkBool(false))) + const result = arg.eval().or(right(rv.mkBool(false))) const boolResult = (result.unwrap() as RuntimeValue).toBool() this.execListener.onAnyOptionReturn(app, i) // if this arm evaluates to true, save it in the candidates @@ -1473,7 +1301,7 @@ export class CompilerVisitor implements IRVisitor { // no successor: restore the state and return false this.recoverNextVars(valuesBefore) this.execListener.onAnyReturn(args.length, -1) - return just(rv.mkBool(false)) + return right(rv.mkBool(false)) } else if (ncandidates === 1) { // There is exactly one successor, the execution is deterministic. // No need for randomization. This may reduce the number of tests. @@ -1485,7 +1313,7 @@ export class CompilerVisitor implements IRVisitor { this.recoverNextVars(successors[choice]) this.execListener.onAnyReturn(args.length, successorIndices[choice]) - return just(rv.mkBool(true)) + return right(rv.mkBool(true)) } this.compStack.push(mkFunComputable(lazyCompute)) @@ -1495,25 +1323,26 @@ export class CompilerVisitor implements IRVisitor { private applyOneOf(sourceId: bigint) { this.applyFun(sourceId, 1, set => { const bounds = set.bounds() - const positions: bigint[] = bounds.map(b => { - return ( - b - .map(sz => { - if (sz === 0n) { - this.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) - } - return this.rand(sz) - }) + const positions: Either = mergeInMany( + bounds.map((b): Either => { + if (b.isJust()) { + const sz = b.value + + if (sz === 0n) { + return left({ code: 'QNT509', message: `Applied oneOf to an empty set` }) + } + return right(this.rand(sz)) + } else { // An infinite set, pick an integer from the range [-2^255, 2^255). // Note that pick on Nat uses the absolute value of the passed integer. // TODO: make it a configurable parameter: // https://github.com/informalsystems/quint/issues/279 - .or(just(-(2n ** 255n) + this.rand(2n ** 256n))) - .unwrap() - ) - }) + return right(-(2n ** 255n) + this.rand(2n ** 256n)) + } + }) + ).mapLeft(errors => ({ code: 'QNT501', message: errors.map(quintErrorToString).join('\n') })) - return set.pick(positions.values()) + return positions.chain(ps => set.pick(ps.values())) }) } @@ -1550,11 +1379,14 @@ export class CompilerVisitor implements IRVisitor { next: Computable, inv: Computable ) { - const doRun = (): Maybe => { - return merge([nrunsComp, nstepsComp].map(c => c.eval())) - .map(([nrunsRes, nstepsRes]) => { - const isTrue = (res: Maybe) => { - return !res.isNone() && (res.value as RuntimeValue).toBool() === true + const doRun = (): EvaluationResult => { + return mergeInMany([nrunsComp, nstepsComp].map(c => c.eval())) + .mapLeft((errors): QuintError => { + return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + }) + .chain(([nrunsRes, nstepsRes]) => { + const isTrue = (res: EvaluationResult) => { + return !res.isLeft() && (res.value as RuntimeValue).toBool() === true } // a failure flag for the case a runtime error is found let failure = false @@ -1572,9 +1404,9 @@ export class CompilerVisitor implements IRVisitor { const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } this.execListener.onUserOperatorCall(initApp) const initResult = init.eval() - failure = initResult.isNone() || failure + failure = initResult.isLeft() || failure if (!isTrue(initResult)) { - this.execListener.onUserOperatorReturn(initApp, [], initResult) + this.execListener.onUserOperatorReturn(initApp, [], toMaybe(initResult)) } else { // The initial action evaluates to true. // Our guess of values was good. @@ -1582,8 +1414,8 @@ export class CompilerVisitor implements IRVisitor { this.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() - this.execListener.onUserOperatorReturn(initApp, [], initResult) - failure = invResult.isNone() || failure + this.execListener.onUserOperatorReturn(initApp, [], toMaybe(initResult)) + failure = invResult.isLeft() || failure if (!isTrue(invResult)) { errorFound = true } else { @@ -1598,12 +1430,12 @@ export class CompilerVisitor implements IRVisitor { } this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() - failure = nextResult.isNone() || failure + failure = nextResult.isLeft() || failure if (isTrue(nextResult)) { this.shiftVars() this.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onUserOperatorReturn(nextApp, [], toMaybe(nextResult)) } else { // Otherwise, the run cannot be extended. // In some cases, this may indicate a deadlock. @@ -1612,7 +1444,7 @@ export class CompilerVisitor implements IRVisitor { // the run. Hence, do not report an error here, but simply // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onUserOperatorReturn(nextApp, [], toMaybe(nextResult)) this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace.get()) break } @@ -1627,9 +1459,8 @@ export class CompilerVisitor implements IRVisitor { } // end of a single random run // finally, return true, if no error was found - return !failure ? just(rv.mkBool(!errorFound)) : none() + return !failure ? right(rv.mkBool(!errorFound)) : left({ code: 'QNT501', message: 'Simulation failure' }) }) - .join() } this.compStack.push(mkFunComputable(doRun)) } @@ -1692,94 +1523,4 @@ export class CompilerVisitor implements IRVisitor { return undefined } - - // Access a list via an index - private getListElem(sourceId: bigint, list: List, idx: number) { - if (idx >= 0n && idx < list.size) { - const elem = list.get(Number(idx)) - return elem ? just(elem) : none() - } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) - return none() - } - } - - // Update a list via an index - private updateList(sourceId: bigint, list: List, idx: number, value: RuntimeValue) { - if (idx >= 0n && idx < list.size) { - return just(rv.mkList(list.set(Number(idx), value))) - } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, replaceAt(..., ${idx}, ...)`) - return none() - } - } - - // slice a list - private sliceList(sourceId: bigint, list: List, start: number, end: number) { - return just(rv.mkList(list.slice(start, end))) - } -} - -// make a `Computable` that always returns a given runtime value -function mkConstComputable(value: RuntimeValue) { - return { - eval: () => { - return just(value) - }, - } -} - -// make a `Computable` that always returns a given runtime value -function mkFunComputable(fun: () => Maybe) { - return { - eval: () => { - return fun() - }, - } -} - -/** - * Apply `f` to every element of `iterable` and either: - * - * - return `none`, if one of the results is `none`, or - * - return `just` of the unpacked results. - */ -function flatMap(iterable: Iterable, f: (_arg: T) => Maybe): Maybe> { - const results: R[] = [] - for (const arg of iterable) { - const res = f(arg) - if (res.isNone()) { - return none>() - } else { - const { value } = res - results.push(value) - } - } - - return just(results) -} - -/** - * Apply `f` to every element of `iterable` and either: - * - * - return `none`, if one of the results is `none`, or - * - return `just` of the last result. - */ -function flatForEach( - order: 'fwd' | 'rev', - iterable: Iterable, - init: Maybe, - f: (_arg: T) => Maybe -): Maybe { - let result: Maybe = init - // if the reverse order is required, reverse the array - const iter = order === 'fwd' ? iterable : Array(...iterable).reverse() - for (const arg of iter) { - result = f(arg) - if (result.isNone()) { - return result - } - } - - return result } diff --git a/quint/src/runtime/impl/operatorEvaluator.ts b/quint/src/runtime/impl/operatorEvaluator.ts new file mode 100644 index 000000000..1777d4ccb --- /dev/null +++ b/quint/src/runtime/impl/operatorEvaluator.ts @@ -0,0 +1,162 @@ +// pop nargs computable values, pass them the 'fun' function, and + +import { Either, left, mergeInMany, right } from '@sweet-monads/either' +import { Callable, Computable, EvaluationResult } from '../runtime' +import { RuntimeValue, rv } from './runtimeValue' +import { strict as assert } from 'assert' +import { List } from 'immutable' +import { QuintError, quintErrorToString } from '../../quintError' + +// push the combined computable value on the stack +export function applyFun(fun: (..._args: RuntimeValue[]) => EvaluationResult, args: Computable[]): Computable { + // produce the new computable value + return { + eval: () => { + try { + // compute the values of the arguments at this point + const values = args.map(a => a.eval()) + // if they are all defined, apply the function 'fun' to the arguments + return mergeInMany(values) + .mapLeft((errors): QuintError => ({ code: 'QNT501', message: errors.map(quintErrorToString).join('\n') })) + .chain(vs => fun(...vs.map(v => v as RuntimeValue))) + } catch (error) { + const msg = error instanceof Error ? error.message : 'unknown error' + console.error(`Internal error: ${msg}`) + return left({ code: 'QNT501', message: `Internal error: ${msg}` }) + } + }, + } +} + +export function applyFold(order: 'fwd' | 'rev', args: Computable[]): Computable { + const [iterableComp, initialComp, callableComp] = args + return { + eval: () => { + const iterableResult = iterableComp.eval() + const initialResult = initialComp.eval() + + const callable = callableComp as Callable + assert(callable.nparams === 2) + + if (iterableResult.isLeft()) { + return iterableResult + } + + const iterable = Array.from(iterableResult.value as RuntimeValue as Iterable) + + const reducer = (acc: EvaluationResult, val: RuntimeValue) => { + if (order === 'fwd') { + return callable.eval([acc, right(val)]) + } else { + return callable.eval([right(val), acc]) + } + } + + if (order === 'fwd') { + return iterable.reduce(reducer, initialResult) + } else { + return iterable.reduceRight(reducer, initialResult) + } + }, + } +} +// Access a list via an index +export function getListElem(list: List, idx: number): EvaluationResult { + if (idx >= 0n && idx < list.size) { + const elem = list.get(Number(idx)) + if (elem) { + return right(elem) + } + } + + return left({ code: 'QNT510', message: `Out of bounds, nth(${idx})` }) +} +// Update a list via an index +export function updateList(list: List, idx: number, value: RuntimeValue): EvaluationResult { + if (idx >= 0n && idx < list.size) { + return right(rv.mkList(list.set(Number(idx), value))) + } else { + return left({ code: 'QNT510', message: `Out of bounds, replaceAt(..., ${idx}, ...)` }) + } +} + +// slice a list +export function sliceList(list: List, start: number, end: number) { + return right(rv.mkList(list.slice(start, end))) +} + +// translate one of the Boolean operators with short-circuiting: +// - or { A, ..., C } +// - and { A, ..., C } +// - A implies B +export function applyBoolOp( + defaultValue: RuntimeValue, + shortCircuit: (no: number, r: boolean) => RuntimeValue | undefined, + args: Computable[] +): Computable { + return { + eval: () => { + let result: EvaluationResult = right(defaultValue) + // Evaluate arguments iteratively. + // Stop as soon as shortCircuit tells us to stop. + let no = 0 + for (const arg of args) { + // either the argument is evaluated to a Boolean, or fails + result = arg.eval() + if (result.isLeft()) { + return result + } + + // if shortCircuit returns a value, return the value immediately + const b = shortCircuit(no, (result.value as RuntimeValue).toBool()) + if (b) { + return right(b) + } + no += 1 + } + + return result + }, + } +} + +/** + * A generalized application of a one-argument Callable to a set-like + * runtime value, as required by `exists`, `forall`, `map`, and `filter`. + * + * This method expects `compStack` to look like follows: + * + * - `(top)` translated lambda, as `Callable`. + * + * - `(top - 1)`: a set-like value to iterate over, as `Computable`. + * + * The method evaluates the Callable for each element of the iterable value + * and either produces `none`, if evaluation failed for one of the elements, + * or it applies `mapResultAndElems` to the pairs that consists of the Callable + * result and the original element of the iterable value. + * The final result is stored on the stack. + */ +export function mapLambdaThenReduce( + reduceFunction: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue, + args: Computable[] +): Computable { + const [setComp, callableComp] = args + const callable = callableComp as Callable + // apply the lambda to a single element of the set + const evaluateElem = (elem: RuntimeValue): Either => { + // evaluate the predicate against the actual arguments + const result = callable.eval([right(elem)]) + return result.map(result => [result as RuntimeValue, elem]) + } + return applyFun( + (iterable: Iterable): EvaluationResult => { + const lambdaApplicationResults = mergeInMany(Array.from(iterable).map(value => evaluateElem(value))) + return lambdaApplicationResults + .mapLeft((errors): QuintError => { + return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + }) + .map(array => reduceFunction(array)) + }, + [setComp] + ) +} diff --git a/quint/src/runtime/impl/runtimeValue.ts b/quint/src/runtime/impl/runtimeValue.ts index 250e8350e..c9f95f5bc 100644 --- a/quint/src/runtime/impl/runtimeValue.ts +++ b/quint/src/runtime/impl/runtimeValue.ts @@ -69,6 +69,9 @@ import { expressionToString } from '../../ir/IRprinting' import { Callable, EvalResult } from '../runtime' import { QuintEx } from '../../ir/quintIr' +import { QuintError, quintErrorToString } from '../../quintError' +import { Either, left, mergeInMany, right } from '@sweet-monads/either' +import { toMaybe } from './base' /** The default entry point of this module */ export default rv @@ -431,7 +434,7 @@ export interface RuntimeValue extends EvalResult, ValueObject, Iterable): Maybe + pick(positions: Iterator): Either /** * If this runtime value is set-line, compute the bounds for all subsets, @@ -454,7 +457,7 @@ export interface RuntimeValue extends EvalResult, ValueObject, Iterable + cardinality(): Either } /** @@ -648,16 +651,16 @@ abstract class RuntimeValueBase implements RuntimeValue { return 0 } - pick(_positions: Iterator): Maybe { - return none() + pick(_positions: Iterator): Either { + return left({ code: 'QNT501', message: '.pick() not implemented' }) } bounds(): Maybe[] { return [] } - cardinality() { - return just(0n) + cardinality(): Either { + return right(0n) } toQuintEx(gen: IdGenerator): QuintEx { @@ -935,7 +938,7 @@ class RuntimeValueSet extends RuntimeValueBase implements RuntimeValue { return this.set.includes(elem.normalForm()) } - pick(positions: Iterator): Maybe { + pick(positions: Iterator): Either { const next = positions.next() assert(!next.done, 'Internal error: too few positions. Report a bug.') let index = next.value @@ -945,20 +948,21 @@ class RuntimeValueSet extends RuntimeValueBase implements RuntimeValue { // without creating intermediate objects in memory. for (const e of this) { if (index <= 0) { - return just(e) + return right(e) } index -= 1n } - return none() + // Not sure if this can happen + return left({ code: 'QNT501', message: 'Index out of bounds' }) } bounds(): Maybe[] { - return [this.cardinality()] + return [toMaybe(this.cardinality())] } cardinality() { - return just(BigInt(this.set.size)) + return right(BigInt(this.set.size)) } toQuintEx(gen: IdGenerator): QuintEx { @@ -1044,7 +1048,7 @@ class RuntimeValueInterval extends RuntimeValueBase implements RuntimeValue { } } - pick(positions: Iterator): Maybe { + pick(positions: Iterator): Either { const next = positions.next() assert(!next.done, 'Internal error: too few positions. Report a bug.') const index = next.value @@ -1053,18 +1057,18 @@ class RuntimeValueInterval extends RuntimeValueBase implements RuntimeValue { `Internal error: index ${index} is out of bounds [${this.first}, ${this.last}]. Report a bug.` ) if (this.last < this.first) { - return none() + return left({ code: 'QNT501', message: 'Index out of bounds' }) } else { - return just(new RuntimeValueInt(this.first + BigInt(index))) + return right(new RuntimeValueInt(this.first + BigInt(index))) } } bounds(): Maybe[] { - return [this.cardinality()] + return [toMaybe(this.cardinality())] } cardinality() { - return just(BigInt(this.last - this.first) + 1n) + return right(BigInt(this.last - this.first) + 1n) } toQuintEx(gen: IdGenerator): QuintEx { @@ -1188,18 +1192,26 @@ class RuntimeValueCrossProd extends RuntimeValueBase implements RuntimeValue { } } - cardinality(): Maybe { - return merge(this.sets.map(s => s.cardinality())).map(cards => cards.reduce((n, card) => n * card, 1n)) + cardinality(): Either { + return mergeInMany(this.sets.map(s => s.cardinality())) + .map(cards => cards.reduce((n, card) => n * card, 1n)) + .mapLeft((errors): QuintError => { + return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + }) } - pick(positions: Iterator): Maybe { - const elems: Maybe = merge(this.sets.map(elemSet => elemSet.pick(positions))) + pick(positions: Iterator): Either { + const elems: Either = mergeInMany( + this.sets.map(elemSet => elemSet.pick(positions)) + ).mapLeft((errors): QuintError => { + return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + }) return elems.map(es => new RuntimeValueTupleOrList('Tup', List.of(...es))) } bounds(): Maybe[] { - return this.sets.map(elemSet => elemSet.cardinality()) + return this.sets.map(elemSet => toMaybe(elemSet.cardinality())) } toQuintEx(gen: IdGenerator): QuintEx { @@ -1273,18 +1285,18 @@ class RuntimeValuePowerset extends RuntimeValueBase implements RuntimeValue { } } - cardinality(): Maybe { + cardinality(): Either { return this.baseSet.cardinality().map(c => 2n ** c) } - pick(positions: Iterator): Maybe { + pick(positions: Iterator): Either { const next = positions.next() assert(!next.done, 'Internal error: too few positions. Report a bug.') return this.cardinality().map(_ => this.fromIndex(next.value)) } bounds(): Maybe[] { - return [this.cardinality()] + return [toMaybe(this.cardinality())] } toQuintEx(gen: IdGenerator): QuintEx { @@ -1391,45 +1403,49 @@ class RuntimeValueMapSet extends RuntimeValueBase implements RuntimeValue { } } - cardinality(): Maybe { - return merge([this.rangeSet.cardinality(), this.domainSet.cardinality()]).map(([rc, dc]) => rc ** dc) + cardinality(): Either { + return mergeInMany([this.rangeSet.cardinality(), this.domainSet.cardinality()]) + .map(([rc, dc]) => rc ** dc) + .mapLeft((errors): QuintError => { + return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } + }) } - pick(positions: Iterator): Maybe { - const domainSizeOrNone = this.domainSet.cardinality() - const rangeSizeOrNone = this.rangeSet.cardinality() - if (domainSizeOrNone.isNone()) { + pick(positions: Iterator): Either { + const domainSizeResult = this.domainSet.cardinality() + const rangeSizeResult = this.rangeSet.cardinality() + if (domainSizeResult.isLeft()) { // we cannot generate maps over infinite domains - return none() + return left(domainSizeResult.value) } - const domainSize = domainSizeOrNone.value - if (domainSize === 0n || (rangeSizeOrNone.isJust() && rangeSizeOrNone.value === 0n)) { + const domainSize = domainSizeResult.value + if (domainSize === 0n || (rangeSizeResult.isRight() && rangeSizeResult.value === 0n)) { // the set of maps is empty, no way to pick a value - return none() + return left({ code: 'QNT501', message: 'Empty set of maps' }) } const keyValues: [RuntimeValue, RuntimeValue][] = [] for (const key of this.domainSet) { const valueOrNone = this.rangeSet.pick(positions) - if (valueOrNone.isJust()) { + if (valueOrNone.isRight()) { keyValues.push([key, valueOrNone.value]) } else { - return none() + return valueOrNone } } - return just(rv.mkMap(keyValues)) + return right(rv.mkMap(keyValues)) } bounds(): Maybe[] { - const domainSizeOrNone = this.domainSet.cardinality() + const domainSizeOrNone = toMaybe(this.domainSet.cardinality()) assert( domainSizeOrNone.isJust() && domainSizeOrNone.value <= Number.MAX_SAFE_INTEGER, `Domain size is over ${Number.MAX_SAFE_INTEGER}` ) const sz = Number(domainSizeOrNone.value) - return Array(sz).fill(this.rangeSet.cardinality()) + return Array(sz).fill(toMaybe(this.rangeSet.cardinality())) } toQuintEx(gen: IdGenerator): QuintEx { @@ -1490,18 +1506,18 @@ class RuntimeValueInfSet extends RuntimeValueBase implements RuntimeValue { } } - pick(positions: Iterator): Maybe { + pick(positions: Iterator): Either { // Simply return the position. The actual range is up to the caller, // as Int and Nat do not really care about the ranges. const next = positions.next() assert(!next.done, 'Internal error: too few positions. Report a bug.') if (this.kind === 'Int') { // Simply return the position. It's up to the caller to pick the position. - return just(rv.mkInt(next.value)) + return right(rv.mkInt(next.value)) } else { // Nat: return the absolute value of the position. const p = next.value - return just(rv.mkInt(p >= 0n ? p : -p)) + return right(rv.mkInt(p >= 0n ? p : -p)) } } @@ -1510,8 +1526,8 @@ class RuntimeValueInfSet extends RuntimeValueBase implements RuntimeValue { return [none()] } - cardinality(): Maybe { - return none() + cardinality(): Either { + return left({ code: 'QNT514', message: `Cardinality of ${this.kind} is infinite` }) } toQuintEx(gen: IdGenerator): QuintEx { diff --git a/quint/src/runtime/runtime.ts b/quint/src/runtime/runtime.ts index 0b4a51dbf..9a201bef3 100644 --- a/quint/src/runtime/runtime.ts +++ b/quint/src/runtime/runtime.ts @@ -12,7 +12,7 @@ * See LICENSE in the project root for license information. */ -import { Maybe, just, none } from '@sweet-monads/maybe' +import { Maybe } from '@sweet-monads/maybe' import { ValueObject } from 'immutable' @@ -21,6 +21,9 @@ import { QuintEx } from '../ir/quintIr' import { IdGenerator } from '../idGenerator' import { rv } from './impl/runtimeValue' +import { Either, left, right } from '@sweet-monads/either' +import { QuintError } from '../quintError' +import { toMaybe } from './impl/base' /** * Evaluation result. @@ -41,6 +44,8 @@ export interface EvalResult extends ValueObject { toQuintEx(gen: IdGenerator): QuintEx } +export type EvaluationResult = Either + /** * An object that can be evaluated by the runtime. Normally, it is constructed * from a Quint expression, but it does not have to. @@ -53,7 +58,7 @@ export interface Computable { * * @param args optional arguments to the computable */ - eval: (args?: Maybe[]) => Maybe + eval: (args?: Either[]) => EvaluationResult } /** @@ -97,7 +102,7 @@ export function mkRegister( registerValue: initValue, // first, define a fruitless eval, as we cannot refer to registerValue yet eval: () => { - return none() + return left({ code: 'QNT501', message: `register ${registerName} is not defined` }) }, } // override `eval`, as we can use `reg` now @@ -105,8 +110,9 @@ export function mkRegister( // computing a register just evaluates to the contents that it stores if (reg.registerValue.isNone()) { onUndefined() + return left({ code: 'QNT501', message: `register ${registerName} is not defined` }) } - return reg.registerValue + return right(reg.registerValue.value) } return reg @@ -129,22 +135,22 @@ export interface Callable extends Computable { export function mkCallable(registers: Register[], body: Computable): Callable { const callable: Callable = { nparams: registers.length, - eval: (_args?: Maybe[]): Maybe => none(), + eval: () => body.eval(), } - callable.eval = (args?: Maybe[]) => { + callable.eval = args => { if (registers.length === 0) { // simply evaluate the body, no parameters are needed return body.eval() } if (args && args.length >= registers.length) { // All parameters are passed via `args`. Store them in the registers. - registers.forEach((r, i) => (r.registerValue = args[i])) + registers.forEach((r, i) => (r.registerValue = toMaybe(args[i]))) // Evaluate the body under for the registers set to `args`. return body.eval() } else { // The lambda is evaluated without giving the arguments. // All we can do is to return this lambda as a runtime value. - return just(rv.mkLambda(registers.length, callable)) + return right(rv.mkLambda(registers.length, callable)) } } return callable @@ -154,8 +160,8 @@ export function mkCallable(registers: Register[], body: Computable): Callable { * An implementation of Computable that always fails. */ export const fail = { - eval: () => { - return none() + eval: (): EvaluationResult => { + return left({ code: 'QNT501', message: 'Failed to evaluate something :/' }) }, } diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 6401678f2..ef4ee0b53 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -18,8 +18,8 @@ import { LookupTable } from '../names/base' import { Computable, kindName } from './runtime' import { ExecutionFrame, newTraceRecorder } from './trace' import { Rng } from '../rng' -import { newEvaluationState } from './impl/compilerImpl' import { QuintError } from '../quintError' +import { newEvaluationState, toMaybe } from './impl/base' /** * Various settings to be passed to the testing framework. @@ -135,15 +135,15 @@ export function compileAndTest( const trace = ctx.evaluationState.trace.get() if (trace.length > 0) { - recorder.onRunReturn(result, trace) + recorder.onRunReturn(toMaybe(result), trace) } else { // Report a non-critical error console.error('Missing a trace') - recorder.onRunReturn(result, []) + recorder.onRunReturn(toMaybe(result), []) } // evaluate the result - if (result.isNone()) { + if (result.isLeft()) { // if the test failed, return immediately return { name, diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 12deb53a5..a285b7f8e 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -1,7 +1,6 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { Either, left, right } from '@sweet-monads/either' -import { just } from '@sweet-monads/maybe' import { expressionToString } from '../../src/ir/IRprinting' import { Callable, Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' import { noExecutionListener } from '../../src/runtime/trace' @@ -22,7 +21,7 @@ import { Rng, newRng } from '../../src/rng' import { SourceLookupPath, stringSourceResolver } from '../../src/parsing/sourceResolver' import { analyzeModules, parse, parseExpressionOrDeclaration, quintErrorToString } from '../../src' import { flattenModules } from '../../src/flattening/fullFlattener' -import { newEvaluationState } from '../../src/runtime/impl/compilerImpl' +import { newEvaluationState } from '../../src/runtime/impl/base' // Use a global id generator, limited to this test suite. const idGen = newIdGenerator() @@ -56,7 +55,7 @@ function assertComputableAsString(computable: Computable, expected: string | und .map(r => r.toQuintEx(idGen)) .map(expressionToString) .map(s => assert(s === expected, `Expected ${expected}, found ${s}`)) - if (result.isNone()) { + if (result.isLeft()) { assert(expected === undefined, `Expected ${expected}, found undefined`) } } @@ -107,29 +106,26 @@ function evalVarAfterRun(varName: string, callee: string, input: string): Either // Recall that left(...) is used for errors, // whereas right(...) is used for non-errors in sweet monads. const callback = (ctx: CompilationContext): Either => { - return callableFromContext(ctx, callee) - .mapRight(run => { - return run - .eval() - .map(res => { - if ((res as RuntimeValue).toBool() === true) { - // extract the value of the state variable - const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() - if (nextVal.isNone()) { - return left(`Value of the variable ${varName} is undefined`) - } else { - return right(expressionToString(nextVal.value.toQuintEx(idGen))) - } + return callableFromContext(ctx, callee).chain(run => { + return run + .eval() + .mapLeft(quintErrorToString) + .chain(res => { + if ((res as RuntimeValue).toBool() === true) { + // extract the value of the state variable + const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() + if (nextVal.isLeft()) { + return left(`Value of the variable ${varName} is undefined`) } else { - const s = expressionToString(res.toQuintEx(idGen)) - const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` - return left(m) + return right(expressionToString(nextVal.value.toQuintEx(idGen))) } - }) - .or(just(left(`Value of ${callee} is undefined`))) - .unwrap() - }) - .join() + } else { + const s = expressionToString(res.toQuintEx(idGen)) + const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` + return left(m) + } + }) + }) } return evalInContext(input, callback) @@ -140,17 +136,14 @@ function evalRun(callee: string, input: string): Either { // Recall that left(...) is used for errors, // whereas right(...) is used for non-errors in sweet monads. const callback = (ctx: CompilationContext): Either => { - return callableFromContext(ctx, callee) - .mapRight(run => { - return run - .eval() - .map(res => { - return right(expressionToString(res.toQuintEx(idGen))) - }) - .or(just(left(`Value of ${callee} is undefined`))) - .unwrap() - }) - .join() + return callableFromContext(ctx, callee).chain(run => { + return run + .eval() + .mapLeft(quintErrorToString) + .chain(res => { + return right(expressionToString(res.toQuintEx(idGen))) + }) + }) } return evalInContext(input, callback) From 0105c975b51314d9b3db993e051835d43961f5d9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 11:21:37 -0300 Subject: [PATCH 351/428] Check usage of `nondet` and `oneOf` --- quint/src/effects/NondetChecker.ts | 74 ++++++++++++++++++++++ quint/src/quintAnalyzer.ts | 6 +- quint/src/quintError.ts | 6 ++ quint/test/effects/NondetChecker.test.ts | 81 ++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 quint/src/effects/NondetChecker.ts create mode 100644 quint/test/effects/NondetChecker.test.ts diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts new file mode 100644 index 000000000..f39393818 --- /dev/null +++ b/quint/src/effects/NondetChecker.ts @@ -0,0 +1,74 @@ +import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' +import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' +import { QuintError } from '../quintError' +import { TypeScheme } from '../types/base' + +export class NondetChecker implements IRVisitor { + private lastDefQualifier: OpQualifier = 'def' + private types: Map = new Map() + + private errors: Map = new Map() + + /** + * Checks effects for multiple updates of the same state variable. + * + * @param effects the effects to look for multiple updates on + * + * @returns a map of errors, where the key is the variable id + */ + checkNondets(types: Map, declarations: QuintDeclaration[]): Map { + this.types = types + + declarations.forEach(d => walkDeclaration(this, d)) + return this.errors + } + + enterOpDef(def: QuintOpDef) { + this.lastDefQualifier = def.qualifier + } + + enterApp(app: QuintApp) { + if (app.opcode !== 'oneOf') { + // nothing to check + return + } + + if (this.lastDefQualifier !== 'nondet') { + this.errors.set(app.id, { + code: 'QNT203', + message: `'oneOf' must be used inside a nondet definition`, + reference: app.id, + data: {}, + }) + return + } + } + + enterLet(expr: QuintLet) { + if (expr.opdef.qualifier !== 'nondet') { + return + } + + // body of nondet must be an application of oneOf + const body = expr.opdef.expr + if (body.kind !== 'app' || body.opcode !== 'oneOf') { + this.errors.set(body.id, { + code: 'QNT204', + message: `'oneOf' must be the outtermost expression in a nondet definition`, + reference: body.id, + data: {}, + }) + } + + // if the opdef is nondet, the return type must be bool + const expressionType = this.types.get(expr.expr.id) + if (expressionType?.type.kind !== 'bool') { + this.errors.set(expr.id, { + code: 'QNT205', + message: `nondet bindings can only be used with boolean expressions`, + reference: expr.id, + data: {}, + }) + } + } +} diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 32cd723c8..48e54fdeb 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -23,6 +23,7 @@ import { QuintError } from './quintError' import { errorTreeToString } from './errorTree' import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker' import { TypeApplicationResolver } from './types/typeApplicationResolution' +import { NondetChecker } from './effects/NondetChecker' /* Products from static analysis */ export type AnalysisOutput = { @@ -88,6 +89,7 @@ class QuintAnalyzer { private typeInferrer: TypeInferrer private modeChecker: ModeChecker private multipleUpdatesChecker: MultipleUpdatesChecker + private nondetChecker: NondetChecker private errors: QuintError[] = [] private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } @@ -99,6 +101,7 @@ class QuintAnalyzer { this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) + this.nondetChecker = new NondetChecker() } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { @@ -108,6 +111,7 @@ class QuintAnalyzer { const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) + const nondetErrMap = this.nondetChecker.checkNondets(types, resolvedDecls) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] @@ -119,7 +123,7 @@ class QuintAnalyzer { }) ) - this.errors.push(...modeErrMap.values(), ...updatesErrMap.values()) + this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrMap.values()) // We assume that ids are unique across modules, and map merging can be done // without collision checks diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 57c18af1b..8d0862716 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -67,6 +67,12 @@ export type ErrorCode = | 'QNT201' /* QNT202: Multiple updates of the same variable */ | 'QNT202' + /* QNT203: 'oneOf' must be used inside a nondet definition */ + | 'QNT203' + /* QNT204: 'oneOf' must be the outtermost expression in a nondet definition */ + | 'QNT204' + /* QNT205: nondet bindings can only be used with boolean expressions */ + | 'QNT205' /* QNT404: Name '' not found */ | 'QNT404' /* QNT405: Module '' not found */ diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts new file mode 100644 index 000000000..2f3f454ce --- /dev/null +++ b/quint/test/effects/NondetChecker.test.ts @@ -0,0 +1,81 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { errorTreeToString, newIdGenerator, parse, quintErrorToString } from '../../src' +import { NondetChecker } from '../../src/effects/NondetChecker' +import { SourceLookupPath } from '../../src/parsing/sourceResolver' +import { TypeInferrer } from '../../src/types/inferrer' + +const checker = new NondetChecker() + +describe('checkNondets', () => { + function moduleAndTypes(text: string) { + const idGen = newIdGenerator() + const fake_path: SourceLookupPath = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' } + const { modules, table, errors } = parse(idGen, 'fake_location', fake_path, text) + assert.isEmpty(errors, `Unexpected parse errors: ${[...errors].map(quintErrorToString)}`) + + const typeInferrer = new TypeInferrer(table) + const [typeErrors, types] = typeInferrer.inferTypes(modules[0].declarations) + assert.isEmpty(typeErrors, `Unexpected type errors: ${[...typeErrors.values()].map(errorTreeToString)}`) + + return { module: modules[0], types } + } + + it('returns empty map for effects with no problems', () => { + const text = `module A { + val a = 1 + var x: int + action foo = { nondet bar = Set(1,2).oneOf() x' = bar } + }` + + const { module, types } = moduleAndTypes(text) + + const errors = checker.checkNondets(types, module.declarations) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) + }) + + it('returns a map with errors for all problems', () => { + const text = `module A { + val a = Set(1,2).oneOf() // error: 'oneOf' must be used inside a nondet definition + var x: int + + // error: 'oneOf' must be the outtermost expression in a nondet definition + action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } + + nondet top_level = Set(1,2).oneOf() // error: TODO + + // error: nondet bindings can only be used with boolean expressions + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module, types } = moduleAndTypes(text) + + const errors = checker.checkNondets(types, module.declarations) + + assert.sameDeepMembers( + [...errors.entries()], + [ + [4n, { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }], + [ + 13n, + { + code: 'QNT204', + message: "'oneOf' must be the outtermost expression in a nondet definition", + reference: 13n, + data: {}, + }, + ], + [ + 26n, + { + code: 'QNT205', + message: 'nondet bindings can only be used with boolean expressions', + reference: 26n, + data: {}, + }, + ], + ] + ) + }) +}) From d0d7edf3c33aaead2017f6f23f8f70ca995701b7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:09:29 -0300 Subject: [PATCH 352/428] Report informative error when nondet is top level --- quint/src/effects/NondetChecker.ts | 17 +- quint/src/generated/Quint.g4 | 9 +- quint/src/generated/Quint.interp | 5 +- quint/src/generated/Quint.tokens | 14 +- quint/src/generated/QuintLexer.interp | 4 +- quint/src/generated/QuintLexer.tokens | 14 +- quint/src/generated/QuintLexer.ts | 64 +- quint/src/generated/QuintListener.ts | 26 - quint/src/generated/QuintParser.ts | 2337 ++++++++++------------ quint/src/generated/QuintVisitor.ts | 17 - quint/src/names/resolver.ts | 3 + quint/src/parsing/ToIrListener.ts | 47 - quint/src/quintAnalyzer.ts | 2 +- quint/src/quintError.ts | 2 + quint/test/effects/NondetChecker.test.ts | 27 +- quint/test/names/resolver.test.ts | 11 + 16 files changed, 1201 insertions(+), 1398 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index f39393818..1a1976957 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -1,14 +1,20 @@ import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' +import { LookupTable } from '../names/base' import { QuintError } from '../quintError' import { TypeScheme } from '../types/base' export class NondetChecker implements IRVisitor { - private lastDefQualifier: OpQualifier = 'def' + private table: LookupTable private types: Map = new Map() + private lastDefQualifier: OpQualifier = 'def' private errors: Map = new Map() + constructor(table: LookupTable) { + this.table = table + } + /** * Checks effects for multiple updates of the same state variable. * @@ -25,6 +31,15 @@ export class NondetChecker implements IRVisitor { enterOpDef(def: QuintOpDef) { this.lastDefQualifier = def.qualifier + + if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { + this.errors.set(def.id, { + code: 'QNT206', + message: `'nondet' can only be used inside actions, not at the top level`, + reference: def.id, + data: {}, + }) + } } enterApp(app: QuintApp) { diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 7c79ae84d..ebeba8455 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -31,11 +31,6 @@ declaration : 'const' qualId ':' type # const | typeDef # typeDefs | importMod # importDef | exportMod # exportDef - // https://github.com/informalsystems/quint/issues/378 - //| 'nondet' qualId (':' type)? '=' expr ';'? expr { - // const m = "QNT007: 'nondet' is only allowed inside actions" - // this.notifyErrorListeners(m) - //} # nondetError ; // An operator definition. @@ -76,8 +71,6 @@ sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; -nondetOperDef : 'nondet' qualId (':' type)? '=' expr ';'?; - qualifier : 'val' | 'def' | 'pure' 'val' @@ -85,6 +78,7 @@ qualifier : 'val' | 'action' | 'run' | 'temporal' + | 'nondet' ; importMod : 'import' name '.' identOrStar ('from' fromSource)? @@ -188,7 +182,6 @@ expr: // apply a built-in operator via the dot notation | '[' (expr (',' expr)*)? ','? ']' # list | 'if' '(' expr ')' expr 'else' expr # ifElse | operDef expr # letIn - | nondetOperDef expr # nondet | '(' expr ')' # paren | '{' expr '}' # braces ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 761f5f1b0..557f4271e 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -13,13 +13,13 @@ null '[' ']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -154,7 +154,6 @@ typeDef typeDefHead sumTypeDefinition typeSumVariant -nondetOperDef qualifier importMod exportMod @@ -191,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 805, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 385, 10, 20, 12, 20, 14, 20, 388, 11, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 397, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 414, 10, 20, 12, 20, 14, 20, 417, 11, 20, 3, 20, 3, 20, 5, 20, 421, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 429, 10, 20, 12, 20, 14, 20, 432, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 445, 10, 22, 12, 22, 14, 22, 448, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 453, 10, 22, 3, 22, 3, 22, 5, 22, 457, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 466, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 482, 10, 24, 12, 24, 14, 24, 485, 11, 24, 3, 24, 5, 24, 488, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 497, 10, 24, 12, 24, 14, 24, 500, 11, 24, 3, 24, 5, 24, 503, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 513, 10, 24, 12, 24, 14, 24, 516, 11, 24, 3, 24, 5, 24, 519, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 528, 10, 24, 12, 24, 14, 24, 531, 11, 24, 3, 24, 5, 24, 534, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 542, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 550, 10, 24, 12, 24, 14, 24, 553, 11, 24, 3, 24, 5, 24, 556, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 759, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 764, 10, 36, 12, 36, 14, 36, 767, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 5, 39, 783, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 792, 10, 42, 12, 42, 14, 42, 795, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 801, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 904, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 420, 3, 2, 2, 2, 40, 433, 3, 2, 2, 2, 42, 456, 3, 2, 2, 2, 44, 458, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 752, 3, 2, 2, 2, 68, 758, 3, 2, 2, 2, 70, 760, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 782, 3, 2, 2, 2, 78, 784, 3, 2, 2, 2, 80, 786, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 800, 3, 2, 2, 2, 86, 802, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 421, 5, 38, 20, 15, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 421, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 421, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 421, 7, 64, 2, 2, 378, 379, 7, 63, 2, 2, 379, 380, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 386, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 385, 5, 38, 20, 2, 384, 382, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 391, 7, 10, 2, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 421, 3, 2, 2, 2, 394, 396, 7, 4, 2, 2, 395, 397, 5, 42, 22, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 421, 7, 5, 2, 2, 399, 421, 7, 30, 2, 2, 400, 421, 7, 31, 2, 2, 401, 421, 7, 32, 2, 2, 402, 421, 5, 40, 21, 2, 403, 421, 5, 82, 42, 2, 404, 405, 7, 63, 2, 2, 405, 406, 5, 38, 20, 2, 406, 407, 7, 64, 2, 2, 407, 421, 3, 2, 2, 2, 408, 409, 5, 82, 42, 2, 409, 410, 7, 13, 2, 2, 410, 415, 5, 38, 20, 2, 411, 412, 7, 10, 2, 2, 412, 414, 5, 38, 20, 2, 413, 411, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 419, 7, 14, 2, 2, 419, 421, 3, 2, 2, 2, 420, 348, 3, 2, 2, 2, 420, 366, 3, 2, 2, 2, 420, 371, 3, 2, 2, 2, 420, 376, 3, 2, 2, 2, 420, 378, 3, 2, 2, 2, 420, 394, 3, 2, 2, 2, 420, 399, 3, 2, 2, 2, 420, 400, 3, 2, 2, 2, 420, 401, 3, 2, 2, 2, 420, 402, 3, 2, 2, 2, 420, 403, 3, 2, 2, 2, 420, 404, 3, 2, 2, 2, 420, 408, 3, 2, 2, 2, 421, 430, 3, 2, 2, 2, 422, 423, 12, 17, 2, 2, 423, 424, 7, 28, 2, 2, 424, 429, 5, 38, 20, 17, 425, 426, 12, 16, 2, 2, 426, 427, 7, 29, 2, 2, 427, 429, 5, 38, 20, 16, 428, 422, 3, 2, 2, 2, 428, 425, 3, 2, 2, 2, 429, 432, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 39, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 433, 434, 7, 67, 2, 2, 434, 41, 3, 2, 2, 2, 435, 436, 5, 44, 23, 2, 436, 437, 7, 7, 2, 2, 437, 438, 5, 38, 20, 2, 438, 446, 3, 2, 2, 2, 439, 440, 7, 10, 2, 2, 440, 441, 5, 44, 23, 2, 441, 442, 7, 7, 2, 2, 442, 443, 5, 38, 20, 2, 443, 445, 3, 2, 2, 2, 444, 439, 3, 2, 2, 2, 445, 448, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 452, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 449, 453, 7, 10, 2, 2, 450, 451, 7, 15, 2, 2, 451, 453, 5, 86, 44, 2, 452, 449, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 457, 3, 2, 2, 2, 454, 455, 7, 15, 2, 2, 455, 457, 5, 86, 44, 2, 456, 435, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 43, 3, 2, 2, 2, 458, 459, 5, 84, 43, 2, 459, 45, 3, 2, 2, 2, 460, 461, 8, 24, 1, 2, 461, 613, 5, 56, 29, 2, 462, 463, 5, 74, 38, 2, 463, 465, 7, 63, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 64, 2, 2, 468, 613, 3, 2, 2, 2, 469, 470, 7, 52, 2, 2, 470, 613, 5, 46, 24, 28, 471, 472, 5, 82, 42, 2, 472, 473, 7, 34, 2, 2, 473, 474, 7, 62, 2, 2, 474, 475, 5, 46, 24, 24, 475, 613, 3, 2, 2, 2, 476, 477, 7, 45, 2, 2, 477, 478, 7, 4, 2, 2, 478, 483, 5, 46, 24, 2, 479, 480, 7, 10, 2, 2, 480, 482, 5, 46, 24, 2, 481, 479, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 488, 7, 10, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 7, 5, 2, 2, 490, 613, 3, 2, 2, 2, 491, 492, 7, 46, 2, 2, 492, 493, 7, 4, 2, 2, 493, 498, 5, 46, 24, 2, 494, 495, 7, 10, 2, 2, 495, 497, 5, 46, 24, 2, 496, 494, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 501, 503, 7, 10, 2, 2, 502, 501, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 7, 5, 2, 2, 505, 613, 3, 2, 2, 2, 506, 613, 5, 48, 25, 2, 507, 508, 7, 35, 2, 2, 508, 509, 7, 4, 2, 2, 509, 514, 5, 46, 24, 2, 510, 511, 7, 10, 2, 2, 511, 513, 5, 46, 24, 2, 512, 510, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 517, 519, 7, 10, 2, 2, 518, 517, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 5, 2, 2, 521, 613, 3, 2, 2, 2, 522, 523, 7, 36, 2, 2, 523, 524, 7, 4, 2, 2, 524, 529, 5, 46, 24, 2, 525, 526, 7, 10, 2, 2, 526, 528, 5, 46, 24, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 534, 7, 10, 2, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 536, 7, 5, 2, 2, 536, 613, 3, 2, 2, 2, 537, 542, 5, 82, 42, 2, 538, 542, 7, 44, 2, 2, 539, 542, 7, 43, 2, 2, 540, 542, 7, 42, 2, 2, 541, 537, 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, 542, 613, 3, 2, 2, 2, 543, 544, 7, 63, 2, 2, 544, 545, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 551, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 550, 5, 46, 24, 2, 549, 547, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 554, 556, 7, 10, 2, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 64, 2, 2, 558, 613, 3, 2, 2, 2, 559, 560, 7, 63, 2, 2, 560, 613, 7, 64, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 72, 37, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 72, 37, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 460, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 469, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 476, 3, 2, 2, 2, 612, 491, 3, 2, 2, 2, 612, 506, 3, 2, 2, 2, 612, 507, 3, 2, 2, 2, 612, 522, 3, 2, 2, 2, 612, 541, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 559, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 29, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 29, 617, 618, 12, 27, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 28, 620, 621, 12, 26, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 27, 623, 624, 12, 25, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 26, 626, 627, 12, 23, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 24, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 21, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 22, 634, 635, 12, 19, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 20, 637, 638, 12, 18, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 19, 640, 641, 12, 17, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 18, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 33, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 76, 39, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 30, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 84, 43, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 84, 43, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 82, 42, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 753, 5, 62, 32, 2, 753, 754, 7, 7, 2, 2, 754, 755, 5, 38, 20, 2, 755, 67, 3, 2, 2, 2, 756, 759, 7, 53, 2, 2, 757, 759, 5, 82, 42, 2, 758, 756, 3, 2, 2, 2, 758, 757, 3, 2, 2, 2, 759, 69, 3, 2, 2, 2, 760, 765, 5, 46, 24, 2, 761, 762, 7, 10, 2, 2, 762, 764, 5, 46, 24, 2, 763, 761, 3, 2, 2, 2, 764, 767, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 71, 3, 2, 2, 2, 767, 765, 3, 2, 2, 2, 768, 769, 5, 84, 43, 2, 769, 770, 7, 7, 2, 2, 770, 771, 5, 46, 24, 2, 771, 775, 3, 2, 2, 2, 772, 773, 7, 40, 2, 2, 773, 775, 5, 46, 24, 2, 774, 768, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 5, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 783, 5, 82, 42, 2, 781, 783, 9, 6, 2, 2, 782, 780, 3, 2, 2, 2, 782, 781, 3, 2, 2, 2, 783, 77, 3, 2, 2, 2, 784, 785, 9, 7, 2, 2, 785, 79, 3, 2, 2, 2, 786, 787, 9, 8, 2, 2, 787, 81, 3, 2, 2, 2, 788, 793, 5, 86, 44, 2, 789, 790, 7, 41, 2, 2, 790, 792, 5, 86, 44, 2, 791, 789, 3, 2, 2, 2, 792, 795, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 83, 3, 2, 2, 2, 795, 793, 3, 2, 2, 2, 796, 801, 5, 86, 44, 2, 797, 798, 5, 82, 42, 2, 798, 799, 8, 43, 1, 2, 799, 801, 3, 2, 2, 2, 800, 796, 3, 2, 2, 2, 800, 797, 3, 2, 2, 2, 801, 85, 3, 2, 2, 2, 802, 803, 9, 9, 2, 2, 803, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 386, 390, 396, 415, 420, 428, 430, 446, 452, 456, 465, 483, 487, 498, 502, 514, 518, 529, 533, 541, 551, 555, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 758, 765, 774, 778, 782, 793, 800] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 790, 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, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 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, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 5, 6, 160, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 168, 10, 6, 12, 6, 14, 6, 171, 11, 6, 5, 6, 173, 10, 6, 3, 6, 5, 6, 176, 10, 6, 3, 6, 3, 6, 5, 6, 180, 10, 6, 3, 6, 3, 6, 5, 6, 184, 10, 6, 3, 6, 5, 6, 187, 10, 6, 5, 6, 189, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 210, 10, 8, 12, 8, 14, 8, 213, 11, 8, 3, 8, 5, 8, 216, 10, 8, 3, 9, 5, 9, 219, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 224, 10, 9, 12, 9, 14, 9, 227, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 234, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 260, 10, 12, 3, 12, 3, 12, 5, 12, 264, 10, 12, 5, 12, 266, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 292, 10, 14, 12, 14, 14, 14, 295, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 302, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 315, 10, 14, 12, 14, 14, 14, 318, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 325, 10, 14, 5, 14, 327, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 342, 10, 19, 12, 19, 14, 19, 345, 11, 19, 5, 19, 347, 10, 19, 3, 19, 5, 19, 350, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 373, 10, 19, 12, 19, 14, 19, 376, 11, 19, 3, 19, 5, 19, 379, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 385, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 402, 10, 19, 12, 19, 14, 19, 405, 11, 19, 3, 19, 3, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 417, 10, 19, 12, 19, 14, 19, 420, 11, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 433, 10, 21, 12, 21, 14, 21, 436, 11, 21, 3, 21, 3, 21, 3, 21, 5, 21, 441, 10, 21, 3, 21, 3, 21, 5, 21, 445, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 454, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 470, 10, 23, 12, 23, 14, 23, 473, 11, 23, 3, 23, 5, 23, 476, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 485, 10, 23, 12, 23, 14, 23, 488, 11, 23, 3, 23, 5, 23, 491, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 501, 10, 23, 12, 23, 14, 23, 504, 11, 23, 3, 23, 5, 23, 507, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 516, 10, 23, 12, 23, 14, 23, 519, 11, 23, 3, 23, 5, 23, 522, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 530, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 538, 10, 23, 12, 23, 14, 23, 541, 11, 23, 3, 23, 5, 23, 544, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 554, 10, 23, 12, 23, 14, 23, 557, 11, 23, 3, 23, 5, 23, 560, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 568, 10, 23, 12, 23, 14, 23, 571, 11, 23, 5, 23, 573, 10, 23, 3, 23, 5, 23, 576, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 598, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 637, 10, 23, 3, 23, 5, 23, 640, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 647, 10, 23, 12, 23, 14, 23, 650, 11, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 656, 10, 24, 3, 24, 3, 24, 3, 24, 7, 24, 661, 10, 24, 12, 24, 14, 24, 664, 11, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 670, 10, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 679, 10, 26, 3, 26, 5, 26, 682, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 5, 28, 697, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 707, 10, 29, 12, 29, 14, 29, 710, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 716, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 6, 30, 723, 10, 30, 13, 30, 14, 30, 724, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 734, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 744, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 749, 10, 35, 12, 35, 14, 35, 752, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 760, 10, 36, 3, 37, 3, 37, 5, 37, 764, 10, 37, 3, 38, 3, 38, 5, 38, 768, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 777, 10, 41, 12, 41, 14, 41, 780, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 786, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 36, 44, 44, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 888, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 188, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 218, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 245, 3, 2, 2, 2, 22, 265, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 326, 3, 2, 2, 2, 28, 328, 3, 2, 2, 2, 30, 330, 3, 2, 2, 2, 32, 332, 3, 2, 2, 2, 34, 334, 3, 2, 2, 2, 36, 408, 3, 2, 2, 2, 38, 421, 3, 2, 2, 2, 40, 444, 3, 2, 2, 2, 42, 446, 3, 2, 2, 2, 44, 597, 3, 2, 2, 2, 46, 651, 3, 2, 2, 2, 48, 669, 3, 2, 2, 2, 50, 674, 3, 2, 2, 2, 52, 692, 3, 2, 2, 2, 54, 696, 3, 2, 2, 2, 56, 715, 3, 2, 2, 2, 58, 717, 3, 2, 2, 2, 60, 733, 3, 2, 2, 2, 62, 735, 3, 2, 2, 2, 64, 737, 3, 2, 2, 2, 66, 743, 3, 2, 2, 2, 68, 745, 3, 2, 2, 2, 70, 759, 3, 2, 2, 2, 72, 763, 3, 2, 2, 2, 74, 767, 3, 2, 2, 2, 76, 769, 3, 2, 2, 2, 78, 771, 3, 2, 2, 2, 80, 773, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 787, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 36, 19, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 36, 19, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 60, 31, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 44, 23, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 26, 14, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 22, 12, 2, 137, 139, 5, 24, 13, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 20, 11, 2, 141, 142, 5, 72, 37, 2, 142, 143, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 151, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 152, 7, 64, 2, 2, 152, 153, 7, 7, 2, 2, 153, 156, 5, 36, 19, 2, 154, 155, 7, 62, 2, 2, 155, 157, 5, 44, 23, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 160, 7, 11, 2, 2, 159, 158, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 189, 3, 2, 2, 2, 161, 162, 5, 20, 11, 2, 162, 175, 5, 72, 37, 2, 163, 172, 7, 63, 2, 2, 164, 169, 5, 62, 32, 2, 165, 166, 7, 10, 2, 2, 166, 168, 5, 62, 32, 2, 167, 165, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 164, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 7, 64, 2, 2, 175, 163, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 178, 7, 7, 2, 2, 178, 180, 5, 36, 19, 2, 179, 177, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 182, 7, 62, 2, 2, 182, 184, 5, 44, 23, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 186, 3, 2, 2, 2, 185, 187, 7, 11, 2, 2, 186, 185, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 189, 3, 2, 2, 2, 188, 140, 3, 2, 2, 2, 188, 161, 3, 2, 2, 2, 189, 11, 3, 2, 2, 2, 190, 191, 7, 12, 2, 2, 191, 203, 5, 80, 41, 2, 192, 193, 7, 12, 2, 2, 193, 194, 5, 14, 8, 2, 194, 195, 7, 62, 2, 2, 195, 196, 5, 36, 19, 2, 196, 203, 3, 2, 2, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 16, 9, 2, 201, 203, 3, 2, 2, 2, 202, 190, 3, 2, 2, 2, 202, 192, 3, 2, 2, 2, 202, 197, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 215, 5, 80, 41, 2, 205, 206, 7, 13, 2, 2, 206, 211, 7, 67, 2, 2, 207, 208, 7, 10, 2, 2, 208, 210, 7, 67, 2, 2, 209, 207, 3, 2, 2, 2, 210, 213, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 214, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 214, 216, 7, 14, 2, 2, 215, 205, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 15, 3, 2, 2, 2, 217, 219, 7, 15, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 225, 5, 18, 10, 2, 221, 222, 7, 15, 2, 2, 222, 224, 5, 18, 10, 2, 223, 221, 3, 2, 2, 2, 224, 227, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 17, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 228, 233, 5, 82, 42, 2, 229, 230, 7, 63, 2, 2, 230, 231, 5, 36, 19, 2, 231, 232, 7, 64, 2, 2, 232, 234, 3, 2, 2, 2, 233, 229, 3, 2, 2, 2, 233, 234, 3, 2, 2, 2, 234, 19, 3, 2, 2, 2, 235, 246, 7, 16, 2, 2, 236, 246, 7, 17, 2, 2, 237, 238, 7, 18, 2, 2, 238, 246, 7, 16, 2, 2, 239, 240, 7, 18, 2, 2, 240, 246, 7, 17, 2, 2, 241, 246, 7, 19, 2, 2, 242, 246, 7, 20, 2, 2, 243, 246, 7, 21, 2, 2, 244, 246, 7, 22, 2, 2, 245, 235, 3, 2, 2, 2, 245, 236, 3, 2, 2, 2, 245, 237, 3, 2, 2, 2, 245, 239, 3, 2, 2, 2, 245, 241, 3, 2, 2, 2, 245, 242, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 244, 3, 2, 2, 2, 246, 21, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 249, 5, 30, 16, 2, 249, 250, 7, 24, 2, 2, 250, 253, 5, 66, 34, 2, 251, 252, 7, 25, 2, 2, 252, 254, 5, 34, 18, 2, 253, 251, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 266, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 259, 5, 30, 16, 2, 257, 258, 7, 26, 2, 2, 258, 260, 5, 30, 16, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 262, 7, 25, 2, 2, 262, 264, 5, 34, 18, 2, 263, 261, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 266, 3, 2, 2, 2, 265, 247, 3, 2, 2, 2, 265, 255, 3, 2, 2, 2, 266, 23, 3, 2, 2, 2, 267, 268, 7, 27, 2, 2, 268, 269, 5, 30, 16, 2, 269, 270, 7, 24, 2, 2, 270, 271, 5, 66, 34, 2, 271, 279, 3, 2, 2, 2, 272, 273, 7, 27, 2, 2, 273, 276, 5, 30, 16, 2, 274, 275, 7, 26, 2, 2, 275, 277, 5, 30, 16, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 267, 3, 2, 2, 2, 278, 272, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 23, 2, 2, 281, 282, 5, 28, 15, 2, 282, 283, 7, 63, 2, 2, 283, 284, 5, 30, 16, 2, 284, 285, 7, 62, 2, 2, 285, 293, 5, 44, 23, 2, 286, 287, 7, 10, 2, 2, 287, 288, 5, 30, 16, 2, 288, 289, 7, 62, 2, 2, 289, 290, 5, 44, 23, 2, 290, 292, 3, 2, 2, 2, 291, 286, 3, 2, 2, 2, 292, 295, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 293, 294, 3, 2, 2, 2, 294, 296, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 296, 297, 7, 64, 2, 2, 297, 298, 7, 24, 2, 2, 298, 301, 7, 53, 2, 2, 299, 300, 7, 25, 2, 2, 300, 302, 5, 34, 18, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 327, 3, 2, 2, 2, 303, 304, 7, 23, 2, 2, 304, 305, 5, 28, 15, 2, 305, 306, 7, 63, 2, 2, 306, 307, 5, 30, 16, 2, 307, 308, 7, 62, 2, 2, 308, 316, 5, 44, 23, 2, 309, 310, 7, 10, 2, 2, 310, 311, 5, 30, 16, 2, 311, 312, 7, 62, 2, 2, 312, 313, 5, 44, 23, 2, 313, 315, 3, 2, 2, 2, 314, 309, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 319, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 320, 7, 64, 2, 2, 320, 321, 7, 26, 2, 2, 321, 324, 5, 32, 17, 2, 322, 323, 7, 25, 2, 2, 323, 325, 5, 34, 18, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 280, 3, 2, 2, 2, 326, 303, 3, 2, 2, 2, 327, 27, 3, 2, 2, 2, 328, 329, 5, 80, 41, 2, 329, 29, 3, 2, 2, 2, 330, 331, 5, 80, 41, 2, 331, 31, 3, 2, 2, 2, 332, 333, 5, 80, 41, 2, 333, 33, 3, 2, 2, 2, 334, 335, 7, 42, 2, 2, 335, 35, 3, 2, 2, 2, 336, 337, 8, 19, 1, 2, 337, 346, 7, 63, 2, 2, 338, 343, 5, 36, 19, 2, 339, 340, 7, 10, 2, 2, 340, 342, 5, 36, 19, 2, 341, 339, 3, 2, 2, 2, 342, 345, 3, 2, 2, 2, 343, 341, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 346, 338, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 349, 3, 2, 2, 2, 348, 350, 7, 10, 2, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 7, 64, 2, 2, 352, 353, 7, 29, 2, 2, 353, 409, 5, 36, 19, 15, 354, 355, 7, 65, 2, 2, 355, 356, 7, 13, 2, 2, 356, 357, 5, 36, 19, 2, 357, 358, 7, 14, 2, 2, 358, 409, 3, 2, 2, 2, 359, 360, 7, 66, 2, 2, 360, 361, 7, 13, 2, 2, 361, 362, 5, 36, 19, 2, 362, 363, 7, 14, 2, 2, 363, 409, 3, 2, 2, 2, 364, 365, 7, 63, 2, 2, 365, 409, 7, 64, 2, 2, 366, 367, 7, 63, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 10, 2, 2, 369, 374, 5, 36, 19, 2, 370, 371, 7, 10, 2, 2, 371, 373, 5, 36, 19, 2, 372, 370, 3, 2, 2, 2, 373, 376, 3, 2, 2, 2, 374, 372, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 377, 379, 7, 10, 2, 2, 378, 377, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 7, 64, 2, 2, 381, 409, 3, 2, 2, 2, 382, 384, 7, 4, 2, 2, 383, 385, 5, 40, 21, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 409, 7, 5, 2, 2, 387, 409, 7, 30, 2, 2, 388, 409, 7, 31, 2, 2, 389, 409, 7, 32, 2, 2, 390, 409, 5, 38, 20, 2, 391, 409, 5, 80, 41, 2, 392, 393, 7, 63, 2, 2, 393, 394, 5, 36, 19, 2, 394, 395, 7, 64, 2, 2, 395, 409, 3, 2, 2, 2, 396, 397, 5, 80, 41, 2, 397, 398, 7, 13, 2, 2, 398, 403, 5, 36, 19, 2, 399, 400, 7, 10, 2, 2, 400, 402, 5, 36, 19, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 406, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 407, 7, 14, 2, 2, 407, 409, 3, 2, 2, 2, 408, 336, 3, 2, 2, 2, 408, 354, 3, 2, 2, 2, 408, 359, 3, 2, 2, 2, 408, 364, 3, 2, 2, 2, 408, 366, 3, 2, 2, 2, 408, 382, 3, 2, 2, 2, 408, 387, 3, 2, 2, 2, 408, 388, 3, 2, 2, 2, 408, 389, 3, 2, 2, 2, 408, 390, 3, 2, 2, 2, 408, 391, 3, 2, 2, 2, 408, 392, 3, 2, 2, 2, 408, 396, 3, 2, 2, 2, 409, 418, 3, 2, 2, 2, 410, 411, 12, 17, 2, 2, 411, 412, 7, 28, 2, 2, 412, 417, 5, 36, 19, 17, 413, 414, 12, 16, 2, 2, 414, 415, 7, 29, 2, 2, 415, 417, 5, 36, 19, 16, 416, 410, 3, 2, 2, 2, 416, 413, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 37, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 7, 67, 2, 2, 422, 39, 3, 2, 2, 2, 423, 424, 5, 42, 22, 2, 424, 425, 7, 7, 2, 2, 425, 426, 5, 36, 19, 2, 426, 434, 3, 2, 2, 2, 427, 428, 7, 10, 2, 2, 428, 429, 5, 42, 22, 2, 429, 430, 7, 7, 2, 2, 430, 431, 5, 36, 19, 2, 431, 433, 3, 2, 2, 2, 432, 427, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 440, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 441, 7, 10, 2, 2, 438, 439, 7, 15, 2, 2, 439, 441, 5, 84, 43, 2, 440, 437, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 445, 3, 2, 2, 2, 442, 443, 7, 15, 2, 2, 443, 445, 5, 84, 43, 2, 444, 423, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 41, 3, 2, 2, 2, 446, 447, 5, 82, 42, 2, 447, 43, 3, 2, 2, 2, 448, 449, 8, 23, 1, 2, 449, 598, 5, 54, 28, 2, 450, 451, 5, 72, 37, 2, 451, 453, 7, 63, 2, 2, 452, 454, 5, 68, 35, 2, 453, 452, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 456, 7, 64, 2, 2, 456, 598, 3, 2, 2, 2, 457, 458, 7, 52, 2, 2, 458, 598, 5, 44, 23, 27, 459, 460, 5, 80, 41, 2, 460, 461, 7, 34, 2, 2, 461, 462, 7, 62, 2, 2, 462, 463, 5, 44, 23, 23, 463, 598, 3, 2, 2, 2, 464, 465, 7, 45, 2, 2, 465, 466, 7, 4, 2, 2, 466, 471, 5, 44, 23, 2, 467, 468, 7, 10, 2, 2, 468, 470, 5, 44, 23, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 10, 2, 2, 475, 474, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 5, 2, 2, 478, 598, 3, 2, 2, 2, 479, 480, 7, 46, 2, 2, 480, 481, 7, 4, 2, 2, 481, 486, 5, 44, 23, 2, 482, 483, 7, 10, 2, 2, 483, 485, 5, 44, 23, 2, 484, 482, 3, 2, 2, 2, 485, 488, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 489, 491, 7, 10, 2, 2, 490, 489, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 493, 7, 5, 2, 2, 493, 598, 3, 2, 2, 2, 494, 598, 5, 46, 24, 2, 495, 496, 7, 35, 2, 2, 496, 497, 7, 4, 2, 2, 497, 502, 5, 44, 23, 2, 498, 499, 7, 10, 2, 2, 499, 501, 5, 44, 23, 2, 500, 498, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 506, 3, 2, 2, 2, 504, 502, 3, 2, 2, 2, 505, 507, 7, 10, 2, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 5, 2, 2, 509, 598, 3, 2, 2, 2, 510, 511, 7, 36, 2, 2, 511, 512, 7, 4, 2, 2, 512, 517, 5, 44, 23, 2, 513, 514, 7, 10, 2, 2, 514, 516, 5, 44, 23, 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, 5, 2, 2, 524, 598, 3, 2, 2, 2, 525, 530, 5, 80, 41, 2, 526, 530, 7, 44, 2, 2, 527, 530, 7, 43, 2, 2, 528, 530, 7, 42, 2, 2, 529, 525, 3, 2, 2, 2, 529, 526, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 528, 3, 2, 2, 2, 530, 598, 3, 2, 2, 2, 531, 532, 7, 63, 2, 2, 532, 533, 5, 44, 23, 2, 533, 534, 7, 10, 2, 2, 534, 539, 5, 44, 23, 2, 535, 536, 7, 10, 2, 2, 536, 538, 5, 44, 23, 2, 537, 535, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 544, 7, 10, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 7, 64, 2, 2, 546, 598, 3, 2, 2, 2, 547, 548, 7, 63, 2, 2, 548, 598, 7, 64, 2, 2, 549, 550, 7, 4, 2, 2, 550, 555, 5, 70, 36, 2, 551, 552, 7, 10, 2, 2, 552, 554, 5, 70, 36, 2, 553, 551, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 559, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 560, 7, 10, 2, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 5, 2, 2, 562, 598, 3, 2, 2, 2, 563, 572, 7, 13, 2, 2, 564, 569, 5, 44, 23, 2, 565, 566, 7, 10, 2, 2, 566, 568, 5, 44, 23, 2, 567, 565, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 573, 3, 2, 2, 2, 571, 569, 3, 2, 2, 2, 572, 564, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 3, 2, 2, 2, 574, 576, 7, 10, 2, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 598, 7, 14, 2, 2, 578, 579, 7, 37, 2, 2, 579, 580, 7, 63, 2, 2, 580, 581, 5, 44, 23, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 44, 23, 2, 583, 584, 7, 38, 2, 2, 584, 585, 5, 44, 23, 6, 585, 598, 3, 2, 2, 2, 586, 587, 5, 10, 6, 2, 587, 588, 5, 44, 23, 5, 588, 598, 3, 2, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 44, 23, 2, 591, 592, 7, 64, 2, 2, 592, 598, 3, 2, 2, 2, 593, 594, 7, 4, 2, 2, 594, 595, 5, 44, 23, 2, 595, 596, 7, 5, 2, 2, 596, 598, 3, 2, 2, 2, 597, 448, 3, 2, 2, 2, 597, 450, 3, 2, 2, 2, 597, 457, 3, 2, 2, 2, 597, 459, 3, 2, 2, 2, 597, 464, 3, 2, 2, 2, 597, 479, 3, 2, 2, 2, 597, 494, 3, 2, 2, 2, 597, 495, 3, 2, 2, 2, 597, 510, 3, 2, 2, 2, 597, 529, 3, 2, 2, 2, 597, 531, 3, 2, 2, 2, 597, 547, 3, 2, 2, 2, 597, 549, 3, 2, 2, 2, 597, 563, 3, 2, 2, 2, 597, 578, 3, 2, 2, 2, 597, 586, 3, 2, 2, 2, 597, 589, 3, 2, 2, 2, 597, 593, 3, 2, 2, 2, 598, 648, 3, 2, 2, 2, 599, 600, 12, 28, 2, 2, 600, 601, 7, 33, 2, 2, 601, 647, 5, 44, 23, 28, 602, 603, 12, 26, 2, 2, 603, 604, 9, 2, 2, 2, 604, 647, 5, 44, 23, 27, 605, 606, 12, 25, 2, 2, 606, 607, 9, 3, 2, 2, 607, 647, 5, 44, 23, 26, 608, 609, 12, 24, 2, 2, 609, 610, 9, 4, 2, 2, 610, 647, 5, 44, 23, 25, 611, 612, 12, 22, 2, 2, 612, 613, 7, 62, 2, 2, 613, 614, 5, 44, 23, 23, 614, 615, 8, 23, 1, 2, 615, 647, 3, 2, 2, 2, 616, 617, 12, 20, 2, 2, 617, 618, 7, 45, 2, 2, 618, 647, 5, 44, 23, 21, 619, 620, 12, 18, 2, 2, 620, 621, 7, 46, 2, 2, 621, 647, 5, 44, 23, 19, 622, 623, 12, 17, 2, 2, 623, 624, 7, 47, 2, 2, 624, 647, 5, 44, 23, 18, 625, 626, 12, 16, 2, 2, 626, 627, 7, 48, 2, 2, 627, 647, 5, 44, 23, 17, 628, 629, 12, 9, 2, 2, 629, 630, 7, 28, 2, 2, 630, 647, 5, 44, 23, 10, 631, 632, 12, 32, 2, 2, 632, 633, 7, 24, 2, 2, 633, 639, 5, 74, 38, 2, 634, 636, 7, 63, 2, 2, 635, 637, 5, 68, 35, 2, 636, 635, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 640, 7, 64, 2, 2, 639, 634, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 647, 3, 2, 2, 2, 641, 642, 12, 29, 2, 2, 642, 643, 7, 13, 2, 2, 643, 644, 5, 44, 23, 2, 644, 645, 7, 14, 2, 2, 645, 647, 3, 2, 2, 2, 646, 599, 3, 2, 2, 2, 646, 602, 3, 2, 2, 2, 646, 605, 3, 2, 2, 2, 646, 608, 3, 2, 2, 2, 646, 611, 3, 2, 2, 2, 646, 616, 3, 2, 2, 2, 646, 619, 3, 2, 2, 2, 646, 622, 3, 2, 2, 2, 646, 625, 3, 2, 2, 2, 646, 628, 3, 2, 2, 2, 646, 631, 3, 2, 2, 2, 646, 641, 3, 2, 2, 2, 647, 650, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 45, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 651, 652, 7, 50, 2, 2, 652, 653, 5, 44, 23, 2, 653, 655, 7, 4, 2, 2, 654, 656, 7, 15, 2, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 662, 5, 48, 25, 2, 658, 659, 7, 15, 2, 2, 659, 661, 5, 48, 25, 2, 660, 658, 3, 2, 2, 2, 661, 664, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 665, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 665, 666, 7, 5, 2, 2, 666, 47, 3, 2, 2, 2, 667, 670, 5, 50, 26, 2, 668, 670, 7, 39, 2, 2, 669, 667, 3, 2, 2, 2, 669, 668, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 7, 29, 2, 2, 672, 673, 5, 44, 23, 2, 673, 49, 3, 2, 2, 2, 674, 681, 5, 82, 42, 2, 675, 678, 7, 63, 2, 2, 676, 679, 5, 82, 42, 2, 677, 679, 7, 39, 2, 2, 678, 676, 3, 2, 2, 2, 678, 677, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 682, 7, 64, 2, 2, 681, 675, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 51, 3, 2, 2, 2, 683, 684, 5, 8, 5, 2, 684, 685, 7, 2, 2, 3, 685, 693, 3, 2, 2, 2, 686, 687, 5, 44, 23, 2, 687, 688, 7, 2, 2, 3, 688, 693, 3, 2, 2, 2, 689, 690, 7, 69, 2, 2, 690, 693, 7, 2, 2, 3, 691, 693, 7, 2, 2, 3, 692, 683, 3, 2, 2, 2, 692, 686, 3, 2, 2, 2, 692, 689, 3, 2, 2, 2, 692, 691, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 697, 5, 56, 29, 2, 695, 697, 5, 58, 30, 2, 696, 694, 3, 2, 2, 2, 696, 695, 3, 2, 2, 2, 697, 55, 3, 2, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 29, 2, 2, 700, 701, 5, 44, 23, 2, 701, 716, 3, 2, 2, 2, 702, 703, 7, 63, 2, 2, 703, 708, 5, 62, 32, 2, 704, 705, 7, 10, 2, 2, 705, 707, 5, 62, 32, 2, 706, 704, 3, 2, 2, 2, 707, 710, 3, 2, 2, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 708, 3, 2, 2, 2, 711, 712, 7, 64, 2, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 44, 23, 2, 714, 716, 3, 2, 2, 2, 715, 698, 3, 2, 2, 2, 715, 702, 3, 2, 2, 2, 716, 57, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 719, 7, 63, 2, 2, 719, 722, 5, 62, 32, 2, 720, 721, 7, 10, 2, 2, 721, 723, 5, 62, 32, 2, 722, 720, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 64, 2, 2, 728, 729, 7, 29, 2, 2, 729, 730, 5, 44, 23, 2, 730, 59, 3, 2, 2, 2, 731, 734, 7, 39, 2, 2, 732, 734, 5, 80, 41, 2, 733, 731, 3, 2, 2, 2, 733, 732, 3, 2, 2, 2, 734, 61, 3, 2, 2, 2, 735, 736, 5, 60, 31, 2, 736, 63, 3, 2, 2, 2, 737, 738, 5, 60, 31, 2, 738, 739, 7, 7, 2, 2, 739, 740, 5, 36, 19, 2, 740, 65, 3, 2, 2, 2, 741, 744, 7, 53, 2, 2, 742, 744, 5, 80, 41, 2, 743, 741, 3, 2, 2, 2, 743, 742, 3, 2, 2, 2, 744, 67, 3, 2, 2, 2, 745, 750, 5, 44, 23, 2, 746, 747, 7, 10, 2, 2, 747, 749, 5, 44, 23, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 69, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 754, 5, 82, 42, 2, 754, 755, 7, 7, 2, 2, 755, 756, 5, 44, 23, 2, 756, 760, 3, 2, 2, 2, 757, 758, 7, 40, 2, 2, 758, 760, 5, 44, 23, 2, 759, 753, 3, 2, 2, 2, 759, 757, 3, 2, 2, 2, 760, 71, 3, 2, 2, 2, 761, 764, 5, 80, 41, 2, 762, 764, 9, 5, 2, 2, 763, 761, 3, 2, 2, 2, 763, 762, 3, 2, 2, 2, 764, 73, 3, 2, 2, 2, 765, 768, 5, 80, 41, 2, 766, 768, 9, 6, 2, 2, 767, 765, 3, 2, 2, 2, 767, 766, 3, 2, 2, 2, 768, 75, 3, 2, 2, 2, 769, 770, 9, 7, 2, 2, 770, 77, 3, 2, 2, 2, 771, 772, 9, 8, 2, 2, 772, 79, 3, 2, 2, 2, 773, 778, 5, 84, 43, 2, 774, 775, 7, 41, 2, 2, 775, 777, 5, 84, 43, 2, 776, 774, 3, 2, 2, 2, 777, 780, 3, 2, 2, 2, 778, 776, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 81, 3, 2, 2, 2, 780, 778, 3, 2, 2, 2, 781, 786, 5, 84, 43, 2, 782, 783, 5, 80, 41, 2, 783, 784, 8, 42, 1, 2, 784, 786, 3, 2, 2, 2, 785, 781, 3, 2, 2, 2, 785, 782, 3, 2, 2, 2, 786, 83, 3, 2, 2, 2, 787, 788, 9, 9, 2, 2, 788, 85, 3, 2, 2, 2, 88, 89, 96, 105, 113, 138, 148, 156, 159, 169, 172, 175, 179, 183, 186, 188, 202, 211, 215, 218, 225, 233, 245, 253, 259, 263, 265, 276, 278, 293, 301, 316, 324, 326, 343, 346, 349, 374, 378, 384, 403, 408, 416, 418, 434, 440, 444, 453, 471, 475, 486, 490, 502, 506, 517, 521, 529, 539, 543, 555, 559, 569, 572, 575, 597, 636, 639, 646, 648, 655, 662, 669, 678, 681, 692, 696, 708, 715, 724, 733, 743, 750, 759, 763, 767, 778, 785] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index c8362598c..1d1d2dd5d 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -81,13 +81,13 @@ WS=70 '['=11 ']'=12 '|'=13 -'nondet'=14 -'val'=15 -'def'=16 -'pure'=17 -'action'=18 -'run'=19 -'temporal'=20 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 'import'=21 '.'=22 'from'=23 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index b90ce839c..2e082080a 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -13,13 +13,13 @@ null '[' ']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -224,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 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, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 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, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 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, 303, 10, 41, 12, 41, 14, 41, 306, 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, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 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, 49, 3, 50, 3, 50, 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, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 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, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 195, 3, 2, 2, 2, 33, 199, 3, 2, 2, 2, 35, 203, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 215, 3, 2, 2, 2, 41, 219, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 112, 2, 2, 189, 190, 7, 113, 2, 2, 190, 191, 7, 112, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 118, 2, 2, 194, 30, 3, 2, 2, 2, 195, 196, 7, 120, 2, 2, 196, 197, 7, 99, 2, 2, 197, 198, 7, 110, 2, 2, 198, 32, 3, 2, 2, 2, 199, 200, 7, 102, 2, 2, 200, 201, 7, 103, 2, 2, 201, 202, 7, 104, 2, 2, 202, 34, 3, 2, 2, 2, 203, 204, 7, 114, 2, 2, 204, 205, 7, 119, 2, 2, 205, 206, 7, 116, 2, 2, 206, 207, 7, 103, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 118, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 113, 2, 2, 213, 214, 7, 112, 2, 2, 214, 38, 3, 2, 2, 2, 215, 216, 7, 116, 2, 2, 216, 217, 7, 119, 2, 2, 217, 218, 7, 112, 2, 2, 218, 40, 3, 2, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 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, 99, 2, 2, 226, 227, 7, 110, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 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, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 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, 303, 10, 41, 12, 41, 14, 41, 306, 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, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 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, 49, 3, 50, 3, 50, 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, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 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, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 192, 3, 2, 2, 2, 33, 196, 3, 2, 2, 2, 35, 201, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 212, 3, 2, 2, 2, 41, 221, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 120, 2, 2, 189, 190, 7, 99, 2, 2, 190, 191, 7, 110, 2, 2, 191, 30, 3, 2, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 7, 103, 2, 2, 194, 195, 7, 104, 2, 2, 195, 32, 3, 2, 2, 2, 196, 197, 7, 114, 2, 2, 197, 198, 7, 119, 2, 2, 198, 199, 7, 116, 2, 2, 199, 200, 7, 103, 2, 2, 200, 34, 3, 2, 2, 2, 201, 202, 7, 99, 2, 2, 202, 203, 7, 101, 2, 2, 203, 204, 7, 118, 2, 2, 204, 205, 7, 107, 2, 2, 205, 206, 7, 113, 2, 2, 206, 207, 7, 112, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 116, 2, 2, 209, 210, 7, 119, 2, 2, 210, 211, 7, 112, 2, 2, 211, 38, 3, 2, 2, 2, 212, 213, 7, 118, 2, 2, 213, 214, 7, 103, 2, 2, 214, 215, 7, 111, 2, 2, 215, 216, 7, 114, 2, 2, 216, 217, 7, 113, 2, 2, 217, 218, 7, 116, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 110, 2, 2, 220, 40, 3, 2, 2, 2, 221, 222, 7, 112, 2, 2, 222, 223, 7, 113, 2, 2, 223, 224, 7, 112, 2, 2, 224, 225, 7, 102, 2, 2, 225, 226, 7, 103, 2, 2, 226, 227, 7, 118, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 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 c8362598c..1d1d2dd5d 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -81,13 +81,13 @@ WS=70 '['=11 ']'=12 '|'=13 -'nondet'=14 -'val'=15 -'def'=16 -'pure'=17 -'action'=18 -'run'=19 -'temporal'=20 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 'import'=21 '.'=22 'from'=23 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index 21060e0dd..dc195ec27 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -117,8 +117,8 @@ 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'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", @@ -184,10 +184,10 @@ export class QuintLexer extends Lexer { "\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\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\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\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11" + + "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + @@ -246,9 +246,9 @@ export class QuintLexer extends Lexer { "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + - "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC3\x03\x02\x02\x02!\xC7\x03\x02\x02" + - "\x02#\xCB\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD7\x03\x02\x02\x02)" + - "\xDB\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC0\x03\x02\x02\x02!\xC4\x03\x02\x02" + + "\x02#\xC9\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD4\x03\x02\x02\x02)" + + "\xDD\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + @@ -279,29 +279,29 @@ export class QuintLexer extends Lexer { "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + - "\x07p\x02\x02\xBD\xBE\x07q\x02\x02\xBE\xBF\x07p\x02\x02\xBF\xC0\x07f\x02" + - "\x02\xC0\xC1\x07g\x02\x02\xC1\xC2\x07v\x02\x02\xC2\x1E\x03\x02\x02\x02" + - "\xC3\xC4\x07x\x02\x02\xC4\xC5\x07c\x02\x02\xC5\xC6\x07n\x02\x02\xC6 \x03" + - "\x02\x02\x02\xC7\xC8\x07f\x02\x02\xC8\xC9\x07g\x02\x02\xC9\xCA\x07h\x02" + - "\x02\xCA\"\x03\x02\x02\x02\xCB\xCC\x07r\x02\x02\xCC\xCD\x07w\x02\x02\xCD" + - "\xCE\x07t\x02\x02\xCE\xCF\x07g\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1\x07" + - "c\x02\x02\xD1\xD2\x07e\x02\x02\xD2\xD3\x07v\x02\x02\xD3\xD4\x07k\x02\x02" + - "\xD4\xD5\x07q\x02\x02\xD5\xD6\x07p\x02\x02\xD6&\x03\x02\x02\x02\xD7\xD8" + - "\x07t\x02\x02\xD8\xD9\x07w\x02\x02\xD9\xDA\x07p\x02\x02\xDA(\x03\x02\x02" + - "\x02\xDB\xDC\x07v\x02\x02\xDC\xDD\x07g\x02\x02\xDD\xDE\x07o\x02\x02\xDE" + - "\xDF\x07r\x02\x02\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07" + - "c\x02\x02\xE2\xE3\x07n\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02\x02" + - "\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9" + - "\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x070\x02" + - "\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02\xEF" + - "\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3\x07" + - "c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02\x02" + - "\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9\xFA" + - "\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07/\x02" + - "\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02\x02" + - "\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02" + - "\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02" + - "\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07x\x02\x02\xBD\xBE\x07c\x02\x02\xBE\xBF\x07n\x02\x02\xBF\x1E\x03\x02" + + "\x02\x02\xC0\xC1\x07f\x02\x02\xC1\xC2\x07g\x02\x02\xC2\xC3\x07h\x02\x02" + + "\xC3 \x03\x02\x02\x02\xC4\xC5\x07r\x02\x02\xC5\xC6\x07w\x02\x02\xC6\xC7" + + "\x07t\x02\x02\xC7\xC8\x07g\x02\x02\xC8\"\x03\x02\x02\x02\xC9\xCA\x07c" + + "\x02\x02\xCA\xCB\x07e\x02\x02\xCB\xCC\x07v\x02\x02\xCC\xCD\x07k\x02\x02" + + "\xCD\xCE\x07q\x02\x02\xCE\xCF\x07p\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1" + + "\x07t\x02\x02\xD1\xD2\x07w\x02\x02\xD2\xD3\x07p\x02\x02\xD3&\x03\x02\x02" + + "\x02\xD4\xD5\x07v\x02\x02\xD5\xD6\x07g\x02\x02\xD6\xD7\x07o\x02\x02\xD7" + + "\xD8\x07r\x02\x02\xD8\xD9\x07q\x02\x02\xD9\xDA\x07t\x02\x02\xDA\xDB\x07" + + "c\x02\x02\xDB\xDC\x07n\x02\x02\xDC(\x03\x02\x02\x02\xDD\xDE\x07p\x02\x02" + + "\xDE\xDF\x07q\x02\x02\xDF\xE0\x07p\x02\x02\xE0\xE1\x07f\x02\x02\xE1\xE2" + + "\x07g\x02\x02\xE2\xE3\x07v\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02" + + "\x02\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8" + + "\xE9\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x07" + + "0\x02\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02" + + "\xEF\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3" + + "\x07c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02" + + "\x02\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9" + + "\xFA\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07" + + "/\x02\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02" + + "\x02\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k" + + "\x02\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03" + + "\x02\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 794ecca5c..6c4ff86c6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -54,7 +54,6 @@ import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; import { AnnotatedOperDefContext } from "./QuintParser"; @@ -76,7 +75,6 @@ import { TypeDefContext } from "./QuintParser"; import { TypeDefHeadContext } from "./QuintParser"; import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -702,19 +700,6 @@ export interface QuintListener extends ParseTreeListener { */ exitLetIn?: (ctx: LetInContext) => void; - /** - * Enter a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - enterNondet?: (ctx: NondetContext) => void; - /** - * Exit a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - exitNondet?: (ctx: NondetContext) => void; - /** * Enter a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. @@ -970,17 +955,6 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeSumVariant?: (ctx: TypeSumVariantContext) => void; - /** - * Enter a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - */ - enterNondetOperDef?: (ctx: NondetOperDefContext) => void; - /** - * Exit a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - */ - exitNondetOperDef?: (ctx: NondetOperDefContext) => void; - /** * Enter a parse tree produced by `QuintParser.qualifier`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 0d88c2494..c4a7d6f24 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -113,56 +113,55 @@ export class QuintParser extends Parser { public static readonly RULE_typeDefHead = 6; public static readonly RULE_sumTypeDefinition = 7; public static readonly RULE_typeSumVariant = 8; - public static readonly RULE_nondetOperDef = 9; - public static readonly RULE_qualifier = 10; - public static readonly RULE_importMod = 11; - public static readonly RULE_exportMod = 12; - public static readonly RULE_instanceMod = 13; - public static readonly RULE_moduleName = 14; - public static readonly RULE_name = 15; - public static readonly RULE_qualifiedName = 16; - public static readonly RULE_fromSource = 17; - public static readonly RULE_type = 18; - public static readonly RULE_typeVar = 19; - public static readonly RULE_row = 20; - public static readonly RULE_rowLabel = 21; - public static readonly RULE_expr = 22; - public static readonly RULE_matchSumExpr = 23; - public static readonly RULE_matchSumCase = 24; - public static readonly RULE_matchSumVariant = 25; - public static readonly RULE_declarationOrExpr = 26; - public static readonly RULE_lambda = 27; - public static readonly RULE_lambdaUnsugared = 28; - public static readonly RULE_lambdaTupleSugar = 29; - public static readonly RULE_identOrHole = 30; - public static readonly RULE_parameter = 31; - public static readonly RULE_annotatedParameter = 32; - public static readonly RULE_identOrStar = 33; - public static readonly RULE_argList = 34; - public static readonly RULE_recElem = 35; - public static readonly RULE_normalCallName = 36; - public static readonly RULE_nameAfterDot = 37; - public static readonly RULE_operator = 38; - public static readonly RULE_literal = 39; - public static readonly RULE_qualId = 40; - public static readonly RULE_simpleId = 41; - public static readonly RULE_identifier = 42; + public static readonly RULE_qualifier = 9; + public static readonly RULE_importMod = 10; + public static readonly RULE_exportMod = 11; + public static readonly RULE_instanceMod = 12; + public static readonly RULE_moduleName = 13; + public static readonly RULE_name = 14; + public static readonly RULE_qualifiedName = 15; + public static readonly RULE_fromSource = 16; + public static readonly RULE_type = 17; + public static readonly RULE_typeVar = 18; + public static readonly RULE_row = 19; + public static readonly RULE_rowLabel = 20; + public static readonly RULE_expr = 21; + public static readonly RULE_matchSumExpr = 22; + public static readonly RULE_matchSumCase = 23; + public static readonly RULE_matchSumVariant = 24; + public static readonly RULE_declarationOrExpr = 25; + public static readonly RULE_lambda = 26; + public static readonly RULE_lambdaUnsugared = 27; + public static readonly RULE_lambdaTupleSugar = 28; + public static readonly RULE_identOrHole = 29; + public static readonly RULE_parameter = 30; + public static readonly RULE_annotatedParameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "nondetOperDef", - "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", - "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", - "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", - "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", - "annotatedParameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "qualifier", + "importMod", "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", + "fromSource", "type", "typeVar", "row", "rowLabel", "expr", "matchSumExpr", + "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", + "lambdaTupleSugar", "identOrHole", "parameter", "annotatedParameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", - "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", @@ -215,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 87; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 86; + this.state = 84; this.module(); } } - this.state = 89; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 91; + this.state = 89; this.match(QuintParser.EOF); } } @@ -255,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 96; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 93; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 98; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 99; + this.state = 97; this.match(QuintParser.T__0); - this.state = 100; + this.state = 98; this.qualId(); - this.state = 101; + this.state = 99; this.match(QuintParser.T__1); - this.state = 105; + this.state = 103; 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__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 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__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 102; + this.state = 100; this.documentedDeclaration(); } } - this.state = 107; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 108; + this.state = 106; this.match(QuintParser.T__2); } } @@ -315,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 113; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 110; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 115; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 116; + this.state = 114; this.declaration(); } } @@ -352,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 138; + this.state = 136; 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 = 118; + this.state = 116; this.match(QuintParser.T__3); - this.state = 119; + this.state = 117; this.qualId(); - this.state = 120; + this.state = 118; this.match(QuintParser.T__4); - this.state = 121; + this.state = 119; this.type(0); } break; @@ -374,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 123; + this.state = 121; this.match(QuintParser.T__5); - this.state = 124; + this.state = 122; this.qualId(); - this.state = 125; + this.state = 123; this.match(QuintParser.T__4); - this.state = 126; + this.state = 124; this.type(0); } break; @@ -389,15 +388,15 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 128; + this.state = 126; this.match(QuintParser.T__6); { - this.state = 129; + this.state = 127; (_localctx as AssumeContext)._assumeName = this.identOrHole(); } - this.state = 130; + this.state = 128; this.match(QuintParser.ASGN); - this.state = 131; + this.state = 129; this.expr(0); } break; @@ -406,7 +405,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 133; + this.state = 131; this.instanceMod(); } break; @@ -415,7 +414,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 134; + this.state = 132; this.operDef(); } break; @@ -424,7 +423,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 135; + this.state = 133; this.typeDef(); } break; @@ -433,7 +432,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 136; + this.state = 134; this.importMod(); } break; @@ -442,7 +441,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 137; + this.state = 135; this.exportMod(); } break; @@ -468,65 +467,65 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.state = 188; + this.state = 186; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new AnnotatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 140; + this.state = 138; this.qualifier(); - this.state = 141; + this.state = 139; this.normalCallName(); - this.state = 142; + this.state = 140; this.match(QuintParser.LPAREN); { - this.state = 143; + this.state = 141; (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); - this.state = 148; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 144; + this.state = 142; this.match(QuintParser.T__7); - this.state = 145; + this.state = 143; (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); } } - this.state = 150; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 151; + this.state = 149; this.match(QuintParser.RPAREN); - this.state = 152; + this.state = 150; this.match(QuintParser.T__4); - this.state = 153; + this.state = 151; this.type(0); - this.state = 156; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 154; + this.state = 152; this.match(QuintParser.ASGN); - this.state = 155; + this.state = 153; this.expr(0); } } - this.state = 159; + this.state = 157; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 158; + this.state = 156; this.match(QuintParser.T__8); } } @@ -538,80 +537,80 @@ export class QuintParser extends Parser { _localctx = new DeprecatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 161; + this.state = 159; this.qualifier(); - this.state = 162; + this.state = 160; this.normalCallName(); - this.state = 175; + this.state = 173; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { case 1: { - this.state = 163; + this.state = 161; this.match(QuintParser.LPAREN); - this.state = 172; + this.state = 170; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 164; + this.state = 162; (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); - this.state = 169; + this.state = 167; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 165; + this.state = 163; this.match(QuintParser.T__7); - this.state = 166; + this.state = 164; (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); } } - this.state = 171; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 174; + this.state = 172; this.match(QuintParser.RPAREN); } break; } - this.state = 179; + this.state = 177; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 177; + this.state = 175; this.match(QuintParser.T__4); - this.state = 178; + this.state = 176; (_localctx as DeprecatedOperDefContext)._annotatedRetType = this.type(0); } } - this.state = 183; + this.state = 181; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 181; + this.state = 179; this.match(QuintParser.ASGN); - this.state = 182; + this.state = 180; this.expr(0); } } - this.state = 186; + this.state = 184; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 185; + this.state = 183; this.match(QuintParser.T__8); } } @@ -639,16 +638,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 202; + this.state = 200; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 190; + this.state = 188; this.match(QuintParser.T__9); - this.state = 191; + this.state = 189; this.qualId(); } break; @@ -657,13 +656,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 192; + this.state = 190; this.match(QuintParser.T__9); - this.state = 193; + this.state = 191; this.typeDefHead(); - this.state = 194; + this.state = 192; this.match(QuintParser.ASGN); - this.state = 195; + this.state = 193; this.type(0); } break; @@ -672,13 +671,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 197; + this.state = 195; this.match(QuintParser.T__9); - this.state = 198; + this.state = 196; this.typeDefHead(); - this.state = 199; + this.state = 197; this.match(QuintParser.ASGN); - this.state = 200; + this.state = 198; this.sumTypeDefinition(); } break; @@ -706,36 +705,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 204; + this.state = 202; _localctx._typeName = this.qualId(); - this.state = 215; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 205; + this.state = 203; this.match(QuintParser.T__10); - this.state = 206; + this.state = 204; _localctx._LOW_ID = this.match(QuintParser.LOW_ID); _localctx._typeVars.push(_localctx._LOW_ID); - this.state = 211; + this.state = 209; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 207; + this.state = 205; this.match(QuintParser.T__7); - this.state = 208; + this.state = 206; _localctx._LOW_ID = this.match(QuintParser.LOW_ID); _localctx._typeVars.push(_localctx._LOW_ID); } } - this.state = 213; + this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 214; + this.state = 212; this.match(QuintParser.T__11); } } @@ -764,31 +763,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 218; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 217; + this.state = 215; this.match(QuintParser.T__12); } } - this.state = 220; + this.state = 218; this.typeSumVariant(); - this.state = 225; + this.state = 223; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 221; + this.state = 219; this.match(QuintParser.T__12); - this.state = 222; + this.state = 220; this.typeSumVariant(); } } - this.state = 227; + this.state = 225; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -816,18 +815,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 228; + this.state = 226; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 233; + this.state = 231; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 229; + this.state = 227; this.match(QuintParser.LPAREN); - this.state = 230; + this.state = 228; this.type(0); - this.state = 231; + this.state = 229; this.match(QuintParser.RPAREN); } } @@ -849,123 +848,77 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) - public nondetOperDef(): NondetOperDefContext { - let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_nondetOperDef); - let _la: number; - try { - this.enterOuterAlt(_localctx, 1); - { - this.state = 235; - this.match(QuintParser.T__13); - this.state = 236; - this.qualId(); - this.state = 239; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__4) { - { - this.state = 237; - this.match(QuintParser.T__4); - this.state = 238; - this.type(0); - } - } - - this.state = 241; - this.match(QuintParser.ASGN); - this.state = 242; - this.expr(0); - this.state = 244; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 243; - this.match(QuintParser.T__8); - } - } - - } - } - 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 qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 18, QuintParser.RULE_qualifier); try { - this.state = 255; + this.state = 243; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 246; - this.match(QuintParser.T__14); + this.state = 233; + this.match(QuintParser.T__13); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 247; - this.match(QuintParser.T__15); + this.state = 234; + this.match(QuintParser.T__14); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 248; - this.match(QuintParser.T__16); - this.state = 249; - this.match(QuintParser.T__14); + this.state = 235; + this.match(QuintParser.T__15); + this.state = 236; + this.match(QuintParser.T__13); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 250; - this.match(QuintParser.T__16); - this.state = 251; + this.state = 237; this.match(QuintParser.T__15); + this.state = 238; + this.match(QuintParser.T__14); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 252; - this.match(QuintParser.T__17); + this.state = 239; + this.match(QuintParser.T__16); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 253; - this.match(QuintParser.T__18); + this.state = 240; + this.match(QuintParser.T__17); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 254; + this.state = 241; + this.match(QuintParser.T__18); + } + break; + + case 8: + this.enterOuterAlt(_localctx, 8); + { + this.state = 242; this.match(QuintParser.T__19); } break; @@ -988,31 +941,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_importMod); + this.enterRule(_localctx, 20, QuintParser.RULE_importMod); let _la: number; try { - this.state = 275; + this.state = 263; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 25, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 257; + this.state = 245; this.match(QuintParser.T__20); - this.state = 258; + this.state = 246; this.name(); - this.state = 259; + this.state = 247; this.match(QuintParser.T__21); - this.state = 260; + this.state = 248; this.identOrStar(); - this.state = 263; + this.state = 251; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 261; + this.state = 249; this.match(QuintParser.T__22); - this.state = 262; + this.state = 250; this.fromSource(); } } @@ -1023,30 +976,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 265; + this.state = 253; this.match(QuintParser.T__20); - this.state = 266; + this.state = 254; this.name(); - this.state = 269; + this.state = 257; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 267; + this.state = 255; this.match(QuintParser.T__23); - this.state = 268; + this.state = 256; this.name(); } } - this.state = 273; + this.state = 261; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 271; + this.state = 259; this.match(QuintParser.T__22); - this.state = 272; + this.state = 260; this.fromSource(); } } @@ -1072,22 +1025,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 22, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 288; + this.state = 276; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 277; + this.state = 265; this.match(QuintParser.T__24); - this.state = 278; + this.state = 266; this.name(); - this.state = 279; + this.state = 267; this.match(QuintParser.T__21); - this.state = 280; + this.state = 268; this.identOrStar(); } break; @@ -1095,18 +1048,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 282; + this.state = 270; this.match(QuintParser.T__24); - this.state = 283; + this.state = 271; this.name(); - this.state = 286; + this.state = 274; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 284; + this.state = 272; this.match(QuintParser.T__23); - this.state = 285; + this.state = 273; this.name(); } } @@ -1132,63 +1085,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 24, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 336; + this.state = 324; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 32, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 290; + this.state = 278; this.match(QuintParser.T__20); - this.state = 291; + this.state = 279; this.moduleName(); - this.state = 292; + this.state = 280; this.match(QuintParser.LPAREN); { - this.state = 293; + this.state = 281; this.name(); - this.state = 294; + this.state = 282; this.match(QuintParser.ASGN); - this.state = 295; + this.state = 283; this.expr(0); - this.state = 303; + this.state = 291; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 296; + this.state = 284; this.match(QuintParser.T__7); - this.state = 297; + this.state = 285; this.name(); - this.state = 298; + this.state = 286; this.match(QuintParser.ASGN); - this.state = 299; + this.state = 287; this.expr(0); } } - this.state = 305; + this.state = 293; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 306; + this.state = 294; this.match(QuintParser.RPAREN); - this.state = 307; + this.state = 295; this.match(QuintParser.T__21); - this.state = 308; + this.state = 296; this.match(QuintParser.MUL); - this.state = 311; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 309; + this.state = 297; this.match(QuintParser.T__22); - this.state = 310; + this.state = 298; this.fromSource(); } } @@ -1199,54 +1152,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 313; + this.state = 301; this.match(QuintParser.T__20); - this.state = 314; + this.state = 302; this.moduleName(); - this.state = 315; + this.state = 303; this.match(QuintParser.LPAREN); { - this.state = 316; + this.state = 304; this.name(); - this.state = 317; + this.state = 305; this.match(QuintParser.ASGN); - this.state = 318; + this.state = 306; this.expr(0); - this.state = 326; + this.state = 314; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 319; + this.state = 307; this.match(QuintParser.T__7); - this.state = 320; + this.state = 308; this.name(); - this.state = 321; + this.state = 309; this.match(QuintParser.ASGN); - this.state = 322; + this.state = 310; this.expr(0); } } - this.state = 328; + this.state = 316; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 329; + this.state = 317; this.match(QuintParser.RPAREN); - this.state = 330; + this.state = 318; this.match(QuintParser.T__23); - this.state = 331; + this.state = 319; this.qualifiedName(); - this.state = 334; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 332; + this.state = 320; this.match(QuintParser.T__22); - this.state = 333; + this.state = 321; this.fromSource(); } } @@ -1272,11 +1225,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 26, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 338; + this.state = 326; this.qualId(); } } @@ -1297,11 +1250,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_name); + this.enterRule(_localctx, 28, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 340; + this.state = 328; this.qualId(); } } @@ -1322,11 +1275,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 32, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 30, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 342; + this.state = 330; this.qualId(); } } @@ -1347,11 +1300,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 32, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 344; + this.state = 332; this.match(QuintParser.STRING); } } @@ -1382,67 +1335,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 = 36; - this.enterRecursionRule(_localctx, 36, QuintParser.RULE_type, _p); + let _startState: number = 34; + this.enterRecursionRule(_localctx, 34, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 418; + this.state = 406; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 347; + this.state = 335; this.match(QuintParser.LPAREN); - this.state = 356; + this.state = 344; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 348; + this.state = 336; this.type(0); - this.state = 353; + this.state = 341; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 349; + this.state = 337; this.match(QuintParser.T__7); - this.state = 350; + this.state = 338; this.type(0); } } } - this.state = 355; + this.state = 343; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } } } - this.state = 359; + this.state = 347; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 358; + this.state = 346; this.match(QuintParser.T__7); } } - this.state = 361; + this.state = 349; this.match(QuintParser.RPAREN); - this.state = 362; + this.state = 350; this.match(QuintParser.T__26); - this.state = 363; + this.state = 351; this.type(13); } break; @@ -1452,13 +1405,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 352; this.match(QuintParser.SET); - this.state = 365; + this.state = 353; this.match(QuintParser.T__10); - this.state = 366; + this.state = 354; this.type(0); - this.state = 367; + this.state = 355; this.match(QuintParser.T__11); } break; @@ -1468,13 +1421,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 357; this.match(QuintParser.LIST); - this.state = 370; + this.state = 358; this.match(QuintParser.T__10); - this.state = 371; + this.state = 359; this.type(0); - this.state = 372; + this.state = 360; this.match(QuintParser.T__11); } break; @@ -1484,9 +1437,9 @@ export class QuintParser extends Parser { _localctx = new TypeUnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 374; + this.state = 362; this.match(QuintParser.LPAREN); - this.state = 375; + this.state = 363; this.match(QuintParser.RPAREN); } break; @@ -1496,43 +1449,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 376; + this.state = 364; this.match(QuintParser.LPAREN); - this.state = 377; + this.state = 365; this.type(0); - this.state = 378; + this.state = 366; this.match(QuintParser.T__7); - this.state = 379; + this.state = 367; this.type(0); - this.state = 384; + this.state = 372; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 380; + this.state = 368; this.match(QuintParser.T__7); - this.state = 381; + this.state = 369; this.type(0); } } } - this.state = 386; + this.state = 374; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); } - this.state = 388; + this.state = 376; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 387; + this.state = 375; this.match(QuintParser.T__7); } } - this.state = 390; + this.state = 378; this.match(QuintParser.RPAREN); } break; @@ -1542,19 +1495,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 392; + this.state = 380; this.match(QuintParser.T__1); - this.state = 394; + this.state = 382; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 393; + this.state = 381; this.row(); } } - this.state = 396; + this.state = 384; this.match(QuintParser.T__2); } break; @@ -1564,7 +1517,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 385; this.match(QuintParser.T__27); } break; @@ -1574,7 +1527,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 386; this.match(QuintParser.T__28); } break; @@ -1584,7 +1537,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 387; this.match(QuintParser.T__29); } break; @@ -1594,7 +1547,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 388; this.typeVar(); } break; @@ -1604,7 +1557,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 389; this.qualId(); } break; @@ -1614,11 +1567,11 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 402; + this.state = 390; this.match(QuintParser.LPAREN); - this.state = 403; + this.state = 391; this.type(0); - this.state = 404; + this.state = 392; this.match(QuintParser.RPAREN); } break; @@ -1628,41 +1581,41 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 406; + this.state = 394; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 407; + this.state = 395; this.match(QuintParser.T__10); - this.state = 408; + this.state = 396; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 413; + this.state = 401; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 409; + this.state = 397; this.match(QuintParser.T__7); - this.state = 410; + this.state = 398; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 415; + this.state = 403; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 416; + this.state = 404; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 428; + this.state = 416; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1670,20 +1623,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 426; + this.state = 414; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 420; + this.state = 408; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 421; + this.state = 409; this.match(QuintParser.T__25); - this.state = 422; + this.state = 410; this.type(15); } break; @@ -1692,22 +1645,22 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 423; + this.state = 411; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 424; + this.state = 412; this.match(QuintParser.T__26); - this.state = 425; + this.state = 413; this.type(14); } break; } } } - this.state = 430; + this.state = 418; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } } } @@ -1728,11 +1681,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeVar(): TypeVarContext { let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); - this.enterRule(_localctx, 38, QuintParser.RULE_typeVar); + this.enterRule(_localctx, 36, QuintParser.RULE_typeVar); try { this.enterOuterAlt(_localctx, 1); { - this.state = 431; + this.state = 419; this.match(QuintParser.LOW_ID); } } @@ -1753,10 +1706,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_row); + this.enterRule(_localctx, 38, QuintParser.RULE_row); try { let _alt: number; - this.state = 454; + this.state = 442; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1764,50 +1717,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 433; + this.state = 421; this.rowLabel(); - this.state = 434; + this.state = 422; this.match(QuintParser.T__4); - this.state = 435; + this.state = 423; this.type(0); } - this.state = 444; + this.state = 432; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 437; + this.state = 425; this.match(QuintParser.T__7); - this.state = 438; + this.state = 426; this.rowLabel(); - this.state = 439; + this.state = 427; this.match(QuintParser.T__4); - this.state = 440; + this.state = 428; this.type(0); } } } - this.state = 446; + this.state = 434; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } - this.state = 450; + this.state = 438; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 447; + this.state = 435; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 448; + this.state = 436; this.match(QuintParser.T__12); { - this.state = 449; + this.state = 437; _localctx._rowVar = this.identifier(); } } @@ -1822,10 +1775,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 452; + this.state = 440; this.match(QuintParser.T__12); { - this.state = 453; + this.state = 441; _localctx._rowVar = this.identifier(); } } @@ -1851,11 +1804,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 40, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 456; + this.state = 444; this.simpleId("record"); } } @@ -1886,23 +1839,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 = 44; - this.enterRecursionRule(_localctx, 44, QuintParser.RULE_expr, _p); + let _startState: number = 42; + this.enterRecursionRule(_localctx, 42, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 610; + this.state = 595; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 63, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 459; + this.state = 447; this.lambda(); } break; @@ -1912,21 +1865,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 460; + this.state = 448; this.normalCallName(); - this.state = 461; + this.state = 449; this.match(QuintParser.LPAREN); - this.state = 463; + this.state = 451; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 462; + this.state = 450; this.argList(); } } - this.state = 465; + this.state = 453; this.match(QuintParser.RPAREN); } break; @@ -1936,10 +1889,10 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 467; + this.state = 455; this.match(QuintParser.MINUS); - this.state = 468; - this.expr(26); + this.state = 456; + this.expr(25); } break; @@ -1948,14 +1901,14 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 469; + this.state = 457; this.qualId(); - this.state = 470; + this.state = 458; this.match(QuintParser.T__31); - this.state = 471; + this.state = 459; this.match(QuintParser.ASGN); - this.state = 472; - this.expr(22); + this.state = 460; + this.expr(21); } break; @@ -1964,41 +1917,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 474; + this.state = 462; this.match(QuintParser.AND); - this.state = 475; + this.state = 463; this.match(QuintParser.T__1); - this.state = 476; + this.state = 464; this.expr(0); - this.state = 481; + this.state = 469; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 477; + this.state = 465; this.match(QuintParser.T__7); - this.state = 478; + this.state = 466; this.expr(0); } } } - this.state = 483; + this.state = 471; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); } - this.state = 485; + this.state = 473; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 484; + this.state = 472; this.match(QuintParser.T__7); } } - this.state = 487; + this.state = 475; this.match(QuintParser.T__2); } break; @@ -2008,41 +1961,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 489; + this.state = 477; this.match(QuintParser.OR); - this.state = 490; + this.state = 478; this.match(QuintParser.T__1); - this.state = 491; + this.state = 479; this.expr(0); - this.state = 496; + this.state = 484; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 492; + this.state = 480; this.match(QuintParser.T__7); - this.state = 493; + this.state = 481; this.expr(0); } } } - this.state = 498; + this.state = 486; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 500; + this.state = 488; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 499; + this.state = 487; this.match(QuintParser.T__7); } } - this.state = 502; + this.state = 490; this.match(QuintParser.T__2); } break; @@ -2052,7 +2005,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 504; + this.state = 492; this.matchSumExpr(); } break; @@ -2062,41 +2015,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 505; + this.state = 493; this.match(QuintParser.T__32); - this.state = 506; + this.state = 494; this.match(QuintParser.T__1); - this.state = 507; + this.state = 495; this.expr(0); - this.state = 512; + this.state = 500; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 508; + this.state = 496; this.match(QuintParser.T__7); - this.state = 509; + this.state = 497; this.expr(0); } } } - this.state = 514; + this.state = 502; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 516; + this.state = 504; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 515; + this.state = 503; this.match(QuintParser.T__7); } } - this.state = 518; + this.state = 506; this.match(QuintParser.T__2); } break; @@ -2106,41 +2059,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 520; + this.state = 508; this.match(QuintParser.T__33); - this.state = 521; + this.state = 509; this.match(QuintParser.T__1); - this.state = 522; + this.state = 510; this.expr(0); - this.state = 527; + this.state = 515; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 523; + this.state = 511; this.match(QuintParser.T__7); - this.state = 524; + this.state = 512; this.expr(0); } } } - this.state = 529; + this.state = 517; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 531; + this.state = 519; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 530; + this.state = 518; this.match(QuintParser.T__7); } } - this.state = 533; + this.state = 521; this.match(QuintParser.T__2); } break; @@ -2150,31 +2103,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 539; + this.state = 527; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 535; + this.state = 523; this.qualId(); } break; case QuintParser.INT: { - this.state = 536; + this.state = 524; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 537; + this.state = 525; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 538; + this.state = 526; this.match(QuintParser.STRING); } break; @@ -2189,43 +2142,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 541; + this.state = 529; this.match(QuintParser.LPAREN); - this.state = 542; + this.state = 530; this.expr(0); - this.state = 543; + this.state = 531; this.match(QuintParser.T__7); - this.state = 544; + this.state = 532; this.expr(0); - this.state = 549; + this.state = 537; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 545; + this.state = 533; this.match(QuintParser.T__7); - this.state = 546; + this.state = 534; this.expr(0); } } } - this.state = 551; + this.state = 539; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); } - this.state = 553; + this.state = 541; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 552; + this.state = 540; this.match(QuintParser.T__7); } } - this.state = 555; + this.state = 543; this.match(QuintParser.RPAREN); } break; @@ -2235,9 +2188,9 @@ export class QuintParser extends Parser { _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 557; + this.state = 545; this.match(QuintParser.LPAREN); - this.state = 558; + this.state = 546; this.match(QuintParser.RPAREN); } break; @@ -2247,39 +2200,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 547; this.match(QuintParser.T__1); - this.state = 560; + this.state = 548; this.recElem(); - this.state = 565; + this.state = 553; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 561; + this.state = 549; this.match(QuintParser.T__7); - this.state = 562; + this.state = 550; this.recElem(); } } } - this.state = 567; + this.state = 555; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 569; + this.state = 557; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 568; + this.state = 556; this.match(QuintParser.T__7); } } - this.state = 571; + this.state = 559; this.match(QuintParser.T__2); } break; @@ -2289,47 +2242,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 573; + this.state = 561; this.match(QuintParser.T__10); - this.state = 582; + this.state = 570; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 574; + this.state = 562; this.expr(0); - this.state = 579; + this.state = 567; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 575; + this.state = 563; this.match(QuintParser.T__7); - this.state = 576; + this.state = 564; this.expr(0); } } } - this.state = 581; + this.state = 569; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } } } - this.state = 585; + this.state = 573; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 584; + this.state = 572; this.match(QuintParser.T__7); } } - this.state = 587; + this.state = 575; this.match(QuintParser.T__11); } break; @@ -2339,20 +2292,20 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 576; this.match(QuintParser.T__34); - this.state = 589; + this.state = 577; this.match(QuintParser.LPAREN); - this.state = 590; + this.state = 578; this.expr(0); - this.state = 591; + this.state = 579; this.match(QuintParser.RPAREN); - this.state = 592; + this.state = 580; this.expr(0); - this.state = 593; + this.state = 581; this.match(QuintParser.T__35); - this.state = 594; - this.expr(5); + this.state = 582; + this.expr(4); } break; @@ -2361,57 +2314,45 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 584; this.operDef(); - this.state = 597; - this.expr(4); - } - break; - - case 17: - { - _localctx = new NondetContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; - this.state = 599; - this.nondetOperDef(); - this.state = 600; + this.state = 585; this.expr(3); } break; - case 18: + case 17: { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 587; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 588; this.expr(0); - this.state = 604; + this.state = 589; this.match(QuintParser.RPAREN); } break; - case 19: + case 18: { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 606; + this.state = 591; this.match(QuintParser.T__1); - this.state = 607; + this.state = 592; this.expr(0); - this.state = 608; + this.state = 593; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 661; + this.state = 646; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 69, 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) { @@ -2419,21 +2360,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 659; + this.state = 644; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 68, 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 = 612; - if (!(this.precpred(this._ctx, 27))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); + this.state = 597; + if (!(this.precpred(this._ctx, 26))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 613; + this.state = 598; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 614; - this.expr(27); + this.state = 599; + this.expr(26); } break; @@ -2441,11 +2382,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; - if (!(this.precpred(this._ctx, 25))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); + this.state = 600; + if (!(this.precpred(this._ctx, 24))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 616; + this.state = 601; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2458,8 +2399,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; - this.expr(26); + this.state = 602; + this.expr(25); } break; @@ -2467,11 +2408,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; - if (!(this.precpred(this._ctx, 24))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); + this.state = 603; + if (!(this.precpred(this._ctx, 23))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 619; + this.state = 604; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2484,8 +2425,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; - this.expr(25); + this.state = 605; + this.expr(24); } break; @@ -2493,11 +2434,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; - if (!(this.precpred(this._ctx, 23))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); + this.state = 606; + if (!(this.precpred(this._ctx, 22))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 622; + this.state = 607; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2510,8 +2451,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 623; - this.expr(24); + this.state = 608; + this.expr(23); } break; @@ -2519,14 +2460,14 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; - if (!(this.precpred(this._ctx, 21))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); + this.state = 609; + if (!(this.precpred(this._ctx, 20))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 625; + this.state = 610; this.match(QuintParser.ASGN); - this.state = 626; - this.expr(22); + this.state = 611; + this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" this.notifyErrorListeners(m) @@ -2538,14 +2479,14 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; - if (!(this.precpred(this._ctx, 19))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); + this.state = 614; + if (!(this.precpred(this._ctx, 18))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 630; + this.state = 615; this.match(QuintParser.AND); - this.state = 631; - this.expr(20); + this.state = 616; + this.expr(19); } break; @@ -2553,14 +2494,14 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; - if (!(this.precpred(this._ctx, 17))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); + this.state = 617; + if (!(this.precpred(this._ctx, 16))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 633; + this.state = 618; this.match(QuintParser.OR); - this.state = 634; - this.expr(18); + this.state = 619; + this.expr(17); } break; @@ -2568,14 +2509,14 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; - if (!(this.precpred(this._ctx, 16))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); + this.state = 620; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 636; + this.state = 621; this.match(QuintParser.IFF); - this.state = 637; - this.expr(17); + this.state = 622; + this.expr(16); } break; @@ -2583,14 +2524,14 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; - if (!(this.precpred(this._ctx, 15))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); + this.state = 623; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 639; + this.state = 624; this.match(QuintParser.IMPLIES); - this.state = 640; - this.expr(16); + this.state = 625; + this.expr(15); } break; @@ -2598,14 +2539,14 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; - if (!(this.precpred(this._ctx, 8))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); + this.state = 626; + if (!(this.precpred(this._ctx, 7))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 7)"); } - this.state = 642; + this.state = 627; this.match(QuintParser.T__25); - this.state = 643; - this.expr(9); + this.state = 628; + this.expr(8); } break; @@ -2613,32 +2554,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 644; - if (!(this.precpred(this._ctx, 31))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); + this.state = 629; + if (!(this.precpred(this._ctx, 30))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 645; + this.state = 630; this.match(QuintParser.T__21); - this.state = 646; + this.state = 631; this.nameAfterDot(); - this.state = 652; + this.state = 637; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { - this.state = 647; + this.state = 632; this.match(QuintParser.LPAREN); - this.state = 649; + this.state = 634; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 648; + this.state = 633; this.argList(); } } - this.state = 651; + this.state = 636; this.match(QuintParser.RPAREN); } break; @@ -2650,24 +2591,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 654; - if (!(this.precpred(this._ctx, 28))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); + this.state = 639; + if (!(this.precpred(this._ctx, 27))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 655; + this.state = 640; this.match(QuintParser.T__10); - this.state = 656; + this.state = 641; this.expr(0); - this.state = 657; + this.state = 642; this.match(QuintParser.T__11); } break; } } } - this.state = 663; + this.state = 648; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); } } } @@ -2688,48 +2629,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 44, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 649; this.match(QuintParser.MATCH); - this.state = 665; + this.state = 650; this.expr(0); - this.state = 666; + this.state = 651; this.match(QuintParser.T__1); - this.state = 668; + this.state = 653; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 667; + this.state = 652; this.match(QuintParser.T__12); } } - this.state = 670; + this.state = 655; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 675; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 671; + this.state = 656; this.match(QuintParser.T__12); - this.state = 672; + this.state = 657; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 677; + this.state = 662; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 663; this.match(QuintParser.T__2); } } @@ -2750,32 +2691,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 682; + this.state = 667; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 680; + this.state = 665; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 681; + this.state = 666; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 684; + this.state = 669; this.match(QuintParser.T__26); - this.state = 685; + this.state = 670; this.expr(0); } } @@ -2796,42 +2737,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 687; + this.state = 672; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 694; + this.state = 679; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 688; + this.state = 673; this.match(QuintParser.LPAREN); - this.state = 691; + this.state = 676; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 689; + this.state = 674; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 690; + this.state = 675; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 693; + this.state = 678; this.match(QuintParser.RPAREN); } } @@ -2855,17 +2796,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 50, QuintParser.RULE_declarationOrExpr); try { - this.state = 705; + this.state = 690; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 696; + this.state = 681; this.declaration(); - this.state = 697; + this.state = 682; this.match(QuintParser.EOF); } break; @@ -2873,9 +2814,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 684; this.expr(0); - this.state = 700; + this.state = 685; this.match(QuintParser.EOF); } break; @@ -2883,9 +2824,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 702; + this.state = 687; this.match(QuintParser.DOCCOMMENT); - this.state = 703; + this.state = 688; this.match(QuintParser.EOF); } break; @@ -2893,7 +2834,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 704; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2916,15 +2857,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_lambda); + this.enterRule(_localctx, 52, QuintParser.RULE_lambda); try { - this.state = 709; + this.state = 694; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 74, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 692; this.lambdaUnsugared(); } break; @@ -2932,7 +2873,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 693; this.lambdaTupleSugar(); } break; @@ -2955,10 +2896,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 54, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 728; + this.state = 713; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2966,42 +2907,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 696; this.parameter(); - this.state = 712; + this.state = 697; this.match(QuintParser.T__26); - this.state = 713; + this.state = 698; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 715; + this.state = 700; this.match(QuintParser.LPAREN); - this.state = 716; + this.state = 701; this.parameter(); - this.state = 721; + this.state = 706; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 717; + this.state = 702; this.match(QuintParser.T__7); - this.state = 718; + this.state = 703; this.parameter(); } } - this.state = 723; + this.state = 708; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 724; + this.state = 709; this.match(QuintParser.RPAREN); - this.state = 725; + this.state = 710; this.match(QuintParser.T__26); - this.state = 726; + this.state = 711; this.expr(0); } break; @@ -3026,40 +2967,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 730; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 731; + this.state = 716; this.match(QuintParser.LPAREN); - this.state = 732; + this.state = 717; this.parameter(); - this.state = 735; + this.state = 720; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 733; + this.state = 718; this.match(QuintParser.T__7); - this.state = 734; + this.state = 719; this.parameter(); } } - this.state = 737; + this.state = 722; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 739; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 740; + this.state = 725; this.match(QuintParser.RPAREN); - this.state = 741; + this.state = 726; this.match(QuintParser.T__26); - this.state = 742; + this.state = 727; this.expr(0); } } @@ -3080,15 +3021,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 58, QuintParser.RULE_identOrHole); try { - this.state = 746; + this.state = 731; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 729; this.match(QuintParser.T__36); } break; @@ -3096,7 +3037,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 730; this.qualId(); } break; @@ -3121,11 +3062,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_parameter); + this.enterRule(_localctx, 60, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 748; + this.state = 733; _localctx._paramName = this.identOrHole(); } } @@ -3146,15 +3087,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public annotatedParameter(): AnnotatedParameterContext { let _localctx: AnnotatedParameterContext = new AnnotatedParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_annotatedParameter); + this.enterRule(_localctx, 62, QuintParser.RULE_annotatedParameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 735; _localctx._paramName = this.identOrHole(); - this.state = 751; + this.state = 736; this.match(QuintParser.T__4); - this.state = 752; + this.state = 737; this.type(0); } } @@ -3175,15 +3116,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 756; + this.state = 741; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 739; this.match(QuintParser.MUL); } break; @@ -3191,7 +3132,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 755; + this.state = 740; this.qualId(); } break; @@ -3216,26 +3157,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 758; + this.state = 743; this.expr(0); - this.state = 763; + this.state = 748; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 759; + this.state = 744; this.match(QuintParser.T__7); - this.state = 760; + this.state = 745; this.expr(0); } } - this.state = 765; + this.state = 750; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3258,29 +3199,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 772; + this.state = 757; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 766; + this.state = 751; this.simpleId("record"); - this.state = 767; + this.state = 752; this.match(QuintParser.T__4); - this.state = 768; + this.state = 753; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 770; + this.state = 755; this.match(QuintParser.T__37); - this.state = 771; + this.state = 756; this.expr(0); } break; @@ -3305,17 +3246,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 776; + this.state = 761; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 759; this.qualId(); } break; @@ -3328,7 +3269,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 760; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3364,17 +3305,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 780; + this.state = 765; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 763; this.qualId(); } break; @@ -3384,7 +3325,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 779; + this.state = 764; _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))) { @@ -3420,12 +3361,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 767; _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); @@ -3456,12 +3397,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 78, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 784; + this.state = 769; _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); @@ -3492,30 +3433,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 80, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 786; + this.state = 771; this.identifier(); - this.state = 791; + this.state = 776; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 787; + this.state = 772; this.match(QuintParser.T__38); - this.state = 788; + this.state = 773; this.identifier(); } } } - this.state = 793; + this.state = 778; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); } } } @@ -3536,15 +3477,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, 82, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 798; + this.state = 783; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 85, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 794; + this.state = 779; this.identifier(); } break; @@ -3552,7 +3493,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 795; + this.state = 780; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3583,12 +3524,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 84, QuintParser.RULE_identifier); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 800; + this.state = 785; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3619,10 +3560,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 18: + case 17: return this.type_sempred(_localctx as TypeContext, predIndex); - case 22: + case 21: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3640,47 +3581,47 @@ export class QuintParser extends Parser { private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { case 2: - return this.precpred(this._ctx, 27); + return this.precpred(this._ctx, 26); case 3: - return this.precpred(this._ctx, 25); + return this.precpred(this._ctx, 24); case 4: - return this.precpred(this._ctx, 24); + return this.precpred(this._ctx, 23); case 5: - return this.precpred(this._ctx, 23); + return this.precpred(this._ctx, 22); case 6: - return this.precpred(this._ctx, 21); + return this.precpred(this._ctx, 20); case 7: - return this.precpred(this._ctx, 19); + return this.precpred(this._ctx, 18); case 8: - return this.precpred(this._ctx, 17); + return this.precpred(this._ctx, 16); case 9: - return this.precpred(this._ctx, 16); + return this.precpred(this._ctx, 15); case 10: - return this.precpred(this._ctx, 15); + return this.precpred(this._ctx, 14); case 11: - return this.precpred(this._ctx, 8); + return this.precpred(this._ctx, 7); case 12: - return this.precpred(this._ctx, 31); + return this.precpred(this._ctx, 30); case 13: - return this.precpred(this._ctx, 28); + return this.precpred(this._ctx, 27); } return true; } private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0325\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0316\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" + @@ -3688,422 +3629,415 @@ export class QuintParser extends Parser { "\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\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + - "\x04,\t,\x03\x02\x06\x02Z\n\x02\r\x02\x0E\x02[\x03\x02\x03\x02\x03\x03" + - "\x07\x03a\n\x03\f\x03\x0E\x03d\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07" + - "\x03j\n\x03\f\x03\x0E\x03m\v\x03\x03\x03\x03\x03\x03\x04\x07\x04r\n\x04" + - "\f\x04\x0E\x04u\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\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\x03\x05\x05\x05\x8D\n" + - "\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x95\n\x06" + - "\f\x06\x0E\x06\x98\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06" + - "\x9F\n\x06\x03\x06\x05\x06\xA2\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x05\x06\xAF\n\x06" + - "\x03\x06\x05\x06\xB2\n\x06\x03\x06\x03\x06\x05\x06\xB6\n\x06\x03\x06\x03" + - "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n\x06" + + "\x03\x06\x05\x06\xA0\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x07\x06\xA8\n\x06\f\x06\x0E\x06\xAB\v\x06\x05\x06\xAD\n\x06\x03\x06" + + "\x05\x06\xB0\n\x06\x03\x06\x03\x06\x05\x06\xB4\n\x06\x03\x06\x03\x06\x05" + + "\x06\xB8\n\x06\x03\x06\x05\x06\xBB\n\x06\x05\x06\xBD\n\x06\x03\x07\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + - "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x05\b\xDA\n\b\x03\t\x05\t\xDD\n\t\x03" + - "\t\x03\t\x03\t\x07\t\xE2\n\t\f\t\x0E\t\xE5\v\t\x03\n\x03\n\x03\n\x03\n" + - "\x03\n\x05\n\xEC\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF2\n\v\x03\v\x03\v" + - "\x03\v\x05\v\xF7\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + - "\f\x05\f\u0102\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010A\n\r" + - "\x03\r\x03\r\x03\r\x03\r\x05\r\u0110\n\r\x03\r\x03\r\x05\r\u0114\n\r\x05" + - "\r\u0116\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x05\x0E\u0121\n\x0E\x05\x0E\u0123\n\x0E\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07" + - "\x0F\u0130\n\x0F\f\x0F\x0E\x0F\u0133\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x05\x0F\u013A\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0147\n\x0F\f" + - "\x0F\x0E\x0F\u014A\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + - "\u0151\n\x0F\x05\x0F\u0153\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12" + - "\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + - "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + - "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0181\n\x14\f\x14\x0E" + - "\x14\u0184\v\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x05\x14\u018D\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u019E\n\x14\f\x14\x0E\x14\u01A1\v\x14\x03\x14\x03\x14\x05\x14" + - "\u01A5\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AD" + - "\n\x14\f\x14\x0E\x14\u01B0\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BD\n\x16\f" + - "\x16\x0E\x16\u01C0\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C5\n\x16\x03" + - "\x16\x03\x16\x05\x16\u01C9\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u01D2\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x07\x18\u01E2\n\x18\f\x18\x0E\x18\u01E5\v\x18\x03\x18\x05\x18\u01E8" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u01F1\n\x18\f\x18\x0E\x18\u01F4\v\x18\x03\x18\x05\x18\u01F7\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0201" + - "\n\x18\f\x18\x0E\x18\u0204\v\x18\x03\x18\x05\x18\u0207\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0210\n\x18\f\x18" + - "\x0E\x18\u0213\v\x18\x03\x18\x05\x18\u0216\n\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x05\x18\u021E\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x07\x18\u0226\n\x18\f\x18\x0E\x18\u0229\v\x18\x03" + - "\x18\x05\x18\u022C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18\u0239\v\x18\x03\x18" + - "\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18\u0249\n\x18\x03\x18" + - "\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0265" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18\u028F\n\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18\f\x18\x0E\x18\u0299" + - "\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F\n\x19\x03\x19\x03" + - "\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7\v\x19\x03\x19\x03" + - "\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B\x05\x1B\u02B9\n\x1B" + - "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8\n\x1D\x03\x1E\x03\x1E" + - "\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D2\n\x1E\f" + - "\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02DB" + - "\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E2\n\x1F\r\x1F" + - "\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 " + - "\u02ED\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F7\n#\x03" + - "$\x03$\x03$\x07$\u02FC\n$\f$\x0E$\u02FF\v$\x03%\x03%\x03%\x03%\x03%\x03" + - "%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'\x03\'\x05\'\u030F\n\'\x03" + - "(\x03(\x03)\x03)\x03*\x03*\x03*\x07*\u0318\n*\f*\x0E*\u031B\v*\x03+\x03" + - "+\x03+\x03+\x05+\u0321\n+\x03,\x03,\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.\x02" + - "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + - "L\x02N\x02P\x02R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04" + - "\x02-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0388\x02Y\x03" + - "\x02\x02\x02\x04b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02" + - "\x02\n\xBE\x03\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02" + - "\x10\xDC\x03\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02" + - "\x16\u0101\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02" + - "\x02\x02\x1C\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03" + - "\x02\x02\x02\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A4\x03" + - "\x02\x02\x02(\u01B1\x03\x02\x02\x02*\u01C8\x03\x02\x02\x02,\u01CA\x03" + - "\x02\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03" + - "\x02\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03" + - "\x02\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03" + - "\x02\x02\x02@\u02EE\x03\x02\x02\x02B\u02F0\x03\x02\x02\x02D\u02F6\x03" + - "\x02\x02\x02F\u02F8\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03" + - "\x02\x02\x02L\u030E\x03\x02\x02\x02N\u0310\x03\x02\x02\x02P\u0312\x03" + - "\x02\x02\x02R\u0314\x03\x02\x02\x02T\u0320\x03\x02\x02\x02V\u0322\x03" + - "\x02\x02\x02XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03" + - "\x02\x02\x02[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^" + - "\x03\x03\x02\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02" + - "b`\x03\x02\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02" + - "ef\x07\x03\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03" + - "\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03" + - "\x02\x02\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02" + - "pr\x07E\x02\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02" + - "st\x03\x02\x02\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02" + - "w\x07\x03\x02\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02" + - "{|\x05&\x14\x02|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F" + - "\x80\x07\x07\x02\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82" + - "\x83\x07\t\x02\x02\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05" + - ".\x18\x02\x86\x8D\x03\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05" + - "\n\x06\x02\x89\x8D\x05\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A" + - "\x0E\x02\x8Cx\x03\x02\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02" + - "\x02\x8C\x87\x03\x02\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02" + - "\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02" + - "\x02\x8E\x8F\x05\x16\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91" + - "\x96\x05B\"\x02\x92\x93\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02" + - "\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02" + - "\x02\x02\x97\x99\x03\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@" + - "\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02" + - "\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02" + - "\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02" + - "\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f" + - "\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8" + - "\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02" + - "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02" + - "\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02" + - "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02" + - "\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07" + - "\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02" + - "\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18" + - "\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02" + - "\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02" + - "\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02" + - "\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2" + - "\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6" + - "\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05" + - "\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02" + - "\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02" + - "\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02" + - "\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1" + - "\x03\x02\x02\x02\xD4\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6" + - "\x03\x02\x02\x02\xD6\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA" + - "\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F" + - "\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD" + - "\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0" + - "\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5" + - "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11" + - "\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07" + - "?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02" + - "\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02" + - "\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02" + - "\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02" + - "\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5" + - "\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7" + - "\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02" + - "\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02" + - "\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07" + - "\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101" + - "\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02" + - "\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02" + - "\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105" + - "\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107" + - "\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02" + - "\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C" + - "\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02" + - "\u010E\u0110\x05 \x11\x02\u010F\u010D\x03\x02\x02\x02\u010F\u0110\x03" + - "\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112" + - "\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02\x02\u0113\u0114\x03\x02\x02" + - "\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103\x03\x02\x02\x02\u0115\u010B" + - "\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02" + - "\u0118\u0119\x05 \x11\x02\u0119\u011A\x07\x18\x02\x02\u011A\u011B\x05" + - "D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D\x07\x1B\x02\x02\u011D\u0120" + - "\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120" + - "\u011E\x03\x02\x02\x02\u0120\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02" + - "\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123" + - "\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10" + - "\x02\u0126\u0127\x07?\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07" + - ">\x02\x02\u0129\u0131\x05.\x18\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C" + - "\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u012E\x05.\x18\x02\u012E" + - "\u0130\x03\x02\x02\x02\u012F\u012A\x03\x02\x02\x02\u0130\u0133\x03\x02" + - "\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132" + - "\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0134\u0135\x07@\x02" + - "\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139\x075\x02\x02\u0137\u0138" + - "\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139\u0137\x03\x02\x02\x02" + - "\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02\x02\x02\u013B\u013C\x07" + - "\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D\u013E\x07?\x02\x02\u013E" + - "\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02\u0140\u0148\x05.\x18\x02" + - "\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02" + - "\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03\x02\x02\x02\u0146\u0141" + - "\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148\u0146\x03\x02\x02\x02" + - "\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02\x02\x02\u014A\u0148\x03" + - "\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D\x07\x1A\x02\x02\u014D" + - "\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02\u014F\u0151\x05$\x13" + - "\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02\u0151\u0153" + - "\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152\u013B\x03\x02\x02\x02" + - "\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02\u0155\x1F\x03\x02\x02" + - "\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02\u0158\u0159\x05R*\x02" + - "\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02\u015B%\x03\x02\x02\x02" + - "\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02\x02\u015E\u0163\x05&\x14" + - "\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05&\x14\x02\u0161\u015F\x03" + - "\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163\u0161\x03\x02\x02\x02\u0163" + - "\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02\x02\x02\u0165\u0163\x03\x02" + - "\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167" + - "\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02\x02\u0169\u0168\x03\x02\x02" + - "\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C" + - "\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02\u016D\u01A5\x05&\x14\x0F\u016E" + - "\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02\x02\u0170\u0171\x05&\x14\x02" + - "\u0171\u0172\x07\x0E\x02\x02\u0172\u01A5\x03\x02\x02\x02\u0173\u0174\x07" + - "B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177" + - "\x07\x0E\x02\x02\u0177\u01A5\x03\x02\x02\x02\u0178\u0179\x07?\x02\x02" + - "\u0179\u01A5\x07@\x02\x02\u017A\u017B\x07?\x02\x02\u017B\u017C\x05&\x14" + - "\x02\u017C\u017D\x07\n\x02\x02\u017D\u0182\x05&\x14\x02\u017E\u017F\x07" + - "\n\x02\x02\u017F\u0181\x05&\x14\x02\u0180\u017E\x03\x02\x02\x02\u0181" + - "\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0182\u0183\x03\x02" + - "\x02\x02\u0183\u0186\x03\x02\x02\x02\u0184\u0182\x03\x02\x02\x02\u0185" + - "\u0187\x07\n\x02\x02\u0186\u0185\x03\x02\x02\x02\u0186\u0187\x03\x02\x02" + - "\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0189\x07@\x02\x02\u0189\u01A5" + - "\x03\x02\x02\x02\u018A\u018C\x07\x04\x02\x02\u018B\u018D\x05*\x16\x02" + - "\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u018E\x03" + - "\x02\x02\x02\u018E\u01A5\x07\x05\x02\x02\u018F\u01A5\x07\x1E\x02\x02\u0190" + - "\u01A5\x07\x1F\x02\x02\u0191\u01A5\x07 \x02\x02\u0192\u01A5\x05(\x15\x02" + - "\u0193\u01A5\x05R*\x02\u0194\u0195\x07?\x02\x02\u0195\u0196\x05&\x14\x02" + - "\u0196\u0197\x07@\x02\x02\u0197\u01A5\x03\x02\x02\x02\u0198\u0199\x05" + - "R*\x02\u0199\u019A\x07\r\x02\x02\u019A\u019F\x05&\x14\x02\u019B\u019C" + - "\x07\n\x02\x02\u019C\u019E\x05&\x14\x02\u019D\u019B\x03\x02\x02\x02\u019E" + - "\u01A1\x03\x02\x02\x02\u019F\u019D\x03\x02\x02\x02\u019F\u01A0\x03\x02" + - "\x02\x02\u01A0\u01A2\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A2" + - "\u01A3\x07\x0E\x02\x02\u01A3\u01A5\x03\x02\x02\x02\u01A4\u015C\x03\x02" + - "\x02\x02\u01A4\u016E\x03\x02\x02\x02\u01A4\u0173\x03\x02\x02\x02\u01A4" + - "\u0178\x03\x02\x02\x02\u01A4\u017A\x03\x02\x02\x02\u01A4\u018A\x03\x02" + - "\x02\x02\u01A4\u018F\x03\x02\x02\x02\u01A4\u0190\x03\x02\x02\x02\u01A4" + - "\u0191\x03\x02\x02\x02\u01A4\u0192\x03\x02\x02\x02\u01A4\u0193\x03\x02" + - "\x02\x02\u01A4\u0194\x03\x02\x02\x02\u01A4\u0198\x03\x02\x02\x02\u01A5" + - "\u01AE\x03\x02\x02\x02\u01A6\u01A7\f\x11\x02\x02\u01A7\u01A8\x07\x1C\x02" + - "\x02\u01A8\u01AD\x05&\x14\x11\u01A9\u01AA\f\x10\x02\x02\u01AA\u01AB\x07" + - "\x1D\x02\x02\u01AB\u01AD\x05&\x14\x10\u01AC\u01A6\x03\x02\x02\x02\u01AC" + - "\u01A9\x03\x02\x02\x02\u01AD\u01B0\x03\x02\x02\x02\u01AE\u01AC\x03\x02" + - "\x02\x02\u01AE\u01AF\x03\x02\x02\x02\u01AF\'\x03\x02\x02\x02\u01B0\u01AE" + - "\x03\x02\x02\x02\u01B1\u01B2\x07C\x02\x02\u01B2)\x03\x02\x02\x02\u01B3" + - "\u01B4\x05,\x17\x02\u01B4\u01B5\x07\x07\x02\x02\u01B5\u01B6\x05&\x14\x02" + - "\u01B6\u01BE\x03\x02\x02\x02\u01B7\u01B8\x07\n\x02\x02\u01B8\u01B9\x05" + - ",\x17\x02\u01B9\u01BA\x07\x07\x02\x02\u01BA\u01BB\x05&\x14\x02\u01BB\u01BD" + - "\x03\x02\x02\x02\u01BC\u01B7\x03\x02\x02\x02\u01BD\u01C0\x03\x02\x02\x02" + - "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C4\x03" + - "\x02\x02\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C5\x07\n\x02\x02\u01C2" + - "\u01C3\x07\x0F\x02\x02\u01C3\u01C5\x05V,\x02\u01C4\u01C1\x03\x02\x02\x02" + - "\u01C4\u01C2\x03\x02\x02\x02\u01C4\u01C5\x03\x02\x02\x02\u01C5\u01C9\x03" + - "\x02\x02\x02\u01C6\u01C7\x07\x0F\x02\x02\u01C7\u01C9\x05V,\x02\u01C8\u01B3" + - "\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C9+\x03\x02\x02\x02\u01CA" + - "\u01CB\x05T+\x02\u01CB-\x03\x02\x02\x02\u01CC\u01CD\b\x18\x01\x02\u01CD" + - "\u0265\x058\x1D\x02\u01CE\u01CF\x05J&\x02\u01CF\u01D1\x07?\x02\x02\u01D0" + - "\u01D2\x05F$\x02\u01D1\u01D0\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02" + - "\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\x07@\x02\x02\u01D4\u0265\x03" + - "\x02\x02\x02\u01D5\u01D6\x074\x02\x02\u01D6\u0265\x05.\x18\x1C\u01D7\u01D8" + - "\x05R*\x02\u01D8\u01D9\x07\"\x02\x02\u01D9\u01DA\x07>\x02\x02\u01DA\u01DB" + - "\x05.\x18\x18\u01DB\u0265\x03\x02\x02\x02\u01DC\u01DD\x07-\x02\x02\u01DD" + - "\u01DE\x07\x04\x02\x02\u01DE\u01E3\x05.\x18\x02\u01DF\u01E0\x07\n\x02" + - "\x02\u01E0\u01E2\x05.\x18\x02\u01E1\u01DF\x03\x02\x02\x02\u01E2\u01E5" + - "\x03\x02\x02\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02" + - "\u01E4\u01E7\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E6\u01E8\x07" + - "\n\x02\x02\u01E7\u01E6\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8" + - "\u01E9\x03\x02\x02\x02\u01E9\u01EA\x07\x05\x02\x02\u01EA\u0265\x03\x02" + - "\x02\x02\u01EB\u01EC\x07.\x02\x02\u01EC\u01ED"; + "\x07\x03\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD2" + + "\n\b\f\b\x0E\b\xD5\v\b\x03\b\x05\b\xD8\n\b\x03\t\x05\t\xDB\n\t\x03\t\x03" + + "\t\x03\t\x07\t\xE0\n\t\f\t\x0E\t\xE3\v\t\x03\n\x03\n\x03\n\x03\n\x03\n" + + "\x05\n\xEA\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + + "\v\x05\v\xF6\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03" + + "\f\x03\f\x03\f\x03\f\x05\f\u0104\n\f\x03\f\x03\f\x05\f\u0108\n\f\x05\f" + + "\u010A\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + + "\u0115\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u0124\n\x0E\f\x0E" + + "\x0E\x0E\u0127\v\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u012E" + + "\n\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u013B\n\x0E\f\x0E\x0E\x0E\u013E\v\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u0145\n\x0E\x05\x0E\u0147" + + "\n\x0E\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0156\n\x13\f\x13\x0E" + + "\x13\u0159\v\x13\x05\x13\u015B\n\x13\x03\x13\x05\x13\u015E\n\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x07\x13\u0175\n\x13\f\x13\x0E\x13\u0178\v\x13\x03\x13" + + "\x05\x13\u017B\n\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0181\n\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0192\n\x13\f" + + "\x13\x0E\x13\u0195\v\x13\x03\x13\x03\x13\x05\x13\u0199\n\x13\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u01A1\n\x13\f\x13\x0E\x13" + + "\u01A4\v\x13\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B1\n\x15\f\x15\x0E\x15\u01B4\v" + + "\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01B9\n\x15\x03\x15\x03\x15\x05\x15" + + "\u01BD\n\x15\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05" + + "\x17\u01C6\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01D6" + + "\n\x17\f\x17\x0E\x17\u01D9\v\x17\x03\x17\x05\x17\u01DC\n\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01E5\n\x17\f\x17" + + "\x0E\x17\u01E8\v\x17\x03\x17\x05\x17\u01EB\n\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01F5\n\x17\f\x17\x0E" + + "\x17\u01F8\v\x17\x03\x17\x05\x17\u01FB\n\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0204\n\x17\f\x17\x0E\x17\u0207\v" + + "\x17\x03\x17\x05\x17\u020A\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x05\x17\u0212\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x07\x17\u021A\n\x17\f\x17\x0E\x17\u021D\v\x17\x03\x17\x05\x17\u0220" + + "\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x07\x17\u022A\n\x17\f\x17\x0E\x17\u022D\v\x17\x03\x17\x05\x17\u0230\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0238\n\x17" + + "\f\x17\x0E\x17\u023B\v\x17\x05\x17\u023D\n\x17\x03\x17\x05\x17\u0240\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x05\x17\u0256\n\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05\x17\u027D\n\x17\x03" + + "\x17\x05\x17\u0280\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17" + + "\u0287\n\x17\f\x17\x0E\x17\u028A\v\x17\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x05\x18\u0290\n\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0295\n\x18\f\x18" + + "\x0E\x18\u0298\v\x18\x03\x18\x03\x18\x03\x19\x03\x19\x05\x19\u029E\n\x19" + + "\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u02A7" + + "\n\x1A\x03\x1A\x05\x1A\u02AA\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C" + + "\x05\x1C\u02B9\n\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x07\x1D\u02C3\n\x1D\f\x1D\x0E\x1D\u02C6\v\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x03\x1D\x05\x1D\u02CC\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x06\x1E\u02D3\n\x1E\r\x1E\x0E\x1E\u02D4\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x05\x1F\u02DE\n\x1F\x03 \x03 \x03!\x03" + + "!\x03!\x03!\x03\"\x03\"\x05\"\u02E8\n\"\x03#\x03#\x03#\x07#\u02ED\n#\f" + + "#\x0E#\u02F0\v#\x03$\x03$\x03$\x03$\x03$\x03$\x05$\u02F8\n$\x03%\x03%" + + "\x05%\u02FC\n%\x03&\x03&\x05&\u0300\n&\x03\'\x03\'\x03(\x03(\x03)\x03" + + ")\x03)\x07)\u0309\n)\f)\x0E)\u030C\v)\x03*\x03*\x03*\x03*\x05*\u0312\n" + + "*\x03+\x03+\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@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02" + + "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + + "03=\x03\x02*,\x03\x02CD\x02\u0378\x02W\x03\x02\x02\x02\x04`\x03\x02\x02" + + "\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02\n\xBC\x03\x02\x02\x02" + + "\f\xCA\x03\x02\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xDA\x03\x02\x02\x02" + + "\x12\xE4\x03\x02\x02\x02\x14\xF5\x03\x02\x02\x02\x16\u0109\x03\x02\x02" + + "\x02\x18\u0116\x03\x02\x02\x02\x1A\u0146\x03\x02\x02\x02\x1C\u0148\x03" + + "\x02\x02\x02\x1E\u014A\x03\x02\x02\x02 \u014C\x03\x02\x02\x02\"\u014E" + + "\x03\x02\x02\x02$\u0198\x03\x02\x02\x02&\u01A5\x03\x02\x02\x02(\u01BC" + + "\x03\x02\x02\x02*\u01BE\x03\x02\x02\x02,\u0255\x03\x02\x02\x02.\u028B" + + "\x03\x02\x02\x020\u029D\x03\x02\x02\x022\u02A2\x03\x02\x02\x024\u02B4" + + "\x03\x02\x02\x026\u02B8\x03\x02\x02\x028\u02CB\x03\x02\x02\x02:\u02CD" + + "\x03\x02\x02\x02<\u02DD\x03\x02\x02\x02>\u02DF\x03\x02\x02\x02@\u02E1" + + "\x03\x02\x02\x02B\u02E7\x03\x02\x02\x02D\u02E9\x03\x02\x02\x02F\u02F7" + + "\x03\x02\x02\x02H\u02FB\x03\x02\x02\x02J\u02FF\x03\x02\x02\x02L\u0301" + + "\x03\x02\x02\x02N\u0303\x03\x02\x02\x02P\u0305\x03\x02\x02\x02R\u0311" + + "\x03\x02\x02\x02T\u0313\x03\x02\x02\x02VX\x05\x04\x03\x02WV\x03\x02\x02" + + "\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z[\x03\x02\x02" + + "\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02\x02^]\x03\x02" + + "\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02\x02ac\x03\x02" + + "\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02ei\x07\x04\x02" + + "\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02\x02" + + "\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x07\x05\x02" + + "\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02ps\x03\x02\x02" + + "\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02sq\x03\x02\x02" + + "\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02\x02wx\x05P)\x02" + + "xy\x07\x07\x02\x02yz\x05$\x13\x02z\x8B\x03\x02\x02\x02{|\x07\b\x02\x02" + + "|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05$\x13\x02\x7F\x8B\x03\x02\x02\x02" + + "\x80\x81\x07\t\x02\x02\x81\x82\x05<\x1F\x02\x82\x83\x07>\x02\x02\x83\x84" + + "\x05,\x17\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1A\x0E\x02\x86\x8B" + + "\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x16\f\x02\x89\x8B\x05" + + "\x18\r\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02\x8A\x80\x03\x02\x02" + + "\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02\x8A\x87\x03\x02\x02" + + "\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02\x8B\t\x03\x02\x02" + + "\x02\x8C\x8D\x05\x14\v\x02\x8D\x8E\x05H%\x02\x8E\x8F\x07?\x02\x02\x8F" + + "\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02\x92\x90\x03\x02" + + "\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02" + + "\x02\x02\x95\x97\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x97\x98\x07@" + + "\x02\x02\x98\x99\x07\x07\x02\x02\x99\x9C\x05$\x13\x02\x9A\x9B\x07>\x02" + + "\x02\x9B\x9D\x05,\x17\x02\x9C\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02" + + "\x02\x9D\x9F\x03\x02\x02\x02\x9E\xA0\x07\v\x02\x02\x9F\x9E\x03\x02\x02" + + "\x02\x9F\xA0\x03\x02\x02\x02\xA0\xBD\x03\x02\x02\x02\xA1\xA2\x05\x14\v" + + "\x02\xA2\xAF\x05H%\x02\xA3\xAC\x07?\x02\x02\xA4\xA9\x05> \x02\xA5\xA6" + + "\x07\n\x02\x02\xA6\xA8\x05> \x02\xA7\xA5\x03\x02\x02\x02\xA8\xAB\x03\x02" + + "\x02\x02\xA9\xA7\x03\x02\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\xAD\x03\x02" + + "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAC\xA4\x03\x02\x02\x02\xAC\xAD\x03\x02" + + "\x02\x02\xAD\xAE\x03\x02\x02\x02\xAE\xB0\x07@\x02\x02\xAF\xA3\x03\x02" + + "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB3\x03\x02\x02\x02\xB1\xB2\x07\x07" + + "\x02\x02\xB2\xB4\x05$\x13\x02\xB3\xB1\x03\x02\x02\x02\xB3\xB4\x03\x02" + + "\x02\x02\xB4\xB7\x03\x02\x02\x02\xB5\xB6\x07>\x02\x02\xB6\xB8\x05,\x17" + + "\x02\xB7\xB5\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02\xB8\xBA\x03\x02\x02" + + "\x02\xB9\xBB\x07\v\x02\x02\xBA\xB9\x03\x02\x02\x02\xBA\xBB\x03\x02\x02" + + "\x02\xBB\xBD\x03\x02\x02\x02\xBC\x8C\x03\x02\x02\x02\xBC\xA1\x03\x02\x02" + + "\x02\xBD\v\x03\x02\x02\x02\xBE\xBF\x07\f\x02\x02\xBF\xCB\x05P)\x02\xC0" + + "\xC1\x07\f\x02\x02\xC1\xC2\x05\x0E\b\x02\xC2\xC3\x07>\x02\x02\xC3\xC4" + + "\x05$\x13\x02\xC4\xCB\x03\x02\x02\x02\xC5\xC6\x07\f\x02\x02\xC6\xC7\x05" + + "\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05\x10\t\x02\xC9\xCB\x03\x02" + + "\x02\x02\xCA\xBE\x03\x02\x02\x02\xCA\xC0\x03\x02\x02\x02\xCA\xC5\x03\x02" + + "\x02\x02\xCB\r\x03\x02\x02\x02\xCC\xD7\x05P)\x02\xCD\xCE\x07\r\x02\x02" + + "\xCE\xD3\x07C\x02\x02\xCF\xD0\x07\n\x02\x02\xD0\xD2\x07C\x02\x02\xD1\xCF" + + "\x03\x02\x02\x02\xD2\xD5\x03\x02\x02\x02\xD3\xD1\x03\x02\x02\x02\xD3\xD4" + + "\x03\x02\x02\x02\xD4\xD6\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD6\xD8" + + "\x07\x0E\x02\x02\xD7\xCD\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\x0F" + + "\x03\x02\x02\x02\xD9\xDB\x07\x0F\x02\x02\xDA\xD9\x03\x02\x02\x02\xDA\xDB" + + "\x03\x02\x02\x02\xDB\xDC\x03\x02\x02\x02\xDC\xE1\x05\x12\n\x02\xDD\xDE" + + "\x07\x0F\x02\x02\xDE\xE0\x05\x12\n\x02\xDF\xDD\x03\x02\x02\x02\xE0\xE3" + + "\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\x11" + + "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE4\xE9\x05R*\x02\xE5\xE6\x07" + + "?\x02\x02\xE6\xE7\x05$\x13\x02\xE7\xE8\x07@\x02\x02\xE8\xEA\x03\x02\x02" + + "\x02\xE9\xE5\x03\x02\x02\x02\xE9\xEA\x03\x02\x02\x02\xEA\x13\x03\x02\x02" + + "\x02\xEB\xF6\x07\x10\x02\x02\xEC\xF6\x07\x11\x02\x02\xED\xEE\x07\x12\x02" + + "\x02\xEE\xF6\x07\x10\x02\x02\xEF\xF0\x07\x12\x02\x02\xF0\xF6\x07\x11\x02" + + "\x02\xF1\xF6\x07\x13\x02\x02\xF2\xF6\x07\x14\x02\x02\xF3\xF6\x07\x15\x02" + + "\x02\xF4\xF6\x07\x16\x02\x02\xF5\xEB\x03\x02\x02\x02\xF5\xEC\x03\x02\x02" + + "\x02\xF5\xED\x03\x02\x02\x02\xF5\xEF\x03\x02\x02\x02\xF5\xF1\x03\x02\x02" + + "\x02\xF5\xF2\x03\x02\x02\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF4\x03\x02\x02" + + "\x02\xF6\x15\x03\x02\x02\x02\xF7\xF8\x07\x17\x02\x02\xF8\xF9\x05\x1E\x10" + + "\x02\xF9\xFA\x07\x18\x02\x02\xFA\xFD\x05B\"\x02\xFB\xFC\x07\x19\x02\x02" + + "\xFC\xFE\x05\"\x12\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFE\x03\x02\x02\x02" + + "\xFE\u010A\x03\x02\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0103\x05\x1E" + + "\x10\x02\u0101\u0102\x07\x1A\x02\x02\u0102\u0104\x05\x1E\x10\x02\u0103" + + "\u0101\x03\x02\x02\x02\u0103\u0104\x03\x02\x02\x02\u0104\u0107\x03\x02" + + "\x02\x02\u0105\u0106\x07\x19\x02\x02\u0106\u0108\x05\"\x12\x02\u0107\u0105" + + "\x03\x02\x02\x02\u0107\u0108\x03\x02\x02\x02\u0108\u010A\x03\x02\x02\x02" + + "\u0109\xF7\x03\x02\x02\x02\u0109\xFF\x03\x02\x02\x02\u010A\x17\x03\x02" + + "\x02\x02\u010B\u010C\x07\x1B\x02\x02\u010C\u010D\x05\x1E\x10\x02\u010D" + + "\u010E\x07\x18\x02\x02\u010E\u010F\x05B\"\x02\u010F\u0117\x03\x02\x02" + + "\x02\u0110\u0111\x07\x1B\x02\x02\u0111\u0114\x05\x1E\x10\x02\u0112\u0113" + + "\x07\x1A\x02\x02\u0113\u0115\x05\x1E\x10\x02\u0114\u0112\x03\x02\x02\x02" + + "\u0114\u0115\x03\x02\x02\x02\u0115\u0117\x03\x02\x02\x02\u0116\u010B\x03" + + "\x02\x02\x02\u0116\u0110\x03\x02\x02\x02\u0117\x19\x03\x02\x02\x02\u0118" + + "\u0119\x07\x17\x02\x02\u0119\u011A\x05\x1C\x0F\x02\u011A\u011B\x07?\x02" + + "\x02\u011B\u011C\x05\x1E\x10\x02\u011C\u011D\x07>\x02\x02\u011D\u0125" + + "\x05,\x17\x02\u011E\u011F\x07\n\x02\x02\u011F\u0120\x05\x1E\x10\x02\u0120" + + "\u0121\x07>\x02\x02\u0121\u0122\x05,\x17\x02\u0122\u0124\x03\x02\x02\x02" + + "\u0123\u011E\x03\x02\x02\x02\u0124\u0127\x03\x02\x02\x02\u0125\u0123\x03" + + "\x02\x02\x02\u0125\u0126\x03\x02\x02\x02\u0126\u0128\x03\x02\x02\x02\u0127" + + "\u0125\x03\x02\x02\x02\u0128\u0129\x07@\x02\x02\u0129\u012A\x07\x18\x02" + + "\x02\u012A\u012D\x075\x02\x02\u012B\u012C\x07\x19\x02\x02\u012C\u012E" + + "\x05\"\x12\x02\u012D\u012B\x03\x02\x02\x02\u012D\u012E\x03\x02\x02\x02" + + "\u012E\u0147\x03\x02\x02\x02\u012F\u0130\x07\x17\x02\x02\u0130\u0131\x05" + + "\x1C\x0F\x02\u0131\u0132\x07?\x02\x02\u0132\u0133\x05\x1E\x10\x02\u0133" + + "\u0134\x07>\x02\x02\u0134\u013C\x05,\x17\x02\u0135\u0136\x07\n\x02\x02" + + "\u0136\u0137\x05\x1E\x10\x02\u0137\u0138\x07>\x02\x02\u0138\u0139\x05" + + ",\x17\x02\u0139\u013B\x03\x02\x02\x02\u013A\u0135\x03\x02\x02\x02\u013B" + + "\u013E\x03\x02\x02\x02\u013C\u013A\x03\x02\x02\x02\u013C\u013D\x03\x02" + + "\x02\x02\u013D\u013F\x03\x02\x02\x02\u013E\u013C\x03\x02\x02\x02\u013F" + + "\u0140\x07@\x02\x02\u0140\u0141\x07\x1A\x02\x02\u0141\u0144\x05 \x11\x02" + + "\u0142\u0143\x07\x19\x02\x02\u0143\u0145\x05\"\x12\x02\u0144\u0142\x03" + + "\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02\x02\x02\u0146" + + "\u0118\x03\x02\x02\x02\u0146\u012F\x03\x02\x02\x02\u0147\x1B\x03\x02\x02" + + "\x02\u0148\u0149\x05P)\x02\u0149\x1D\x03\x02\x02\x02\u014A\u014B\x05P" + + ")\x02\u014B\x1F\x03\x02\x02\x02\u014C\u014D\x05P)\x02\u014D!\x03\x02\x02" + + "\x02\u014E\u014F\x07*\x02\x02\u014F#\x03\x02\x02\x02\u0150\u0151\b\x13" + + "\x01\x02\u0151\u015A\x07?\x02\x02\u0152\u0157\x05$\x13\x02\u0153\u0154" + + "\x07\n\x02\x02\u0154\u0156\x05$\x13\x02\u0155\u0153\x03\x02\x02\x02\u0156" + + "\u0159\x03\x02\x02\x02\u0157\u0155\x03\x02\x02\x02\u0157\u0158\x03\x02" + + "\x02\x02\u0158\u015B\x03\x02\x02\x02\u0159\u0157\x03\x02\x02\x02\u015A" + + "\u0152\x03\x02\x02\x02\u015A\u015B\x03\x02\x02\x02\u015B\u015D\x03\x02" + + "\x02\x02\u015C\u015E\x07\n\x02\x02\u015D\u015C\x03\x02\x02\x02\u015D\u015E" + + "\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02\u015F\u0160\x07@\x02\x02" + + "\u0160\u0161\x07\x1D\x02\x02\u0161\u0199\x05$\x13\x0F\u0162\u0163\x07" + + "A\x02\x02\u0163\u0164\x07\r\x02\x02\u0164\u0165\x05$\x13\x02\u0165\u0166" + + "\x07\x0E\x02\x02\u0166\u0199\x03\x02\x02\x02\u0167\u0168\x07B\x02\x02" + + "\u0168\u0169\x07\r\x02\x02\u0169\u016A\x05$\x13\x02\u016A\u016B\x07\x0E" + + "\x02\x02\u016B\u0199\x03\x02\x02\x02\u016C\u016D\x07?\x02\x02\u016D\u0199" + + "\x07@\x02\x02\u016E\u016F\x07?\x02\x02\u016F\u0170\x05$\x13\x02\u0170" + + "\u0171\x07\n\x02\x02\u0171\u0176\x05$\x13\x02\u0172\u0173\x07\n\x02\x02" + + "\u0173\u0175\x05$\x13\x02\u0174\u0172\x03\x02\x02\x02\u0175\u0178\x03" + + "\x02\x02\x02\u0176\u0174\x03\x02\x02\x02\u0176\u0177\x03\x02\x02\x02\u0177" + + "\u017A\x03\x02\x02\x02\u0178\u0176\x03\x02\x02\x02\u0179\u017B\x07\n\x02" + + "\x02\u017A\u0179\x03\x02\x02\x02\u017A\u017B\x03\x02\x02\x02\u017B\u017C" + + "\x03\x02\x02\x02\u017C\u017D\x07@\x02\x02\u017D\u0199\x03\x02\x02\x02" + + "\u017E\u0180\x07\x04\x02\x02\u017F\u0181\x05(\x15\x02\u0180\u017F\x03" + + "\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02\x02\x02\u0182" + + "\u0199\x07\x05\x02\x02\u0183\u0199\x07\x1E\x02\x02\u0184\u0199\x07\x1F" + + "\x02\x02\u0185\u0199\x07 \x02\x02\u0186\u0199\x05&\x14\x02\u0187\u0199" + + "\x05P)\x02\u0188\u0189\x07?\x02\x02\u0189\u018A\x05$\x13\x02\u018A\u018B" + + "\x07@\x02\x02\u018B\u0199\x03\x02\x02\x02\u018C\u018D\x05P)\x02\u018D" + + "\u018E\x07\r\x02\x02\u018E\u0193\x05$\x13\x02\u018F\u0190\x07\n\x02\x02" + + "\u0190\u0192\x05$\x13\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0195\x03" + + "\x02\x02\x02\u0193\u0191\x03\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194" + + "\u0196\x03\x02\x02\x02\u0195\u0193\x03\x02\x02\x02\u0196\u0197\x07\x0E" + + "\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u0150\x03\x02\x02\x02\u0198" + + "\u0162\x03\x02\x02\x02\u0198\u0167\x03\x02\x02\x02\u0198\u016C\x03\x02" + + "\x02\x02\u0198\u016E\x03\x02\x02\x02\u0198\u017E\x03\x02\x02\x02\u0198" + + "\u0183\x03\x02\x02\x02\u0198\u0184\x03\x02\x02\x02\u0198\u0185\x03\x02" + + "\x02\x02\u0198\u0186\x03\x02\x02\x02\u0198\u0187\x03\x02\x02\x02\u0198" + + "\u0188\x03\x02\x02\x02\u0198\u018C\x03\x02\x02\x02\u0199\u01A2\x03\x02" + + "\x02\x02\u019A\u019B\f\x11\x02\x02\u019B\u019C\x07\x1C\x02\x02\u019C\u01A1" + + "\x05$\x13\x11\u019D\u019E\f\x10\x02\x02\u019E\u019F\x07\x1D\x02\x02\u019F" + + "\u01A1\x05$\x13\x10\u01A0\u019A\x03\x02\x02\x02\u01A0\u019D\x03\x02\x02" + + "\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3" + + "\x03\x02\x02\x02\u01A3%\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A6\x07C\x02\x02\u01A6\'\x03\x02\x02\x02\u01A7\u01A8\x05*\x16\x02\u01A8" + + "\u01A9\x07\x07\x02\x02\u01A9\u01AA\x05$\x13\x02\u01AA\u01B2\x03\x02\x02" + + "\x02\u01AB\u01AC\x07\n\x02\x02\u01AC\u01AD\x05*\x16\x02\u01AD\u01AE\x07" + + "\x07\x02\x02\u01AE\u01AF\x05$\x13\x02\u01AF\u01B1\x03\x02\x02\x02\u01B0" + + "\u01AB\x03\x02\x02\x02\u01B1\u01B4\x03\x02\x02\x02\u01B2\u01B0\x03\x02" + + "\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B3\u01B8\x03\x02\x02\x02\u01B4" + + "\u01B2\x03\x02\x02\x02\u01B5\u01B9\x07\n\x02\x02\u01B6\u01B7\x07\x0F\x02" + + "\x02\u01B7\u01B9\x05T+\x02\u01B8\u01B5\x03\x02\x02\x02\u01B8\u01B6\x03" + + "\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA" + + "\u01BB\x07\x0F\x02\x02\u01BB\u01BD\x05T+\x02\u01BC\u01A7\x03\x02\x02\x02" + + "\u01BC\u01BA\x03\x02\x02\x02\u01BD)\x03\x02\x02\x02\u01BE\u01BF\x05R*" + + "\x02\u01BF+\x03\x02\x02\x02\u01C0\u01C1\b\x17\x01\x02\u01C1\u0256\x05" + + "6\x1C\x02\u01C2\u01C3\x05H%\x02\u01C3\u01C5\x07?\x02\x02\u01C4\u01C6\x05" + + "D#\x02\u01C5\u01C4\x03\x02\x02\x02\u01C5\u01C6\x03\x02\x02\x02\u01C6\u01C7" + + "\x03\x02\x02\x02\u01C7\u01C8\x07@\x02\x02\u01C8\u0256\x03\x02\x02\x02" + + "\u01C9\u01CA\x074\x02\x02\u01CA\u0256\x05,\x17\x1B\u01CB\u01CC\x05P)\x02" + + "\u01CC\u01CD\x07\"\x02\x02\u01CD\u01CE\x07>\x02\x02\u01CE\u01CF\x05,\x17" + + "\x17\u01CF\u0256\x03\x02\x02\x02\u01D0\u01D1\x07-\x02\x02\u01D1\u01D2" + + "\x07\x04\x02\x02\u01D2\u01D7\x05,\x17\x02\u01D3\u01D4\x07\n\x02\x02\u01D4" + + "\u01D6\x05,\x17\x02\u01D5\u01D3\x03\x02\x02\x02\u01D6\u01D9\x03\x02\x02" + + "\x02\u01D7\u01D5\x03\x02\x02\x02\u01D7\u01D8\x03\x02\x02\x02\u01D8\u01DB" + + "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01DA\u01DC\x07\n\x02\x02" + + "\u01DB\u01DA\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x03" + + "\x02\x02\x02\u01DD\u01DE\x07\x05\x02\x02\u01DE\u0256\x03\x02\x02\x02\u01DF" + + "\u01E0\x07.\x02\x02\u01E0\u01E1\x07\x04\x02\x02\u01E1\u01E6\x05,\x17\x02" + + "\u01E2\u01E3\x07\n\x02\x02\u01E3\u01E5\x05,\x17\x02\u01E4\u01E2\x03\x02" + + "\x02\x02\u01E5\u01E8\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6" + + "\u01E7\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + + "\x02\x02\u01E9\u01EB\x07\n\x02\x02\u01EA\u01E9\x03\x02\x02\x02\u01EA\u01EB" + + "\x03\x02\x02\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01ED\x07\x05\x02\x02" + + "\u01ED\u0256\x03\x02\x02\x02\u01EE\u0256\x05.\x18\x02\u01EF\u01F0\x07" + + "#\x02\x02"; private static readonly _serializedATNSegment1: string = - "\x07\x04\x02\x02\u01ED\u01F2\x05.\x18\x02\u01EE\u01EF\x07\n\x02\x02\u01EF" + - "\u01F1\x05.\x18\x02\u01F0\u01EE\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02" + - "\x02\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F6" + - "\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5\u01F7\x07\n\x02\x02" + - "\u01F6\u01F5\x03\x02\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01F8\x03" + - "\x02\x02\x02\u01F8\u01F9\x07\x05\x02\x02\u01F9\u0265\x03\x02\x02\x02\u01FA" + - "\u0265\x050\x19\x02\u01FB\u01FC\x07#\x02\x02\u01FC\u01FD\x07\x04\x02\x02" + - "\u01FD\u0202\x05.\x18\x02\u01FE\u01FF\x07\n\x02\x02\u01FF\u0201\x05.\x18" + - "\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200" + - "\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203\u0206\x03\x02\x02\x02" + - "\u0204\u0202\x03\x02\x02\x02\u0205\u0207\x07\n\x02\x02\u0206\u0205\x03" + - "\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207\u0208\x03\x02\x02\x02\u0208" + - "\u0209\x07\x05\x02\x02\u0209\u0265\x03\x02\x02\x02\u020A\u020B\x07$\x02" + - "\x02\u020B\u020C\x07\x04\x02\x02\u020C\u0211\x05.\x18\x02\u020D\u020E" + - "\x07\n\x02\x02\u020E\u0210\x05.\x18\x02\u020F\u020D\x03\x02\x02\x02\u0210" + - "\u0213\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0211\u0212\x03\x02" + - "\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0214" + - "\u0216\x07\n\x02\x02\u0215\u0214\x03\x02\x02\x02\u0215\u0216\x03\x02\x02" + - "\x02\u0216\u0217\x03\x02\x02\x02\u0217\u0218\x07\x05\x02\x02\u0218\u0265" + - "\x03\x02\x02\x02\u0219\u021E\x05R*\x02\u021A\u021E\x07,\x02\x02\u021B" + - "\u021E\x07+\x02\x02\u021C\u021E\x07*\x02\x02\u021D\u0219\x03\x02\x02\x02" + - "\u021D\u021A\x03\x02\x02\x02\u021D\u021B\x03\x02\x02\x02\u021D\u021C\x03" + - "\x02\x02\x02\u021E\u0265\x03\x02\x02\x02\u021F\u0220\x07?\x02\x02\u0220" + - "\u0221\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0227\x05.\x18\x02" + - "\u0223\u0224\x07\n\x02\x02\u0224\u0226\x05.\x18\x02\u0225\u0223\x03\x02" + - "\x02\x02\u0226\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0227" + - "\u0228\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227\x03\x02" + - "\x02\x02\u022A\u022C\x07\n\x02\x02\u022B\u022A\x03\x02\x02\x02\u022B\u022C" + - "\x03\x02\x02\x02\u022C\u022D\x03\x02\x02\x02\u022D\u022E\x07@\x02\x02" + - "\u022E\u0265\x03\x02\x02\x02\u022F\u0230\x07?\x02\x02\u0230\u0265\x07" + - "@\x02\x02\u0231\u0232\x07\x04\x02\x02\u0232\u0237\x05H%\x02\u0233\u0234" + - "\x07\n\x02\x02\u0234\u0236\x05H%\x02\u0235\u0233\x03\x02\x02\x02\u0236" + - "\u0239\x03\x02\x02\x02\u0237\u0235\x03\x02\x02\x02\u0237\u0238\x03\x02" + - "\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u023A" + - "\u023C\x07\n\x02\x02\u023B\u023A\x03\x02\x02\x02\u023B\u023C\x03\x02\x02" + - "\x02\u023C\u023D\x03\x02\x02\x02\u023D\u023E\x07\x05\x02\x02\u023E\u0265" + - "\x03\x02\x02\x02\u023F\u0248\x07\r\x02\x02\u0240\u0245\x05.\x18\x02\u0241" + - "\u0242\x07\n\x02\x02\u0242\u0244\x05.\x18\x02\u0243\u0241\x03\x02\x02" + - "\x02\u0244\u0247\x03\x02\x02\x02\u0245\u0243\x03\x02\x02\x02\u0245\u0246" + - "\x03\x02\x02\x02\u0246\u0249\x03\x02\x02\x02\u0247\u0245\x03\x02\x02\x02" + - "\u0248\u0240\x03\x02\x02\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024B\x03" + - "\x02\x02\x02\u024A\u024C\x07\n\x02\x02\u024B\u024A\x03\x02\x02\x02\u024B" + - "\u024C\x03\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u0265\x07\x0E" + - "\x02\x02\u024E\u024F\x07%\x02\x02\u024F\u0250\x07?\x02\x02\u0250\u0251" + - "\x05.\x18\x02\u0251\u0252\x07@\x02\x02\u0252\u0253\x05.\x18\x02\u0253" + - "\u0254\x07&\x02\x02\u0254\u0255\x05.\x18\x07\u0255\u0265\x03\x02\x02\x02" + - "\u0256\u0257\x05\n\x06\x02\u0257\u0258\x05.\x18\x06\u0258\u0265\x03\x02" + - "\x02\x02\u0259\u025A\x05\x14\v\x02\u025A\u025B\x05.\x18\x05\u025B\u0265" + - "\x03\x02\x02\x02\u025C\u025D\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E" + - "\u025F\x07@\x02\x02\u025F\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02" + - "\x02\u0261\u0262\x05.\x18\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265" + - "\x03\x02\x02\x02\u0264\u01CC\x03\x02\x02\x02\u0264\u01CE\x03\x02\x02\x02" + - "\u0264\u01D5\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02\u0264\u01DC\x03" + - "\x02\x02\x02\u0264\u01EB\x03\x02\x02\x02\u0264\u01FA\x03\x02\x02\x02\u0264" + - "\u01FB\x03\x02\x02\x02\u0264\u020A\x03\x02\x02\x02\u0264\u021D\x03\x02" + - "\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u022F\x03\x02\x02\x02\u0264" + - "\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264\u024E\x03\x02" + - "\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02\x02\x02\u0264" + - "\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265\u0297\x03\x02" + - "\x02\x02\u0266\u0267\f\x1D\x02\x02\u0267\u0268\x07!\x02\x02\u0268\u0296" + - "\x05.\x18\x1D\u0269\u026A\f\x1B\x02\x02\u026A\u026B\t\x02\x02\x02\u026B" + - "\u0296\x05.\x18\x1C\u026C\u026D\f\x1A\x02\x02\u026D\u026E\t\x03\x02\x02" + - "\u026E\u0296\x05.\x18\x1B\u026F\u0270\f\x19\x02\x02\u0270\u0271\t\x04" + - "\x02\x02\u0271\u0296\x05.\x18\x1A\u0272\u0273\f\x17\x02\x02\u0273\u0274" + - "\x07>\x02\x02\u0274\u0275\x05.\x18\x18\u0275\u0276\b\x18\x01\x02\u0276" + - "\u0296\x03\x02\x02\x02\u0277\u0278\f\x15\x02\x02\u0278\u0279\x07-\x02" + - "\x02\u0279\u0296\x05.\x18\x16\u027A\u027B\f\x13\x02\x02\u027B\u027C\x07" + - ".\x02\x02\u027C\u0296\x05.\x18\x14\u027D\u027E\f\x12\x02\x02\u027E\u027F" + - "\x07/\x02\x02\u027F\u0296\x05.\x18\x13\u0280\u0281\f\x11\x02\x02\u0281" + - "\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x12\u0283\u0284\f\n\x02\x02\u0284" + - "\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286\u0287\f!\x02\x02\u0287" + - "\u0288\x07\x18\x02\x02\u0288\u028E\x05L\'\x02\u0289\u028B\x07?\x02\x02" + - "\u028A\u028C\x05F$\x02\u028B\u028A\x03\x02\x02\x02\u028B\u028C\x03\x02" + - "\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07@\x02\x02\u028E\u0289" + - "\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F\u0296\x03\x02\x02\x02" + - "\u0290\u0291\f\x1E\x02\x02\u0291\u0292\x07\r\x02\x02\u0292\u0293\x05." + - "\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296\x03\x02\x02\x02\u0295" + - "\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02\u0295\u026C\x03\x02" + - "\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03\x02\x02\x02\u0295" + - "\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295\u027D\x03\x02" + - "\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02\x02\x02\u0295" + - "\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296\u0299\x03\x02" + - "\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298" + - "/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B\x072\x02\x02" + - "\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D\u029F\x07" + - "\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F" + - "\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2\x07\x0F\x02" + - "\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4\u02A7" + - "\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02" + - "\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\x07" + - "\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02\u02AB\u02AD" + - "\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03\x02\x02\x02" + - "\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF\u02B0\x05" + - ".\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05T+\x02\u02B2\u02B5\x07" + - "?\x02\x02\u02B3\u02B6\x05T+\x02\u02B4\u02B6\x07\'\x02\x02\u02B5\u02B3" + - "\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02" + - "\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9\x03" + - "\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB\u02BC" + - "\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18\x02" + - "\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1\x07" + - "E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03\u02C3" + - "\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03\x02" + - "\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5\u02C8" + - "\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7" + - "\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!\x02\u02CA" + - "\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB\x03\x02\x02" + - "\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF\u02D0\x07\n" + - "\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2\u02D5" + - "\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02" + - "\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6\u02D7\x07" + - "@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02\u02D9\u02DB" + - "\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03\x02\x02\x02" + - "\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE\x07?\x02" + - "\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2\x05@" + - "!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E1" + - "\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02\x02\x02" + - "\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8\x07\x1D" + - "\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA\u02ED\x07" + - "\'\x02\x02\u02EB\u02ED\x05R*\x02\u02EC\u02EA\x03\x02\x02\x02\u02EC\u02EB" + - "\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> \x02\u02EFA\x03" + - "\x02\x02\x02\u02F0\u02F1\x05> \x02\u02F1\u02F2\x07\x07\x02\x02\u02F2\u02F3" + - "\x05&\x14\x02\u02F3C\x03\x02\x02\x02\u02F4\u02F7\x075\x02\x02\u02F5\u02F7" + - "\x05R*\x02\u02F6\u02F4\x03\x02\x02\x02\u02F6\u02F5\x03\x02\x02\x02\u02F7" + - "E\x03\x02\x02\x02\u02F8\u02FD\x05.\x18\x02\u02F9\u02FA\x07\n\x02\x02\u02FA" + - "\u02FC\x05.\x18\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FF\x03\x02\x02" + - "\x02\u02FD\u02FB\x03\x02\x02\x02\u02FD\u02FE\x03\x02\x02\x02\u02FEG\x03" + - "\x02\x02\x02\u02FF\u02FD\x03\x02\x02\x02\u0300\u0301\x05T+\x02\u0301\u0302" + - "\x07\x07\x02\x02\u0302\u0303\x05.\x18\x02\u0303\u0307\x03\x02\x02\x02" + - "\u0304\u0305\x07(\x02\x02\u0305\u0307\x05.\x18\x02\u0306\u0300\x03\x02" + - "\x02\x02\u0306\u0304\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B" + - "\x05R*\x02\u0309\u030B\t\x05\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A" + - "\u0309\x03\x02\x02\x02\u030BK\x03\x02\x02\x02\u030C\u030F\x05R*\x02\u030D" + - "\u030F\t\x06\x02\x02\u030E\u030C\x03\x02\x02\x02\u030E\u030D\x03\x02\x02" + - "\x02\u030FM\x03\x02\x02\x02\u0310\u0311\t\x07\x02\x02\u0311O\x03\x02\x02" + - "\x02\u0312\u0313\t\b\x02\x02\u0313Q\x03\x02\x02\x02\u0314\u0319\x05V," + - "\x02\u0315\u0316\x07)\x02\x02\u0316\u0318\x05V,\x02\u0317\u0315\x03\x02" + - "\x02\x02\u0318\u031B\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u0319" + - "\u031A\x03\x02\x02\x02\u031AS\x03\x02\x02\x02\u031B\u0319\x03\x02\x02" + - "\x02\u031C\u0321\x05V,\x02\u031D\u031E\x05R*\x02\u031E\u031F\b+\x01\x02" + - "\u031F\u0321\x03\x02\x02\x02\u0320\u031C\x03\x02\x02\x02\u0320\u031D\x03" + - "\x02\x02\x02\u0321U\x03\x02\x02\x02\u0322\u0323\t\t\x02\x02\u0323W\x03" + - "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + - "\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131" + - "\u0139\u0148\u0150\u0152\u0163\u0166\u0169\u0182\u0186\u018C\u019F\u01A4" + - "\u01AC\u01AE\u01BE\u01C4\u01C8\u01D1\u01E3\u01E7\u01F2\u01F6\u0202\u0206" + - "\u0211\u0215\u021D\u0227\u022B\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + - "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + - "\u02E3\u02EC\u02F6\u02FD\u0306\u030A\u030E\u0319\u0320"; + "\u01F0\u01F1\x07\x04\x02\x02\u01F1\u01F6\x05,\x17\x02\u01F2\u01F3\x07" + + "\n\x02\x02\u01F3\u01F5\x05,\x17\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5" + + "\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + + "\x02\x02\u01F7\u01FA\x03\x02\x02\x02\u01F8\u01F6\x03\x02\x02\x02\u01F9" + + "\u01FB\x07\n\x02\x02\u01FA\u01F9\x03\x02\x02\x02\u01FA\u01FB\x03\x02\x02" + + "\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC\u01FD\x07\x05\x02\x02\u01FD\u0256" + + "\x03\x02\x02\x02\u01FE\u01FF\x07$\x02\x02\u01FF\u0200\x07\x04\x02\x02" + + "\u0200\u0205\x05,\x17\x02\u0201\u0202\x07\n\x02\x02\u0202\u0204\x05,\x17" + + "\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\x07\x05\x02\x02\u020C\u0256\x03\x02\x02\x02\u020D\u0212\x05P)\x02" + + "\u020E\u0212\x07,\x02\x02\u020F\u0212\x07+\x02\x02\u0210\u0212\x07*\x02" + + "\x02\u0211\u020D\x03\x02\x02\x02\u0211\u020E\x03\x02\x02\x02\u0211\u020F" + + "\x03\x02\x02\x02\u0211\u0210\x03\x02\x02\x02\u0212\u0256\x03\x02\x02\x02" + + "\u0213\u0214\x07?\x02\x02\u0214\u0215\x05,\x17\x02\u0215\u0216\x07\n\x02" + + "\x02\u0216\u021B\x05,\x17\x02\u0217\u0218\x07\n\x02\x02\u0218\u021A\x05" + + ",\x17\x02\u0219\u0217\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B" + + "\u0219\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021F\x03\x02" + + "\x02\x02\u021D\u021B\x03\x02\x02\x02\u021E\u0220\x07\n\x02\x02\u021F\u021E" + + "\x03\x02\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02" + + "\u0221\u0222\x07@\x02\x02\u0222\u0256\x03\x02\x02\x02\u0223\u0224\x07" + + "?\x02\x02\u0224\u0256\x07@\x02\x02\u0225\u0226\x07\x04\x02\x02\u0226\u022B" + + "\x05F$\x02\u0227\u0228\x07\n\x02\x02\u0228\u022A\x05F$\x02\u0229\u0227" + + "\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02\u022B\u0229\x03\x02\x02\x02" + + "\u022B\u022C\x03\x02\x02\x02\u022C\u022F\x03\x02\x02\x02\u022D\u022B\x03" + + "\x02\x02\x02\u022E\u0230\x07\n\x02\x02\u022F\u022E\x03\x02\x02\x02\u022F" + + "\u0230\x03\x02\x02\x02\u0230\u0231\x03\x02\x02\x02\u0231\u0232\x07\x05" + + "\x02\x02\u0232\u0256\x03\x02\x02\x02\u0233\u023C\x07\r\x02\x02\u0234\u0239" + + "\x05,\x17\x02\u0235\u0236\x07\n\x02\x02\u0236\u0238\x05,\x17\x02\u0237" + + "\u0235\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02" + + "\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023D\x03\x02\x02\x02\u023B" + + "\u0239\x03\x02\x02\x02\u023C\u0234\x03\x02\x02\x02\u023C\u023D\x03\x02" + + "\x02\x02\u023D\u023F\x03\x02\x02\x02\u023E\u0240\x07\n\x02\x02\u023F\u023E" + + "\x03\x02\x02\x02\u023F\u0240\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02" + + "\u0241\u0256\x07\x0E\x02\x02\u0242\u0243\x07%\x02\x02\u0243\u0244\x07" + + "?\x02\x02\u0244\u0245\x05,\x17\x02\u0245\u0246\x07@\x02\x02\u0246\u0247" + + "\x05,\x17\x02\u0247\u0248\x07&\x02\x02\u0248\u0249\x05,\x17\x06\u0249" + + "\u0256\x03\x02\x02\x02\u024A\u024B\x05\n\x06\x02\u024B\u024C\x05,\x17" + + "\x05\u024C\u0256\x03\x02\x02\x02\u024D\u024E\x07?\x02\x02\u024E\u024F" + + "\x05,\x17\x02\u024F\u0250\x07@\x02\x02\u0250\u0256\x03\x02\x02\x02\u0251" + + "\u0252\x07\x04\x02\x02\u0252\u0253\x05,\x17\x02\u0253\u0254\x07\x05\x02" + + "\x02\u0254\u0256\x03\x02\x02\x02\u0255\u01C0\x03\x02\x02\x02\u0255\u01C2" + + "\x03\x02\x02\x02\u0255\u01C9\x03\x02\x02\x02\u0255\u01CB\x03\x02\x02\x02" + + "\u0255\u01D0\x03\x02\x02\x02\u0255\u01DF\x03\x02\x02\x02\u0255\u01EE\x03" + + "\x02\x02\x02\u0255\u01EF\x03\x02\x02\x02\u0255\u01FE\x03\x02\x02\x02\u0255" + + "\u0211\x03\x02\x02\x02\u0255\u0213\x03\x02\x02\x02\u0255\u0223\x03\x02" + + "\x02\x02\u0255\u0225\x03\x02\x02\x02\u0255\u0233\x03\x02\x02\x02\u0255" + + "\u0242\x03\x02\x02\x02\u0255\u024A\x03\x02\x02\x02\u0255\u024D\x03\x02" + + "\x02\x02\u0255\u0251\x03\x02\x02\x02\u0256\u0288\x03\x02\x02\x02\u0257" + + "\u0258\f\x1C\x02\x02\u0258\u0259\x07!\x02\x02\u0259\u0287\x05,\x17\x1C" + + "\u025A\u025B\f\x1A\x02\x02\u025B\u025C\t\x02\x02\x02\u025C\u0287\x05," + + "\x17\x1B\u025D\u025E\f\x19\x02\x02\u025E\u025F\t\x03\x02\x02\u025F\u0287" + + "\x05,\x17\x1A\u0260\u0261\f\x18\x02\x02\u0261\u0262\t\x04\x02\x02\u0262" + + "\u0287\x05,\x17\x19\u0263\u0264\f\x16\x02\x02\u0264\u0265\x07>\x02\x02" + + "\u0265\u0266\x05,\x17\x17\u0266\u0267\b\x17\x01\x02\u0267\u0287\x03\x02" + + "\x02\x02\u0268\u0269\f\x14\x02\x02\u0269\u026A\x07-\x02\x02\u026A\u0287" + + "\x05,\x17\x15\u026B\u026C\f\x12\x02\x02\u026C\u026D\x07.\x02\x02\u026D" + + "\u0287\x05,\x17\x13\u026E\u026F\f\x11\x02\x02\u026F\u0270\x07/\x02\x02" + + "\u0270\u0287\x05,\x17\x12\u0271\u0272\f\x10\x02\x02\u0272\u0273\x070\x02" + + "\x02\u0273\u0287\x05,\x17\x11\u0274\u0275\f\t\x02\x02\u0275\u0276\x07" + + "\x1C\x02\x02\u0276\u0287\x05,\x17\n\u0277\u0278\f \x02\x02\u0278\u0279" + + "\x07\x18\x02\x02\u0279\u027F\x05J&\x02\u027A\u027C\x07?\x02\x02\u027B" + + "\u027D\x05D#\x02\u027C\u027B\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02" + + "\u027D\u027E\x03\x02\x02\x02\u027E\u0280\x07@\x02\x02\u027F\u027A\x03" + + "\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0287\x03\x02\x02\x02\u0281" + + "\u0282\f\x1D\x02\x02\u0282\u0283\x07\r\x02\x02\u0283\u0284\x05,\x17\x02" + + "\u0284\u0285\x07\x0E\x02\x02\u0285\u0287\x03\x02\x02\x02\u0286\u0257\x03" + + "\x02\x02\x02\u0286\u025A\x03\x02\x02\x02\u0286\u025D\x03\x02\x02\x02\u0286" + + "\u0260\x03\x02\x02\x02\u0286\u0263\x03\x02\x02\x02\u0286\u0268\x03\x02" + + "\x02\x02\u0286\u026B\x03\x02\x02\x02\u0286\u026E\x03\x02\x02\x02\u0286" + + "\u0271\x03\x02\x02\x02\u0286\u0274\x03\x02\x02\x02\u0286\u0277\x03\x02" + + "\x02\x02\u0286\u0281\x03\x02\x02\x02\u0287\u028A\x03\x02\x02\x02\u0288" + + "\u0286\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289-\x03\x02\x02" + + "\x02\u028A\u0288\x03\x02\x02\x02\u028B\u028C\x072\x02\x02\u028C\u028D" + + "\x05,\x17\x02\u028D\u028F\x07\x04\x02\x02\u028E\u0290\x07\x0F\x02\x02" + + "\u028F\u028E\x03\x02\x02\x02\u028F\u0290\x03\x02\x02\x02\u0290\u0291\x03" + + "\x02\x02\x02\u0291\u0296\x050\x19\x02\u0292\u0293\x07\x0F\x02\x02\u0293" + + "\u0295\x050\x19\x02\u0294\u0292\x03\x02\x02\x02\u0295\u0298\x03\x02\x02" + + "\x02\u0296\u0294\x03\x02\x02\x02\u0296\u0297\x03\x02\x02\x02\u0297\u0299" + + "\x03\x02\x02\x02\u0298\u0296\x03\x02\x02\x02\u0299\u029A\x07\x05\x02\x02" + + "\u029A/\x03\x02\x02\x02\u029B\u029E\x052\x1A\x02\u029C\u029E\x07\'\x02" + + "\x02\u029D\u029B\x03\x02\x02\x02\u029D\u029C\x03\x02\x02\x02\u029E\u029F" + + "\x03\x02\x02\x02\u029F\u02A0\x07\x1D\x02\x02\u02A0\u02A1\x05,\x17\x02" + + "\u02A11\x03\x02\x02\x02\u02A2\u02A9\x05R*\x02\u02A3\u02A6\x07?\x02\x02" + + "\u02A4\u02A7\x05R*\x02\u02A5\u02A7\x07\'\x02\x02\u02A6\u02A4\x03\x02\x02" + + "\x02\u02A6\u02A5\x03\x02\x02\x02\u02A7\u02A8\x03\x02\x02\x02\u02A8\u02AA" + + "\x07@\x02\x02\u02A9\u02A3\x03\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02" + + "\u02AA3\x03\x02\x02\x02\u02AB\u02AC\x05\b\x05\x02\u02AC\u02AD\x07\x02" + + "\x02\x03\u02AD\u02B5\x03\x02\x02\x02\u02AE\u02AF\x05,\x17\x02\u02AF\u02B0" + + "\x07\x02\x02\x03\u02B0\u02B5\x03\x02\x02\x02\u02B1\u02B2\x07E\x02\x02" + + "\u02B2\u02B5\x07\x02\x02\x03\u02B3\u02B5\x07\x02\x02\x03\u02B4\u02AB\x03" + + "\x02\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B1\x03\x02\x02\x02\u02B4" + + "\u02B3\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B9\x058\x1D\x02" + + "\u02B7\u02B9\x05:\x1E\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B7\x03" + + "\x02\x02\x02\u02B97\x03\x02\x02\x02\u02BA\u02BB\x05> \x02\u02BB\u02BC" + + "\x07\x1D\x02\x02\u02BC\u02BD\x05,\x17\x02\u02BD\u02CC\x03\x02\x02\x02" + + "\u02BE\u02BF\x07?\x02\x02\u02BF\u02C4\x05> \x02\u02C0\u02C1\x07\n\x02" + + "\x02\u02C1\u02C3\x05> \x02\u02C2\u02C0\x03\x02\x02\x02\u02C3\u02C6\x03" + + "\x02\x02\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5" + + "\u02C7\x03\x02\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02C8\x07@\x02" + + "\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05,\x17\x02\u02CA\u02CC" + + "\x03\x02\x02\x02\u02CB\u02BA\x03\x02\x02\x02\u02CB\u02BE\x03\x02\x02\x02" + + "\u02CC9\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02CF\x07?\x02" + + "\x02\u02CF\u02D2\x05> \x02\u02D0\u02D1\x07\n\x02\x02\u02D1\u02D3\x05>" + + " \x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02\u02D4\u02D2" + + "\x03\x02\x02\x02\u02D4\u02D5\x03\x02\x02\x02\u02D5\u02D6\x03\x02\x02\x02" + + "\u02D6\u02D7\x07@\x02\x02\u02D7\u02D8\x07@\x02\x02\u02D8\u02D9\x07\x1D" + + "\x02\x02\u02D9\u02DA\x05,\x17\x02\u02DA;\x03\x02\x02\x02\u02DB\u02DE\x07" + + "\'\x02\x02\u02DC\u02DE\x05P)\x02\u02DD\u02DB\x03\x02\x02\x02\u02DD\u02DC" + + "\x03\x02\x02\x02\u02DE=\x03\x02\x02\x02\u02DF\u02E0\x05<\x1F\x02\u02E0" + + "?\x03\x02\x02\x02\u02E1\u02E2\x05<\x1F\x02\u02E2\u02E3\x07\x07\x02\x02" + + "\u02E3\u02E4\x05$\x13\x02\u02E4A\x03\x02\x02\x02\u02E5\u02E8\x075\x02" + + "\x02\u02E6\u02E8\x05P)\x02\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E6\x03" + + "\x02\x02\x02\u02E8C\x03\x02\x02\x02\u02E9\u02EE\x05,\x17\x02\u02EA\u02EB" + + "\x07\n\x02\x02\u02EB\u02ED\x05,\x17\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED" + + "\u02F0\x03\x02\x02\x02\u02EE\u02EC\x03\x02\x02\x02\u02EE\u02EF\x03\x02" + + "\x02\x02\u02EFE\x03\x02\x02\x02\u02F0\u02EE\x03\x02\x02\x02\u02F1\u02F2" + + "\x05R*\x02\u02F2\u02F3\x07\x07\x02\x02\u02F3\u02F4\x05,\x17\x02\u02F4" + + "\u02F8\x03\x02\x02\x02\u02F5\u02F6\x07(\x02\x02\u02F6\u02F8\x05,\x17\x02" + + "\u02F7\u02F1\x03\x02\x02\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8G\x03\x02" + + "\x02\x02\u02F9\u02FC\x05P)\x02\u02FA\u02FC\t\x05\x02\x02\u02FB\u02F9\x03" + + "\x02\x02\x02\u02FB\u02FA\x03\x02\x02\x02\u02FCI\x03\x02\x02\x02\u02FD" + + "\u0300\x05P)\x02\u02FE\u0300\t\x06\x02\x02\u02FF\u02FD\x03\x02\x02\x02" + + "\u02FF\u02FE\x03\x02\x02\x02\u0300K\x03\x02\x02\x02\u0301\u0302\t\x07" + + "\x02\x02\u0302M\x03\x02\x02\x02\u0303\u0304\t\b\x02\x02\u0304O\x03\x02" + + "\x02\x02\u0305\u030A\x05T+\x02\u0306\u0307\x07)\x02\x02\u0307\u0309\x05" + + "T+\x02\u0308\u0306\x03\x02\x02\x02\u0309\u030C\x03\x02\x02\x02\u030A\u0308" + + "\x03\x02\x02\x02\u030A\u030B\x03\x02\x02\x02\u030BQ\x03\x02\x02\x02\u030C" + + "\u030A\x03\x02\x02\x02\u030D\u0312\x05T+\x02\u030E\u030F\x05P)\x02\u030F" + + "\u0310\b*\x01\x02\u0310\u0312\x03\x02\x02\x02\u0311\u030D\x03\x02\x02" + + "\x02\u0311\u030E\x03\x02\x02\x02\u0312S\x03\x02\x02\x02\u0313\u0314\t" + + "\t\x02\x02\u0314U\x03\x02\x02\x02XY`iq\x8A\x94\x9C\x9F\xA9\xAC\xAF\xB3" + + "\xB7\xBA\xBC\xCA\xD3\xD7\xDA\xE1\xE9\xF5\xFD\u0103\u0107\u0109\u0114\u0116" + + "\u0125\u012D\u013C\u0144\u0146\u0157\u015A\u015D\u0176\u017A\u0180\u0193" + + "\u0198\u01A0\u01A2\u01B2\u01B8\u01BC\u01C5\u01D7\u01DB\u01E6\u01EA\u01F6" + + "\u01FA\u0205\u0209\u0211\u021B\u021F\u022B\u022F\u0239\u023C\u023F\u0255" + + "\u027C\u027F\u0286\u0288\u028F\u0296\u029D\u02A6\u02A9\u02B4\u02B8\u02C4" + + "\u02CB\u02D4\u02DD\u02E7\u02EE\u02F7\u02FB\u02FF\u030A\u0311"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4851,45 +4785,6 @@ export class TypeSumVariantContext extends ParserRuleContext { } -export class NondetOperDefContext extends ParserRuleContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); - } - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - public type(): TypeContext | undefined { - return this.tryGetRuleContext(0, TypeContext); - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); - } - // @Override - public get ruleIndex(): number { return QuintParser.RULE_nondetOperDef; } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondetOperDef) { - listener.enterNondetOperDef(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondetOperDef) { - listener.exitNondetOperDef(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondetOperDef) { - return visitor.visitNondetOperDef(this); - } else { - return visitor.visitChildren(this); - } - } -} - - export class QualifierContext extends ParserRuleContext { constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -6742,38 +6637,6 @@ export class LetInContext extends ExprContext { } } } -export class NondetContext extends ExprContext { - public nondetOperDef(): NondetOperDefContext { - return this.getRuleContext(0, NondetOperDefContext); - } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - constructor(ctx: ExprContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); - } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondet) { - listener.enterNondet(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondet) { - listener.exitNondet(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondet) { - return visitor.visitNondet(this); - } else { - return visitor.visitChildren(this); - } - } -} export class ParenContext extends ExprContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public expr(): ExprContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index cd053a7a2..f8a3bbb4c 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -54,7 +54,6 @@ import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; import { AnnotatedOperDefContext } from "./QuintParser"; @@ -76,7 +75,6 @@ import { TypeDefContext } from "./QuintParser"; import { TypeDefHeadContext } from "./QuintParser"; import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -480,14 +478,6 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitLetIn?: (ctx: LetInContext) => Result; - /** - * Visit a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - * @return the visitor result - */ - visitNondet?: (ctx: NondetContext) => Result; - /** * Visit a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. @@ -647,13 +637,6 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeSumVariant?: (ctx: TypeSumVariantContext) => Result; - /** - * Visit a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - * @return the visitor result - */ - visitNondetOperDef?: (ctx: NondetOperDefContext) => Result; - /** * Visit a parse tree produced by `QuintParser.qualifier`. * @param ctx the parse tree diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 777c457a1..bcf595c60 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -77,6 +77,9 @@ class NameResolver implements IRVisitor { if (this.definitionDepth > 0) { this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) } + + // Map the definition to itself so we can recover depth information from the table + this.table.set(def.id, { ...def, depth: this.definitionDepth }) } exitLet(expr: QuintLet): void { diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 1f6901487..7bf370f2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -169,53 +169,6 @@ export class ToIrListener implements QuintListener { this.exprStack.push(letExpr) } - exitNondetOperDef(ctx: p.NondetOperDefContext) { - const name = ctx.qualId().text - let typeAnnotation: QuintType | undefined - if (ctx.type()) { - const maybeType = this.popType() - if (maybeType.isJust()) { - // the operator is tagged with a type - typeAnnotation = maybeType.value - } - } - const expr = this.exprStack.pop() ?? this.undefinedExpr(ctx)() - - const id = this.getId(ctx) - - const def: QuintDef = { - id, - kind: 'def', - name, - qualifier: 'nondet', - expr, - typeAnnotation, - } - - this.declarationStack.push(def) - } - - // special case for: nondet x = e1; e2 - exitNondet(ctx: p.NondetContext) { - const def = this.declarationStack.pop() ?? this.undefinedDeclaration(ctx)() - const nested = this.exprStack.pop() ?? this.undefinedExpr(ctx)() - - if (def.kind !== 'def') { - // only `QuintDef` is allowed in `nondet` expressions - console.debug(`[DEBUG] non-def found in nondet definition: ${ctx.text}`) - return - } - - const id = this.getId(ctx) - const letExpr: QuintEx = { - id, - kind: 'let', - opdef: def, - expr: nested, - } - this.exprStack.push(letExpr) - } - /** **************** translate operator definititons **********************/ // translate a top-level or nested operator definition diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 48e54fdeb..8f77241ec 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -101,7 +101,7 @@ class QuintAnalyzer { this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) - this.nondetChecker = new NondetChecker() + this.nondetChecker = new NondetChecker(lookupTable) } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 8d0862716..03a3d6955 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -73,6 +73,8 @@ export type ErrorCode = | 'QNT204' /* QNT205: nondet bindings can only be used with boolean expressions */ | 'QNT205' + /* QNT206: 'nondet' can only be used inside actions, not at the top level */ + | 'QNT206' /* QNT404: Name '' not found */ | 'QNT404' /* QNT405: Module '' not found */ diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index 2f3f454ce..d7d40d647 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -5,10 +5,8 @@ import { NondetChecker } from '../../src/effects/NondetChecker' import { SourceLookupPath } from '../../src/parsing/sourceResolver' import { TypeInferrer } from '../../src/types/inferrer' -const checker = new NondetChecker() - describe('checkNondets', () => { - function moduleAndTypes(text: string) { + function parseAndTypecheck(text: string) { const idGen = newIdGenerator() const fake_path: SourceLookupPath = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' } const { modules, table, errors } = parse(idGen, 'fake_location', fake_path, text) @@ -18,7 +16,7 @@ describe('checkNondets', () => { const [typeErrors, types] = typeInferrer.inferTypes(modules[0].declarations) assert.isEmpty(typeErrors, `Unexpected type errors: ${[...typeErrors.values()].map(errorTreeToString)}`) - return { module: modules[0], types } + return { module: modules[0], table, types } } it('returns empty map for effects with no problems', () => { @@ -28,9 +26,9 @@ describe('checkNondets', () => { action foo = { nondet bar = Set(1,2).oneOf() x' = bar } }` - const { module, types } = moduleAndTypes(text) + const { module, table, types } = parseAndTypecheck(text) - const errors = checker.checkNondets(types, module.declarations) + const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) }) @@ -49,9 +47,9 @@ describe('checkNondets', () => { val non_action = { nondet bar = Set(1,2).oneOf() bar } }` - const { module, types } = moduleAndTypes(text) + const { module, table, types } = parseAndTypecheck(text) - const errors = checker.checkNondets(types, module.declarations) + const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.sameDeepMembers( [...errors.entries()], @@ -67,11 +65,20 @@ describe('checkNondets', () => { }, ], [ - 26n, + 24n, + { + code: 'QNT206', + message: "'nondet' can only be used inside actions, not at the top level", + reference: 24n, + data: {}, + }, + ], + [ + 31n, { code: 'QNT205', message: 'nondet bindings can only be used with boolean expressions', - reference: 26n, + reference: 31n, data: {}, }, ], diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index d0d502ee1..e4474cf22 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -82,6 +82,17 @@ describe('resolveNames', () => { { code: 'QNT404', message: "Name 'x' not found", reference: 0n, data: {} }, ]) }) + + it('finds a definition itself with depth information', () => { + const result = resolveNamesForExprs([], newIdGenerator()) + + assert.isEmpty(result.errors) + + const def = [...result.table.values()].find(def => def.name === 'unscoped_def' || def.kind === 'def') + + assert.isNotNull(def) + assert.deepEqual(result.table.get(def!.id)?.depth, 0) + }) }) describe('shadowing', () => { From 71cd1cf735b6b700aed8a053dbd54c1bb349cb3b Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:17:17 -0300 Subject: [PATCH 353/428] Update generated error messages --- quint/test/parsing/quintParserFrontend.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 1f2281e07..704926088 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -136,7 +136,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -147,7 +147,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -194,7 +194,7 @@ describe('syntax errors', () => { assert.isAtLeast(errors.length, 1) assert.equal( errors[0].message, - `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) From fef5ea7ec4278be8d2e6505056271dd1b40225eb Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:19:08 -0300 Subject: [PATCH 354/428] Return list of errors instead of map --- quint/src/effects/NondetChecker.ts | 34 +++++++++++---- quint/src/quintAnalyzer.ts | 4 +- quint/test/effects/NondetChecker.test.ts | 54 +++++++++--------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 1a1976957..55ed3ae04 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -1,3 +1,18 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Checking for the misuse of 'nondet' and 'oneOf'. Necessary to ensure they are + * compatible with the exists operator from TLA+. + * + * @author Gabriela Moreira + * + * @module + */ + import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' import { LookupTable } from '../names/base' @@ -9,20 +24,21 @@ export class NondetChecker implements IRVisitor { private types: Map = new Map() private lastDefQualifier: OpQualifier = 'def' - private errors: Map = new Map() + private errors: QuintError[] = [] constructor(table: LookupTable) { this.table = table } /** - * Checks effects for multiple updates of the same state variable. + * Checks declarations for misuse of 'nondet' and 'oneOf'. * - * @param effects the effects to look for multiple updates on + * @param types - the types of the declarations + * @param declarations - the declarations to check * - * @returns a map of errors, where the key is the variable id + * @returns a list of errors (empty if no errors are found) */ - checkNondets(types: Map, declarations: QuintDeclaration[]): Map { + checkNondets(types: Map, declarations: QuintDeclaration[]): QuintError[] { this.types = types declarations.forEach(d => walkDeclaration(this, d)) @@ -33,7 +49,7 @@ export class NondetChecker implements IRVisitor { this.lastDefQualifier = def.qualifier if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { - this.errors.set(def.id, { + this.errors.push({ code: 'QNT206', message: `'nondet' can only be used inside actions, not at the top level`, reference: def.id, @@ -49,7 +65,7 @@ export class NondetChecker implements IRVisitor { } if (this.lastDefQualifier !== 'nondet') { - this.errors.set(app.id, { + this.errors.push({ code: 'QNT203', message: `'oneOf' must be used inside a nondet definition`, reference: app.id, @@ -67,7 +83,7 @@ export class NondetChecker implements IRVisitor { // body of nondet must be an application of oneOf const body = expr.opdef.expr if (body.kind !== 'app' || body.opcode !== 'oneOf') { - this.errors.set(body.id, { + this.errors.push({ code: 'QNT204', message: `'oneOf' must be the outtermost expression in a nondet definition`, reference: body.id, @@ -78,7 +94,7 @@ export class NondetChecker implements IRVisitor { // if the opdef is nondet, the return type must be bool const expressionType = this.types.get(expr.expr.id) if (expressionType?.type.kind !== 'bool') { - this.errors.set(expr.id, { + this.errors.push({ code: 'QNT205', message: `nondet bindings can only be used with boolean expressions`, reference: expr.id, diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 8f77241ec..34412d745 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -111,7 +111,7 @@ class QuintAnalyzer { const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) - const nondetErrMap = this.nondetChecker.checkNondets(types, resolvedDecls) + const nondetErrors = this.nondetChecker.checkNondets(types, resolvedDecls) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] @@ -123,7 +123,7 @@ class QuintAnalyzer { }) ) - this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrMap.values()) + this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrors) // We assume that ids are unique across modules, and map merging can be done // without collision checks diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index d7d40d647..fd793c105 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -51,38 +51,26 @@ describe('checkNondets', () => { const errors = new NondetChecker(table).checkNondets(types, module.declarations) - assert.sameDeepMembers( - [...errors.entries()], - [ - [4n, { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }], - [ - 13n, - { - code: 'QNT204', - message: "'oneOf' must be the outtermost expression in a nondet definition", - reference: 13n, - data: {}, - }, - ], - [ - 24n, - { - code: 'QNT206', - message: "'nondet' can only be used inside actions, not at the top level", - reference: 24n, - data: {}, - }, - ], - [ - 31n, - { - code: 'QNT205', - message: 'nondet bindings can only be used with boolean expressions', - reference: 31n, - data: {}, - }, - ], - ] - ) + assert.sameDeepMembers(errors, [ + { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, + { + code: 'QNT204', + message: "'oneOf' must be the outtermost expression in a nondet definition", + reference: 13n, + data: {}, + }, + { + code: 'QNT206', + message: "'nondet' can only be used inside actions, not at the top level", + reference: 24n, + data: {}, + }, + { + code: 'QNT205', + message: 'nondet bindings can only be used with boolean expressions', + reference: 31n, + data: {}, + }, + ]) }) }) From 5cead19b1cfa5bc50abb1595986855b6edbcd500 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:35:54 -0300 Subject: [PATCH 355/428] Break down big test into units --- quint/test/effects/NondetChecker.test.ts | 63 +++++++++++++++++++----- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index fd793c105..7df3c8045 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -33,18 +33,25 @@ describe('checkNondets', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) }) - it('returns a map with errors for all problems', () => { + it('finds an error when oneOf is used in a val', () => { const text = `module A { - val a = Set(1,2).oneOf() // error: 'oneOf' must be used inside a nondet definition - var x: int + val a = Set(1,2).oneOf() + }` - // error: 'oneOf' must be the outtermost expression in a nondet definition - action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } + const { module, table, types } = parseAndTypecheck(text) - nondet top_level = Set(1,2).oneOf() // error: TODO + const errors = new NondetChecker(table).checkNondets(types, module.declarations) - // error: nondet bindings can only be used with boolean expressions - val non_action = { nondet bar = Set(1,2).oneOf() bar } + assert.sameDeepMembers(errors, [ + { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, + ]) + }) + + it('finds an error when oneOf is not the outtermost expression', () => { + const text = `module A { + var x: int + + action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } }` const { module, table, types } = parseAndTypecheck(text) @@ -52,23 +59,55 @@ describe('checkNondets', () => { const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.sameDeepMembers(errors, [ - { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, { code: 'QNT204', message: "'oneOf' must be the outtermost expression in a nondet definition", - reference: 13n, + reference: 8n, data: {}, }, + ]) + }) + + it('find an error when nondet is a top-level definition', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ { code: 'QNT206', message: "'nondet' can only be used inside actions, not at the top level", - reference: 24n, + reference: 7n, data: {}, }, + ]) + }) + + it('finds an error when the scope expression for the nondet binding is not boolean', () => { + // FIXME: ideally this should also complain about the top-level def not + // being an action. This requires the introduction of a new effect, which is + // not trivial. For now, checking for boolean returns should already help a + // lot. + const text = `module A { + // error: nondet bindings can only be used with boolean expressions + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ { code: 'QNT205', message: 'nondet bindings can only be used with boolean expressions', - reference: 31n, + reference: 7n, data: {}, }, ]) From 969fcbbfa4f308467c9e55448427faf588a68a76 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:44:47 -0300 Subject: [PATCH 356/428] Add CHANGELOG entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e8bfec05..038ccf2d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added static analysis checks to ensure proper usage of `nondet` and `oneOf` (#1431). + ### Changed ### Deprecated ### Removed From 3ba143bc2ef846bdd74d8cbe6c8643ee939b927c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:48:02 -0300 Subject: [PATCH 357/428] Fix nondet issue in ICS20 --- examples/cosmos/ics20/ics20.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cosmos/ics20/ics20.qnt b/examples/cosmos/ics20/ics20.qnt index 6ee7a5bee..83df4da90 100644 --- a/examples/cosmos/ics20/ics20.qnt +++ b/examples/cosmos/ics20/ics20.qnt @@ -611,7 +611,7 @@ module ics20Test { // Check that there is a single incoming acknowledgement on chain A, // that indicates failure. assert(chainStates.get("B").inAcknowledgements.size() == 1), - val ack = chainStates.get("B").inAcknowledgements.oneOf() + nondet ack = chainStates.get("B").inAcknowledgements.oneOf() assert(ack.success == false and ack.errorMessage == "transfer coins failed"), // Process the acknowledgement on chain A; this triggers step 3.6 above. From 53b073ca4da76cc3a1cbdc90a08a050604614064 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:56:56 -0300 Subject: [PATCH 358/428] Fix Lightclient example `nondet` misuse --- examples/README.md | 2 +- examples/cosmos/lightclient/Lightclient.qnt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/README.md b/examples/README.md index cf82deffe..0abecf829 100644 --- a/examples/README.md +++ b/examples/README.md @@ -66,7 +66,7 @@ listed without any additional command line arguments. | [cosmos/ics23/ics23.qnt](./cosmos/ics23/ics23.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/Blockchain.qnt](./cosmos/lightclient/Blockchain.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/lightclient/LCVerificationApi.qnt](./cosmos/lightclient/LCVerificationApi.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | -| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/typedefs.qnt](./cosmos/lightclient/typedefs.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/tendermint/Tendermint.qnt](./cosmos/tendermint/Tendermint.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/tendermint/TendermintModels.qnt](./cosmos/tendermint/TendermintModels.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/examples/cosmos/lightclient/Lightclient.qnt b/examples/cosmos/lightclient/Lightclient.qnt index 5d7f6458f..3a31d525e 100644 --- a/examples/cosmos/lightclient/Lightclient.qnt +++ b/examples/cosmos/lightclient/Lightclient.qnt @@ -199,7 +199,7 @@ module Lightclient { // Record that one more probe has been done (for complexity and model checking) nprobes' = nprobes + 1, // Verify the current block - nondet verdict = API::ValidAndVerified(latestVerified, current, true) + val verdict = API::ValidAndVerified(latestVerified, current, true) all { MonitorTransition(latestVerified, current, API::localClock, verdict), // Decide whether/how to continue From cf47cc08b1e2ef83e610543df1abf808b253361c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:02:09 -0300 Subject: [PATCH 359/428] Update test fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/TrivialTypeError.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_1010undefinedName.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1013unknownTypeLetIn.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1015noToplevelNondet.json | 2 +- quint/testFixture/_1020importFrom.json | 2 +- quint/testFixture/_1021importee1.json | 2 +- quint/testFixture/_1022importee2.json | 2 +- quint/testFixture/_1025importeeWithError.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- quint/testFixture/_1040compileError.json | 2 +- quint/testFixture/_1041compileConst.json | 2 +- quint/testFixture/_1042qualifiersInRecordsFieldsError.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 6e84ef117..588ec8bce 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"215":{"id":211,"name":"x","kind":"param","depth":1},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"250":{"id":249,"name":"x","kind":"param","depth":1},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param","depth":1},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/TrivialTypeError.json b/quint/testFixture/TrivialTypeError.json index 38134d759..b65970887 100644 --- a/quint/testFixture/TrivialTypeError.json +++ b/quint/testFixture/TrivialTypeError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 1749b6095..4fe24b7f7 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index f2b5ffce7..639d8a152 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index f04f2c675..d43c5188a 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0},"7":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1010undefinedName.json b/quint/testFixture/_1010undefinedName.json index 3699f8811..bece81daa 100644 --- a/quint/testFixture/_1010undefinedName.json +++ b/quint/testFixture/_1010undefinedName.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{"2":{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1},"depth":0},"5":{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"},"depth":0}},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 11ef1d678..4ef31dae3 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"6":{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}},"depth":0},"10":{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1013unknownTypeLetIn.json b/quint/testFixture/_1013unknownTypeLetIn.json index 9d555bbe3..a189470bf 100644 --- a/quint/testFixture/_1013unknownTypeLetIn.json +++ b/quint/testFixture/_1013unknownTypeLetIn.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index 745920eed..9c471ccea 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"2":{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"9":{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}},"depth":0},"13":{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}},"depth":0},"19":{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1},"depth":0}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1015noToplevelNondet.json b/quint/testFixture/_1015noToplevelNondet.json index ca7559437..e897d1a56 100644 --- a/quint/testFixture/_1015noToplevelNondet.json +++ b/quint/testFixture/_1015noToplevelNondet.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":2,"name":"topLevelNondet","declarations":[]}],"table":{},"errors":[{"explanation":"[QNT000] mismatched input 'nondet' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/_1015noToplevelNondet.qnt","start":{"line":2,"col":2,"index":101},"end":{"line":2,"col":7,"index":106}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"topLevelNondet","declarations":[{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]}}]}],"table":{"5":{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1020importFrom.json b/quint/testFixture/_1020importFrom.json index 20f774a29..e677b042c 100644 --- a/quint/testFixture/_1020importFrom.json +++ b/quint/testFixture/_1020importFrom.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{"5":{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"},"depth":0},"8":{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1021importee1.json b/quint/testFixture/_1021importee1.json index 3f8772f03..7199f3260 100644 --- a/quint/testFixture/_1021importee1.json +++ b/quint/testFixture/_1021importee1.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{"2":{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"},"depth":0},"6":{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1022importee2.json b/quint/testFixture/_1022importee2.json index abca5472d..d01b33dc9 100644 --- a/quint/testFixture/_1022importee2.json +++ b/quint/testFixture/_1022importee2.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{"2":{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 0849ac06c..0ab94dc1b 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":1},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index 41bd5f567..e5f70e895 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"10":{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index f45d277dc..7b66f056e 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"6":{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]},"depth":0},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},"17":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 88f583e0d..9bb8386dd 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1040compileError.json b/quint/testFixture/_1040compileError.json index 297159d06..34614cfef 100644 --- a/quint/testFixture/_1040compileError.json +++ b/quint/testFixture/_1040compileError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"7":{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1041compileConst.json b/quint/testFixture/_1041compileConst.json index 5aac7fd72..6e20291f3 100644 --- a/quint/testFixture/_1041compileConst.json +++ b/quint/testFixture/_1041compileConst.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"8":{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]},"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"14":{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json index bdd6bb145..0c498d357 100644 --- a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json +++ b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{"9":{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 53f0aa6b2..a160f1be9 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"8":{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"14":{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"21":{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 037d9dba6..24ade9562 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"9":{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"15":{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}},"depth":0},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"21":{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"24":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1},"40":{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 38644197e..80bfdfe94 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"22":{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}},"depth":0},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"28":{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"35":{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 48fb05ca0..a16d6f974 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1},"depth":0},"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1},"12":{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}},"depth":0}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 9f4d2b4df5e2c95551f88eda2f51e3b7e6b951e6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:13 -0300 Subject: [PATCH 360/428] Bump apalache to 0.44.11 --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index ac46dff63..ae00a7015 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.10' +const APALACHE_VERSION_TAG = '0.44.11' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 0ff281a7c381d3fe697131e529335db2a7f4f58e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:26 -0300 Subject: [PATCH 361/428] Update Apalache integration tests --- quint/apalache-tests.md | 75 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 56aa13c52..f377a9e77 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -235,38 +235,84 @@ quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE x - +VARIABLE + (* + @type: Int; + *) + x + +(* + @type: (() => A(UNIT) | B(Int)); +*) A == Variant("A", "U_OF_UNIT") +(* + @type: ((Int) => A(UNIT) | B(Int)); +*) B(__BParam_31) == Variant("B", __BParam_31) +(* + @type: ((a) => a); +*) foo_bar(id__123_35) == id__123_35 +(* + @type: (() => Int); +*) importedValue == 0 +(* + @type: (() => Int); +*) ApalacheCompilation_ModuleToInstantiate_C == 0 +(* + @type: (() => Bool); +*) altInit == x' := 0 +(* + @type: (() => Bool); +*) step == x' := (x + 1) +(* + @type: (() => Bool); +*) altStep == x' := (x + 0) +(* + @type: (() => Bool); +*) inv == x >= 0 +(* + @type: (() => Bool); +*) altInv == x >= 0 +(* + @type: (() => Int); +*) ApalacheCompilation_ModuleToInstantiate_instantiatedValue == ApalacheCompilation_ModuleToInstantiate_C +(* + @type: (() => Bool); +*) init == x' := (importedValue + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) +(* + @type: (() => Bool); +*) q_step == step +(* + @type: (() => Bool); +*) q_init == init ================================================================================ @@ -304,14 +350,29 @@ quint compile --target tlaplus --main ModuleToImport ./testFixture/ApalacheCompi EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants +(* + @type: (() => Bool); +*) step == TRUE +(* + @type: (() => Int); +*) importedValue == 0 +(* + @type: (() => Bool); +*) init == TRUE +(* + @type: (() => Bool); +*) q_init == init +(* + @type: (() => Bool); +*) q_step == step ================================================================================ @@ -333,10 +394,10 @@ The compiled module is not empty: EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE clockSync3_clockSync3Spec_time - -clockSync3_clockSync3Spec_Proc(clockSync3_clockSync3Spec_id_37) == - [id |-> clockSync3_clockSync3Spec_id_37] +VARIABLE + (* + @type: Int; + *) + clockSync3_clockSync3Spec_time -VARIABLE clockSync3_clockSync3Spec_hc ``` From beed65a58b0d9c07e38329f250aee0c556644b4f Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:51 -0300 Subject: [PATCH 362/428] Improve formatting of integration tests --- quint/io-cli-tests.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index d9744bc60..b1f4227b9 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -24,11 +24,15 @@ We want to ensure we do not throw uncaught exceptions when the input file is doesn't exist. - quint parse ../examples/non-existent.file +``` +quint parse ../examples/non-existent.file +``` - error: file ../examples/non-existent.file does not exist +``` +error: file ../examples/non-existent.file does not exist +``` ### User error on parse with junk after modules @@ -37,14 +41,18 @@ We want to ensure that the parser shows an error, when it detects junk in the end of file. - quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` +quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` - Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} - 9: the parser - ^^^ +``` +Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} +9: the parser + ^^^ - error: parsing failed +error: parsing failed +``` ### User error on parse with invalid input From 6fc173864a82b1a0400addc29d5460628b01fa24 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 7 May 2024 09:21:30 -0300 Subject: [PATCH 363/428] Apply suggestions from code review Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- quint/src/effects/NondetChecker.ts | 4 ++-- quint/src/quintError.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 55ed3ae04..2b2f43498 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -85,7 +85,7 @@ export class NondetChecker implements IRVisitor { if (body.kind !== 'app' || body.opcode !== 'oneOf') { this.errors.push({ code: 'QNT204', - message: `'oneOf' must be the outtermost expression in a nondet definition`, + message: `'oneOf' must be the outermost expression in a nondet definition`, reference: body.id, data: {}, }) @@ -96,7 +96,7 @@ export class NondetChecker implements IRVisitor { if (expressionType?.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', - message: `nondet bindings can only be used with boolean expressions`, + message: `nondet bindings can only be used in expressions returning a boolean`, reference: expr.id, data: {}, }) diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 03a3d6955..71c95f5f9 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -69,7 +69,7 @@ export type ErrorCode = | 'QNT202' /* QNT203: 'oneOf' must be used inside a nondet definition */ | 'QNT203' - /* QNT204: 'oneOf' must be the outtermost expression in a nondet definition */ + /* QNT204: 'oneOf' must be the outermost expression in a nondet definition */ | 'QNT204' /* QNT205: nondet bindings can only be used with boolean expressions */ | 'QNT205' From 69b828066870c602dba3f65398b04bc7c4a8bde9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 09:35:07 -0300 Subject: [PATCH 364/428] Inlclude actual expression type in the error msg --- quint/src/effects/NondetChecker.ts | 9 ++++++--- quint/test/effects/NondetChecker.test.ts | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 2b2f43498..c3056cb9f 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -18,6 +18,7 @@ import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '. import { LookupTable } from '../names/base' import { QuintError } from '../quintError' import { TypeScheme } from '../types/base' +import { typeSchemeToString } from '../types/printing' export class NondetChecker implements IRVisitor { private table: LookupTable @@ -92,11 +93,13 @@ export class NondetChecker implements IRVisitor { } // if the opdef is nondet, the return type must be bool - const expressionType = this.types.get(expr.expr.id) - if (expressionType?.type.kind !== 'bool') { + const expressionType = this.types.get(expr.expr.id)! + if (expressionType.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', - message: `nondet bindings can only be used in expressions returning a boolean`, + message: `nondet bindings can only be used with boolean expressions, but expression has type: ${typeSchemeToString( + expressionType + )}`, reference: expr.id, data: {}, }) diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index 7df3c8045..a59bb83e1 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -61,7 +61,7 @@ describe('checkNondets', () => { assert.sameDeepMembers(errors, [ { code: 'QNT204', - message: "'oneOf' must be the outtermost expression in a nondet definition", + message: "'oneOf' must be the outermost expression in a nondet definition", reference: 8n, data: {}, }, @@ -106,7 +106,7 @@ describe('checkNondets', () => { assert.sameDeepMembers(errors, [ { code: 'QNT205', - message: 'nondet bindings can only be used with boolean expressions', + message: 'nondet bindings can only be used with boolean expressions, but expression has type: int', reference: 7n, data: {}, }, From c935b09d5c8f836bc75659e376627d9a2f42da1a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 10:07:10 -0300 Subject: [PATCH 365/428] Release v0.19.3 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 038ccf2d0..b7f46b443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.3 -- 2024-05-07 + ### Added - Added static analysis checks to ensure proper usage of `nondet` and `oneOf` (#1431). diff --git a/quint/package-lock.json b/quint/package-lock.json index 7e9b8fb70..93b2f9314 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 9ef9ff759..f6d61cc9b 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 8e013601f..0c74e61b1 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.2' +export const version = '0.19.3' From 8039919c846b23c8d9f24b8afb107b4f608b78fc Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 10:24:48 -0300 Subject: [PATCH 366/428] VSCode Release v0.14.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 2e94f2ad2..bd2100570 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.2 -- 2024-05-07 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.14.1 -- 2024-04-09 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index fd065d03f..133abcce9 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.1", + "version": "0.14.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.1", + "version": "0.14.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b80840a9a..39159c044 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.1", + "version": "0.14.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 61531e915..9a2ee5d8a 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.1", + "version": "0.14.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.1", + "version": "0.14.2", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.2", + "@informalsystems/quint": "^0.19.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", - "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", + "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7182,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", - "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", + "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 069a23dec..1c45217b6 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.1", + "version": "0.14.2", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.2", + "@informalsystems/quint": "^0.19.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 1b0bfe6ffd9d506fcbd462594066032c48b05029 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 13 May 2024 20:50:53 -0300 Subject: [PATCH 367/428] Handle cases where table entries or types are missing --- quint/src/effects/NondetChecker.ts | 15 +++++++++++++-- quint/test/effects/NondetChecker.test.ts | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index c3056cb9f..9952e61ef 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -49,7 +49,13 @@ export class NondetChecker implements IRVisitor { enterOpDef(def: QuintOpDef) { this.lastDefQualifier = def.qualifier - if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { + const entry = this.table.get(def.id) + if (!entry) { + // A name resolution error should have been reported already + return + } + + if (def.qualifier === 'nondet' && entry.depth === 0) { this.errors.push({ code: 'QNT206', message: `'nondet' can only be used inside actions, not at the top level`, @@ -93,7 +99,12 @@ export class NondetChecker implements IRVisitor { } // if the opdef is nondet, the return type must be bool - const expressionType = this.types.get(expr.expr.id)! + const expressionType = this.types.get(expr.expr.id) + if (!expressionType) { + // A type error should have been reported already + return + } + if (expressionType.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index a59bb83e1..6499bdc95 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -112,4 +112,21 @@ describe('checkNondets', () => { }, ]) }) + + it('can survive missing types and lookup table entries', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module } = parseAndTypecheck(text) + const table = new Map() + const types = new Map() + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, []) + }) }) From 9226c6fe211b27b76e7abfd8d424f8e748a34a11 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 13 May 2024 20:59:23 -0300 Subject: [PATCH 368/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7f46b443..8c91227c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed a bug introduced in v0.19.3 here the analyzer would crash if there were + some specific type errors (#1436) + ### Security ## v0.19.3 -- 2024-05-07 From 0dd791319bd4911c28c50890b14a91795fbc22bc Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 14 May 2024 08:04:50 -0300 Subject: [PATCH 369/428] Update CHANGELOG.md Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c91227c9..a391745ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- Fixed a bug introduced in v0.19.3 here the analyzer would crash if there were +- Fixed a bug introduced in v0.19.3 where the analyzer would crash if there were some specific type errors (#1436) ### Security From f20634f5ce35132fb3a4775a4ebdb4675497bae6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 08:20:42 -0300 Subject: [PATCH 370/428] Document assumption about type/effect maps --- quint/src/effects/inferrer.ts | 5 +++-- quint/src/types/inferrer.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index e31f08e69..61538f38d 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -56,8 +56,9 @@ export class EffectInferrer implements IRVisitor { } /** - * Infers an effect for every expression in a module based on - * the definitions table for that module + * Infers an effect for every expression in a module based on the definitions + * table for that module. If there are missing effects in the effect map, + * there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer effects for * diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index f1bb378a9..517101054 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -30,7 +30,8 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { } /** - * Infers a type for each expression in a list of QuintDeclarations + * Infers a type for each expression in a list of QuintDeclarations. If there + * are missing types in the type map, there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer types for * From f044d23afcaaed4ba0cbb681f6d3a073035cfc88 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 09:02:04 -0300 Subject: [PATCH 371/428] Release v0.19.4 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a391745ab..26c9814eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.4 -- 2024-05-14 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 93b2f9314..ca404595b 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index f6d61cc9b..3ae4006bc 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 0c74e61b1..25e1ed200 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.3' +export const version = '0.19.4' From 385be70a9f4bf00d4a6f3bc9e71d80a3df9e4d53 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 09:23:10 -0300 Subject: [PATCH 372/428] VSCode Release v0.14.3 --- vscode/quint-vscode/CHANGELOG.md | 9 + vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 277 ++++++++++--------- vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 160 insertions(+), 136 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index bd2100570..d6937519b 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.3 -- 2024-05-14 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.14.2 -- 2024-05-07 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 133abcce9..d90b5c70d 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.2", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.2", + "version": "0.14.3", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 39159c044..d61398080 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.2", + "version": "0.14.3", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 9a2ee5d8a..321c6d4fe 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.2", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.2", + "version": "0.14.3", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.3", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -355,25 +355,25 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=12.10.0" } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", - "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -615,6 +615,15 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -651,12 +660,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -664,19 +672,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -684,11 +691,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -697,11 +704,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@protobufjs/aspromise": { @@ -822,9 +829,9 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { "version": "4.14.191", @@ -848,12 +855,13 @@ "node_modules/@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "node_modules/@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -4630,9 +4638,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -4899,14 +4907,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5757,9 +5757,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -5780,9 +5780,12 @@ } }, "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/punycode": { "version": "2.1.1", @@ -6344,9 +6347,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -6561,10 +6564,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/uri-js": { "version": "4.4.1", @@ -7093,22 +7101,22 @@ } }, "@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" } }, "@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "requires": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "dependencies": { @@ -7182,9 +7190,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", - "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7293,6 +7301,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7320,48 +7333,46 @@ } }, "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "requires": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "requires": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "@protobufjs/aspromise": { @@ -7482,9 +7493,9 @@ "dev": true }, "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "@types/lodash": { "version": "4.14.191", @@ -7508,12 +7519,13 @@ "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "@types/semver": { "version": "7.3.13", @@ -10317,9 +10329,9 @@ "dev": true }, "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "import-fresh": { "version": "3.3.0", @@ -10510,11 +10522,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -11153,9 +11160,9 @@ } }, "protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -11172,9 +11179,12 @@ }, "dependencies": { "@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -11575,9 +11585,9 @@ } }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -11725,10 +11735,15 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "uri-js": { "version": "4.4.1", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 1c45217b6..88b0865a0 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.2", + "version": "0.14.3", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.3", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 65b1c8f5e87a0eeea945bf2ccef7ebe9aea0903e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 08:16:07 -0300 Subject: [PATCH 373/428] Use optional values for nondet picks --- quint/src/runtime/impl/compilerImpl.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 04807d3b9..8843378dd 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -217,6 +217,14 @@ export class CompilerVisitor implements IRVisitor { return this.errorTracker.runtimeErrors } + private nondetNames() { + return [...this.lookupTable.values()].filter(d => d.kind === 'def' && d.qualifier === 'nondet').map(d => d.name) + } + + private defaultNondetPicks() { + return rv.mkRecord(OrderedMap(this.nondetNames().map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } + exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. @@ -243,7 +251,7 @@ export class CompilerVisitor implements IRVisitor { eval: () => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(rv.mkRecord([])) + this.nondetPicks = just(this.defaultNondetPicks()) } if (app.opcode === inputDefName) { @@ -280,7 +288,7 @@ export class CompilerVisitor implements IRVisitor { eval: (args?: Maybe[]) => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(rv.mkRecord([])) + this.nondetPicks = just(this.defaultNondetPicks()) } const r: Maybe = unwrappedValue.eval(args) @@ -340,15 +348,11 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - if (this.nondetPicks.isJust()) { - this.nondetPicks = just( - rv.mkRecord( - this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue) - ) - ) - } else { - this.nondetPicks = just(rv.mkRecord([[letDef.opdef.name, cachedValue.value as RuntimeValue]])) + if (this.nondetPicks.isNone()) { + this.nondetPicks = just(this.defaultNondetPicks()) } + const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) + this.nondetPicks = just(rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, value))) } boundValue.eval = boundValueEval return result From 0f93187ba4e481fb22518c7b58d96683b7072ce1 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 08:19:54 -0300 Subject: [PATCH 374/428] Update unshadowing so it doesn't rename thigs without need --- quint/src/names/base.ts | 4 +++- quint/src/names/collector.ts | 2 +- quint/src/names/unshadower.ts | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 2451fbcc7..bd1f3d9c0 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -43,8 +43,10 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam * Some types in `QuintDef` already have a `typeAnnotation` field. This * ensures that this field is always accessible */ typeAnnotation?: QuintType - /** optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ + /* optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ depth?: number + /* optional flag to tell if this is shadowing another def, therefore needing to be unshadowed during compilation */ + shadowing?: boolean } /** diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index 86918a9cc..d06be5cde 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -288,7 +288,7 @@ export class NameCollector implements IRVisitor { identifier, existingEntries .filter(entry => entry.id !== def.id) - .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }]) + .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: conflictingEntries.length > 0 }]) ) } diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index 45f8ecf0d..b6ca0e2ba 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -41,6 +41,11 @@ class Unshadower implements IRTransformer { enterLambda(lambda: QuintLambda): QuintLambda { const newParams: QuintLambdaParameter[] = lambda.params.map(p => { + if (!this.lookupTable.get(p.id)?.shadowing) { + // nothing to do + return p + } + const newName = `${p.name}_${lambda.id}` this.nestedNames.set(p.id, newName) @@ -50,6 +55,11 @@ class Unshadower implements IRTransformer { } enterLet(expr: QuintLet): QuintLet { + if (!this.lookupTable.get(expr.opdef.id)?.shadowing) { + // nothing to do + return expr + } + const newName = `${expr.opdef.name}_${expr.id}` this.nestedNames.set(expr.opdef.id, newName) From 17c65bc632e18bad6873a2fd462455fc10eeedea Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 08:31:35 -0300 Subject: [PATCH 375/428] Introduce `allListsUpTo` with an internal implementation --- examples/spells/basicSpells.qnt | 13 +++++++++++++ quint/src/ir/quintIr.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 22 +++++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/examples/spells/basicSpells.qnt b/examples/spells/basicSpells.qnt index cc3884728..306734d83 100644 --- a/examples/spells/basicSpells.qnt +++ b/examples/spells/basicSpells.qnt @@ -166,4 +166,17 @@ module basicSpells { assert(empty(Set(1, 2)) == false), assert(empty(Set(Set())) == false), } + + /// All lists of elements in s of up to max_length elements + /// + /// The behavior is overwritten in typescript to avoid computing + /// an infinite set on the simulator + /// + /// - @param s a set of any type + /// - @param max_length an upperbound for how many elements there + // should be in the lists + /// - @returns a set of lists + pure def allListsUpTo(s: Set[a], max_length: int): Set[List[a]] = { + s.allLists().filter(l => l.length() <= max_length) + } } diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index d4c42e656..bafef6a47 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -132,6 +132,7 @@ export const builtinOpCodes = [ 'actionAll', 'actionAny', 'allLists', + 'allListsUpTo', 'always', 'and', 'append', diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1348743fe..2ed56784a 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -40,7 +40,7 @@ import { prettyQuintEx, terminalWidth } from '../../graphics' import { format } from '../../prettierimp' import { unreachable } from '../../util' import { zerog } from '../../idGenerator' -import { chunk } from 'lodash' +import { chunk, times } from 'lodash' // Internal names in the compiler, which have special treatment. // For some reason, if we replace 'q::input' with inputDefName, everything breaks. @@ -932,6 +932,26 @@ export class CompilerVisitor implements IRVisitor { }) break + case 'allListsUpTo': + // Overwrite the default implementation of allListsUpTo + // to avoid computing an infinite set of lists + this.applyFun(app.id, 2, (set: RuntimeValue, max_length: RuntimeValue) => { + let lists: Set = Set([[]]) + let last_lists: Set = Set([[]]) + times(Number(max_length.toInt())).forEach(_length => { + // Generate all lists of length `length` from the set + const new_lists: Set = set.toSet().flatMap(value => { + return last_lists.map(list => list.concat(value)) + }) + + lists = lists.merge(new_lists) + last_lists = new_lists + }) + + return just(rv.mkSet(lists.map(list => rv.mkList(list)).toOrderedSet())) + }) + break + // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': From c5c1133b204059dbaaea64bce957bec656cd4e99 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:39:15 -0300 Subject: [PATCH 376/428] Add integration tests for --mbt flag --- quint/io-cli-tests.md | 130 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index d9744bc60..55d9ca9b3 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -440,6 +440,40 @@ Use --verbosity=3 to show executions. error: Invariant violated ``` +### Run finds an invariant violation with metadata + +The command `run` finds an invariant violation and outputs metadata for MBT, when given the `--mbt` flag. + + +``` +output=$(quint run --seed=0x308623f2a48e7 --mbt --max-steps=4 \ + --invariant='n < 10' ../examples/language-features/counters.qnt 2>&1) +exit_code=$? +echo "$output" | sed -e 's/([0-9]*ms)/(duration)/g' -e 's#^.*counters.qnt# HOME/counters.qnt#g' +exit $exit_code +``` + + + +``` +An example execution: + +[State 0] { action_taken: "q::init", n: 1, nondet_picks: { } } + +[State 1] { action_taken: "OnPositive", n: 2, nondet_picks: { } } + +[State 2] { action_taken: "OnPositive", n: 3, nondet_picks: { } } + +[State 3] { action_taken: "OnDivByThree", n: 6, nondet_picks: { } } + +[State 4] { action_taken: "OnDivByThree", n: 12, nondet_picks: { } } + +[violation] Found an issue (duration). +Use --seed=0x308623f2a48e7 to reproduce. +Use --verbosity=3 to show executions. +error: Invariant violated +``` + ### Run finds an example The command `run` finds an example. @@ -715,6 +749,102 @@ rm out-itf-example.itf.json ] ``` +### Run outputs ITF with metadata + + +``` +quint run --out-itf=out-itf-mbt-example.itf.json --max-steps=5 --seed=123 \ + --invariant=totalSupplyDoesNotOverflowInv --mbt\ + ../examples/solidity/Coin/coin.qnt +cat out-itf-mbt-example.itf.json | jq '.states[1]' +rm out-itf-mbt-example.itf.json +``` + + +``` +{ + "#meta": { + "index": 1 + }, + "action_taken": "mint", + "balances": { + "#map": [ + [ + "alice", + { + "#bigint": "0" + } + ], + [ + "bob", + { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + ], + [ + "charlie", + { + "#bigint": "0" + } + ], + [ + "eve", + { + "#bigint": "0" + } + ], + [ + "null", + { + "#bigint": "0" + } + ] + ] + }, + "minter": "bob", + "nondet_picks": { + "amount_189": { + "tag": "Some", + "value": { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + }, + "eveToBob_295": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintBob_296": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintEve_297": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "receiver_190": { + "tag": "Some", + "value": "bob" + }, + "sender_191": { + "tag": "Some", + "value": "bob" + }, + "sender_75": { + "tag": "None", + "value": { + "#tup": [] + } + } + } +} +``` + ### Run without violation outputs ITF From 027c3e6697515b80854aecdcc11b4aed8fff689d Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:39:33 -0300 Subject: [PATCH 377/428] Update docstrings --- quint/src/runtime/compile.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index 967427963..b34126606 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -132,6 +132,7 @@ export function contextNameLookup( * @param evaluationState the state of the compiler visitor * @param lookupTable lookup table as produced by the parser * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @param defs the definitions to compile * @returns the compilation context */ @@ -168,6 +169,7 @@ export function compile( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param expr - The Quint exporession to be compiled * * @returns A compilation context with the compiled expression or its errors @@ -195,6 +197,7 @@ export function compileExpr( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param decls - The Quint declarations to be compiled * * @returns A compilation context with the compiled definition or its errors @@ -269,6 +272,7 @@ export function compileDecls( * @param mainName the name of the module that may contain state varibles * @param execListener execution listener * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @returns the compilation context */ export function compileFromCode( From 6a1ec77aa77248ccb407b6f57924bc70b3f3377c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:45:59 -0300 Subject: [PATCH 378/428] Improve cli flag description --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index c0fb17326..0aacd730b 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -248,7 +248,7 @@ const runCmd = { default: verbosity.defaultLevel, }) .option('mbt', { - desc: 'whether to produce info to be used by model-based testing', + desc: 'whether to produce metadata to be used by model-based testing', type: 'boolean', default: false, }), From f1cd39b47ddc32d69b2534a1b660943a30757070 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:10:50 -0300 Subject: [PATCH 379/428] Improve initialization of `nondetPicks` --- quint/src/runtime/impl/compilerImpl.ts | 55 +++++++++++++------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 8843378dd..f672f866f 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -155,10 +155,19 @@ export class CompilerVisitor implements IRVisitor { // a tracker for the current execution trace private trace: Trace + // whether to track `actionTaken` and `nondetPicks` private storeMetadata: boolean + // the chosen action in the last `any` evaluation private actionTaken: Maybe = none() - private nondetPicks: Maybe = none() - + // a record with nondet definition names as fields and their last chosen value as values + private nondetPicks: RuntimeValue // initialized at constructor + + private emptyNondetPicks() { + const nondetNames = [...this.lookupTable.values()] + .filter(d => d.kind === 'def' && d.qualifier === 'nondet') + .map(d => d.name) + return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -180,6 +189,8 @@ export class CompilerVisitor implements IRVisitor { this.errorTracker = evaluationState.errorTracker this.execListener = evaluationState.listener this.trace = evaluationState.trace + + this.nondetPicks = this.emptyNondetPicks() } /** @@ -217,14 +228,6 @@ export class CompilerVisitor implements IRVisitor { return this.errorTracker.runtimeErrors } - private nondetNames() { - return [...this.lookupTable.values()].filter(d => d.kind === 'def' && d.qualifier === 'nondet').map(d => d.name) - } - - private defaultNondetPicks() { - return rv.mkRecord(OrderedMap(this.nondetNames().map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) - } - exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. @@ -249,9 +252,8 @@ export class CompilerVisitor implements IRVisitor { const evalApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: '_', args: [app] } boundValue = { eval: () => { - if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + if (this.actionTaken.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(this.defaultNondetPicks()) } if (app.opcode === inputDefName) { @@ -286,9 +288,8 @@ export class CompilerVisitor implements IRVisitor { const unwrappedValue = boundValue boundValue = { eval: (args?: Maybe[]) => { - if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + if (this.actionTaken.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(this.defaultNondetPicks()) } const r: Maybe = unwrappedValue.eval(args) @@ -348,11 +349,9 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - if (this.nondetPicks.isNone()) { - this.nondetPicks = just(this.defaultNondetPicks()) - } + // A nondet value was just defined, save it in the nondetPicks record. const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) - this.nondetPicks = just(rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, value))) + this.nondetPicks = rv.mkRecord(this.nondetPicks.toOrderedMap().set(letDef.opdef.name, value)) } boundValue.eval = boundValueEval return result @@ -1495,9 +1494,13 @@ export class CompilerVisitor implements IRVisitor { // non-deterministically. Instead of modeling non-determinism, // we use a random number generator. This may change in the future. const lazyCompute = () => { - // save the values of the next variables, as actions may update them + // on `any`, we reset the action taken as the goal is to save the last + // action picked in an `any` call this.actionTaken = none() - this.nondetPicks = none() + // we also reset nondet picks since they should correspond to the action taken + this.nondetPicks = this.emptyNondetPicks() + + // save the values of the next variables, as actions may update them const valuesBefore = this.snapshotNextVars() // we store the potential successor values in this array const successors: Maybe[][] = [] @@ -1694,9 +1697,7 @@ export class CompilerVisitor implements IRVisitor { if (this.storeMetadata) { if (this.actionTaken.isJust()) { map.push(['action_taken', this.actionTaken.value!]) - } - if (this.nondetPicks.isJust()) { - map.push(['nondet_picks', this.nondetPicks.value!]) + map.push(['nondet_picks', this.nondetPicks]) } } @@ -1710,26 +1711,26 @@ export class CompilerVisitor implements IRVisitor { // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) + return this.vars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) + return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) this.actionTaken = values[this.vars.length] ?? none() - this.nondetPicks = values[this.vars.length + 1] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) this.actionTaken = values[this.vars.length] ?? none() - this.nondetPicks = values[this.vars.length + 1] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() } private contextGet(name: string | bigint, kinds: ComputableKind[]) { From e8992e5d038eaf1a7afa74160a215901570f370c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:35:37 -0300 Subject: [PATCH 380/428] Remove unnecessary assignment --- quint/src/runtime/impl/compilerImpl.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index f672f866f..4c762c30b 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -292,8 +292,7 @@ export class CompilerVisitor implements IRVisitor { this.actionTaken = just(rv.mkStr(opdef.name)) } - const r: Maybe = unwrappedValue.eval(args) - return r + return unwrappedValue.eval(args) }, nparams: unwrappedValue.nparams, } From f09cc8c5f7592fd4babd2a93722b2fee9d77d3d5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:36:17 -0300 Subject: [PATCH 381/428] Add "experimental" note to CLI flag --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 0aacd730b..de485f4cb 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -248,7 +248,7 @@ const runCmd = { default: verbosity.defaultLevel, }) .option('mbt', { - desc: 'whether to produce metadata to be used by model-based testing', + desc: '(experimental) whether to produce metadata to be used by model-based testing', type: 'boolean', default: false, }), From 6b360415de8d508c793a30abf59c2dac87fefde7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:43:51 -0300 Subject: [PATCH 382/428] Add documentation for the `--mbt` flag --- doc/quint.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/quint.md b/doc/quint.md index af6124f07..e3c3c079f 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -231,6 +231,8 @@ Options: --invariant invariant to check: a definition name or an expression [string] [default: ["true"]] --seed random seed to use for non-deterministic choice [string] + --mbt (experimental) whether to produce metadata to be used by + model-based testing [boolean] [default: false] ``` - If there are no critical errors (e.g., in parsing, typechecking, etc.), the @@ -255,6 +257,19 @@ Options: The errors and warnings are written in the format of [ADR002][]. +### The `--mbt` flag +When this flag is given, the Quint simulator will keep track of two additional +variables on the traces it produces: +- `action_taken`: The first action executed by the simulator on each step, reset + at every `any` evaluation. That is, if the spec has nested `any` statements, + `action_taken` will correspond to the action picked in the innermost `any`. +- `nondet_picks`: A record with all `nondet` values that were picked since the + last `any` was called (or since the start, if there were no `any` calls in the + step). + +Keep in mind that this is an experimental flag and it is specially subject to +changes in its behavior. + ## Command test ```sh From efa276b0f6cd51b1e28fd92ba431c59a774c02f9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:44:49 -0300 Subject: [PATCH 383/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c9814eb..64b0ba28f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added an experimental `--mbt` flag to produce metadata that is useful for + Model-Based Testing (#1441). + ### Changed ### Deprecated ### Removed From 3f762e74332d65c40fcf0d18dfca55059562f283 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:54:46 -0300 Subject: [PATCH 384/428] Move and document initialization method --- quint/src/runtime/impl/compilerImpl.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 4c762c30b..7e28e84f1 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -162,12 +162,6 @@ export class CompilerVisitor implements IRVisitor { // a record with nondet definition names as fields and their last chosen value as values private nondetPicks: RuntimeValue // initialized at constructor - private emptyNondetPicks() { - const nondetNames = [...this.lookupTable.values()] - .filter(d => d.kind === 'def' && d.qualifier === 'nondet') - .map(d => d.name) - return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) - } // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -1732,6 +1726,16 @@ export class CompilerVisitor implements IRVisitor { this.nondetPicks = values[this.vars.length + 1].unwrap() } + // The initial value of nondet picks should already have record fields for all + // nondet values so the type of `nondet_picks` is the same throughout the + // trace. The field values are initialized as None. + private emptyNondetPicks() { + const nondetNames = [...this.lookupTable.values()] + .filter(d => d.kind === 'def' && d.qualifier === 'nondet') + .map(d => d.name) + return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } + private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { const value = this.context.get(kindName(k, name)) From 165bf46000628580f914bbfbcce0358a3267e8f6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 21:06:09 -0300 Subject: [PATCH 385/428] Add tests for `allListsUpTo` --- quint/src/runtime/impl/compilerImpl.ts | 1 + quint/test/runtime/compile.test.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 2ed56784a..05b76e2ac 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -941,6 +941,7 @@ export class CompilerVisitor implements IRVisitor { times(Number(max_length.toInt())).forEach(_length => { // Generate all lists of length `length` from the set const new_lists: Set = set.toSet().flatMap(value => { + // for each value in the set, append it to all lists of length `length - 1` return last_lists.map(list => list.concat(value)) }) diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 12deb53a5..fab68aa6b 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -837,6 +837,22 @@ describe('compiling specs to runtime values', () => { assertResultAsString('[].select(e => e % 2 == 0)', 'List()') assertResultAsString('[4, 5, 6].select(e => e % 2 == 0)', 'List(4, 6)') }) + + it('allListsUpTo', () => { + // This should be in our standard library when we have it + const context = `pure def allListsUpTo(s: Set[a], max_length: int): Set[List[a]] = { + s.allLists().filter(l => l.length() <= max_length) +}` + + assertResultAsString( + 'Set(1, 2, 3).allListsUpTo(2)', + 'Set(List(), List(1, 1), List(1, 2), List(1, 3), List(1), List(2, 1), List(2, 2), List(2, 3), List(2), List(3, 1), List(3, 2), List(3, 3), List(3))', + context + ) + assertResultAsString('Set(1).allListsUpTo(3)', 'Set(List(), List(1, 1, 1), List(1, 1), List(1))', context) + assertResultAsString('Set().allListsUpTo(3)', 'Set(List())', context) + assertResultAsString('Set(1).allListsUpTo(0)', 'Set(List())', context) + }) }) describe('compile over records', () => { From 601ae2b40b65f12af6a20f5964f67750c755e5da Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 21:18:59 -0300 Subject: [PATCH 386/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c9814eb..77c242bb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added the `allListsUpTo` operator with an internal implementation to avoid + computing infinite sets (#1442) + ### Changed ### Deprecated ### Removed From 25384a5a931de98ed91df9e3f42c11f0aca21eac Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 11:47:52 -0300 Subject: [PATCH 387/428] Update comments on how nondetPicks are collected --- quint/src/runtime/impl/compilerImpl.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 7e28e84f1..c47eef869 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -341,6 +341,16 @@ export class CompilerVisitor implements IRVisitor { // compute the result and immediately reset the cache const result = undecoratedEval() + // Store the nondet picks after evaluation as we want to collect them while we move up the IR tree, + // to make sure all nondet values in scenarios like this are collected: + // action step = any { + // someAction, + // nondet time = oneOf(times) + // timeRelatedAction(time) + // } + // + // action timeRelatedAction(time) = any { AdvanceTime(time), RevertTime(time) } + if (result.isJust() && qualifier === 'nondet') { // A nondet value was just defined, save it in the nondetPicks record. const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) @@ -1490,7 +1500,8 @@ export class CompilerVisitor implements IRVisitor { // on `any`, we reset the action taken as the goal is to save the last // action picked in an `any` call this.actionTaken = none() - // we also reset nondet picks since they should correspond to the action taken + // we also reset nondet picks as they are collected when we move up the + // tree, and this is now a leaf this.nondetPicks = this.emptyNondetPicks() // save the values of the next variables, as actions may update them From b05a4d564f500a6abe62fc07226ab65223953533 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 15:50:58 -0300 Subject: [PATCH 388/428] Ensure unshadowing of all lambdas to avoid Apalache issue --- quint/src/names/unshadower.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index b6ca0e2ba..e69bfeb8c 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -41,10 +41,8 @@ class Unshadower implements IRTransformer { enterLambda(lambda: QuintLambda): QuintLambda { const newParams: QuintLambdaParameter[] = lambda.params.map(p => { - if (!this.lookupTable.get(p.id)?.shadowing) { - // nothing to do - return p - } + // Ideally, we should only rename if `this.lookupTable.get(p.id)?.shadowing` is true, as we do in let. + // However, this currently is a problem with Apalache, see issue #1443. const newName = `${p.name}_${lambda.id}` this.nestedNames.set(p.id, newName) From 1d8c268f9952150e826d053cc6c2e73e54f7b29d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 15:52:56 -0300 Subject: [PATCH 389/428] Update tests and fix some collector behavior --- quint/io-cli-tests.md | 18 ++++++------------ quint/src/ir/IRVisitor.ts | 6 ++++++ quint/src/names/collector.ts | 20 ++++++++++---------- quint/src/names/resolver.ts | 9 +++++---- quint/test/names/unshadower.test.ts | 12 +++++++++--- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 741821f7e..da0b56ffb 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -811,43 +811,37 @@ rm out-itf-mbt-example.itf.json }, "minter": "bob", "nondet_picks": { - "amount_189": { + "amount": { "tag": "Some", "value": { "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" } }, - "eveToBob_295": { + "eveToBob": { "tag": "None", "value": { "#tup": [] } }, - "mintBob_296": { + "mintBob": { "tag": "None", "value": { "#tup": [] } }, - "mintEve_297": { + "mintEve": { "tag": "None", "value": { "#tup": [] } }, - "receiver_190": { + "receiver": { "tag": "Some", "value": "bob" }, - "sender_191": { + "sender": { "tag": "Some", "value": "bob" - }, - "sender_75": { - "tag": "None", - "value": { - "#tup": [] - } } } } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index b7b4195a5..e0888ddcf 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -465,6 +465,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { } break case 'let': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLet) { visitor.enterLet(expr) } @@ -475,6 +478,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.exitLet) { visitor.exitLet(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break default: unreachable(expr) diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index d06be5cde..393353459 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -245,19 +245,21 @@ export class NameCollector implements IRVisitor { * than `def.name` (i.e. in import-like statements). * @param source - An optional source identifier for the definition, if the * source is different than `def.id` (i.e. in import-like statements). + * + * @returns The definition object that was collected. */ - collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): void { + collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): LookupDefinition { const identifier = (importedFrom as QuintImport)?.defName ?? def.name const source = importedFrom?.id ?? def.id if (identifier === '_') { // Don't collect underscores, as they are special identifiers that allow no usage - return + return def } if (builtinNames.includes(identifier)) { // Conflict with a built-in name this.recordConflict(identifier, undefined, source) - return + return def } def.depth ??= 0 @@ -266,7 +268,7 @@ export class NameCollector implements IRVisitor { if (!this.definitionsByName.has(identifier)) { // No existing defs with this name. Create an entry with a single def. this.definitionsByName.set(identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]) - return + return def } // Else: There are exiting defs. We need to check for conflicts @@ -284,12 +286,10 @@ export class NameCollector implements IRVisitor { // Keep entries with different ids. DON'T keep the whole // `existingEntries` since those may contain the same exact defs, but // hidden. - this.definitionsByName.set( - identifier, - existingEntries - .filter(entry => entry.id !== def.id) - .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: conflictingEntries.length > 0 }]) - ) + const newDef = { ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: existingEntries.length > 0 } + this.definitionsByName.set(identifier, existingEntries.filter(entry => entry.id !== def.id).concat([newDef])) + + return newDef } /** diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index bcf595c60..e9adb4c42 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -75,11 +75,12 @@ class NameResolver implements IRVisitor { // Top-level definitions were already collected, so we only need to collect // scoped definitions. if (this.definitionDepth > 0) { - this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + const newDef = this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + this.table.set(def.id, { ...newDef, depth: this.definitionDepth }) + } else { + // Map the definition to itself so we can recover depth information from the table + this.table.set(def.id, { ...def, depth: this.definitionDepth }) } - - // Map the definition to itself so we can recover depth information from the table - this.table.set(def.id, { ...def, depth: this.definitionDepth }) } exitLet(expr: QuintLet): void { diff --git a/quint/test/names/unshadower.test.ts b/quint/test/names/unshadower.test.ts index 6d4c4f718..0fe892a54 100644 --- a/quint/test/names/unshadower.test.ts +++ b/quint/test/names/unshadower.test.ts @@ -21,8 +21,11 @@ describe('unshadowNames', () => { it('returns a module with no shadowed names', () => { const { modules, table } = parseModules(` module A { - def f(a) = a > 0 val b = val a = 1 { a } + val c = val a = { val a = 1 { a } } { a } + val d = val a = 1 { val a = 2 { a } } + def f(a) = a > 0 + def g(a) = a.map(a => a + 1) } module B { @@ -34,8 +37,11 @@ describe('unshadowNames', () => { assert.sameDeepMembers(unshadowedModules.map(moduleToString), [ dedent(`module A { - | val b = val a_10 = 1 { a_10 } - | def f = ((a_5) => igt(a_5, 0)) + | val d = val a = 1 { val a_19 = 2 { a_19 } } + | def f = ((a_26) => igt(a_26, 0)) + | def g = ((a_36) => map(a_36, ((a_34) => iadd(a_34, 1)))) + | val b = val a = 1 { a } + | val c = val a = val a_9 = 1 { a_9 } { a } |}`), dedent(`module B { | var a: int From 809203853ef137040f70f1276fcbca9abb07c2b0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:08:52 -0300 Subject: [PATCH 390/428] Add a unit test for metadata collection --- quint/test/names/resolver.test.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index e4474cf22..f2a7208b8 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -103,8 +103,22 @@ describe('resolveNames', () => { ) assert.isEmpty(result.errors) - assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'def')) - assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'param')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'def')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'param')) + }) + + it('collects depth and shadowing information properly', () => { + const result = resolveNamesForDefs(['val shadowing = val a = 1 { val a = 2 { a } }'], newIdGenerator()) + + assert.isEmpty(result.errors) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 2), + 'Could not find first a' + ) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 3 && def.shadowing === true), + 'Could not find second a' + ) }) }) From 0ef309a6264a98d3c5e82511fb624474971eabb3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:15:52 -0300 Subject: [PATCH 391/428] Update depth on fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_1013unknownTypeLetIn.json | 2 +- quint/testFixture/_1025importeeWithError.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 588ec8bce..994a4f26a 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1,"shadowing":false},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1,"shadowing":false},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1,"shadowing":false},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1,"shadowing":false},"207":{"id":201,"name":"y","kind":"param","depth":1,"shadowing":false},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1,"shadowing":false},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1,"shadowing":false},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1,"shadowing":false},"307":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"310":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1,"shadowing":false},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1,"shadowing":false},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1,"shadowing":false},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 4fe24b7f7..9133a4742 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1,"shadowing":false},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index 639d8a152..3b57dcac4 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1,"shadowing":false},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1,"shadowing":false},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1013unknownTypeLetIn.json b/quint/testFixture/_1013unknownTypeLetIn.json index a189470bf..d3e940ca0 100644 --- a/quint/testFixture/_1013unknownTypeLetIn.json +++ b/quint/testFixture/_1013unknownTypeLetIn.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 0ab94dc1b..4c222cf7a 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":1},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":2},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 9bb8386dd..d1ef2d5f3 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file From a7b6cf4c35ee2c5317ec78d0dbd121dfe20392a4 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:17:29 -0300 Subject: [PATCH 392/428] Update docstring --- quint/src/names/unshadower.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index e69bfeb8c..ad54e4cc7 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -19,7 +19,7 @@ import { QuintApp, QuintLambda, QuintLambdaParameter, QuintLet, QuintModule, Qui /** * Replace all names with unique names, to avoid shadowing. * - Lambda parameters are renamed to `_` - * - Nested definitions (from let expressions) are renamed to `_` + * - Nested definitions (from let expressions) are renamed to `_` only if they shadow another name * * @param module The module to unshadow * @param lookupTable The lookup table with the module's name references From db67d0301975b11e9f7363efdc6de569c5e1d958 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:20:06 -0300 Subject: [PATCH 393/428] Add CHANGELOG entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b0ba28f..351bdf734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Model-Based Testing (#1441). ### Changed + +- Shadowing is a bit less agressive. This should improve readability of variable + names after compilation, i.e. in Apalache and some simulation errors, and in + TLA+ produced from the `compile` command (#1444). + ### Deprecated ### Removed ### Fixed From e537a72122176d7293d7b70d78095b37b100a73f Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 22 May 2024 08:46:41 -0300 Subject: [PATCH 394/428] Make `allListsUpTo` a builtin --- CHANGELOG.md | 3 +-- doc/builtin.md | 11 ++++++++++- doc/lang.md | 5 ++++- examples/spells/basicSpells.qnt | 13 ------------- quint/src/builtin.qnt | 10 +++++++++- quint/src/effects/builtinSignatures.ts | 1 + quint/src/names/base.ts | 1 + quint/src/types/builtinSignatures.ts | 1 + quint/test/runtime/compile.test.ts | 14 ++++---------- 9 files changed, 31 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5faf6be06..a64f8eefb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added an experimental `--mbt` flag to produce metadata that is useful for Model-Based Testing (#1441). -- Added the `allListsUpTo` operator with an internal implementation to avoid - computing infinite sets (#1442) +- Added the `allListsUpTo`, a limited but computable version of `allLists` (#1442) ### Changed ### Deprecated diff --git a/doc/builtin.md b/doc/builtin.md index 2ccb49c70..141979d92 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -242,7 +242,7 @@ assert(Set(Set(1, 2), Set(3, 4)).flatten() == Set(1, 2, 3, 4)) `s.allLists()` is the set of all lists containing elements in `s`. This is an infinite set unless `s` is the empty set. -Like other inifite sets, this is not supported in the simulator. +Like other inifite sets, this is not supported in any execution/verification form. ### Examples @@ -251,6 +251,15 @@ assert(Set(1, 2).allLists().contains([])) assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) ``` +## `pure def allListsUpTo: (Set[a], int) => Set[List[a]]` + +`s.allListsUpTo(l)` is the set of all lists of elements in `s` with length <= `l` + +``` +assert(Set(1, 2).allListsUpTo(1) == Set([], [1], [2])) +assert(Set(1).allListsUpTo(2) == Set([], [1], [1, 1])) +``` + ## `pure def chooseSome: (Set[a]) => a` `s.chooseSome()` is, deterministically, one element of `s`. diff --git a/doc/lang.md b/doc/lang.md index a598c6146..43abf07cd 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -1191,9 +1191,12 @@ powerset(S) // UNION S S.flatten() flatten(S) -// Seq(S): the set of all lists of elements in S +// Seq(S): the set of all lists of elements in S. +// Cannot be used in simulation or verification. See `allListsUpTo` S.allLists() allLists(S) +// Limited version: +S.allListsUpTo(2) // CHOOSE x \in S: TRUE // The operator name is deliberately made long, so it would not be the user's default choice. S.chooseSome() diff --git a/examples/spells/basicSpells.qnt b/examples/spells/basicSpells.qnt index 306734d83..cc3884728 100644 --- a/examples/spells/basicSpells.qnt +++ b/examples/spells/basicSpells.qnt @@ -166,17 +166,4 @@ module basicSpells { assert(empty(Set(1, 2)) == false), assert(empty(Set(Set())) == false), } - - /// All lists of elements in s of up to max_length elements - /// - /// The behavior is overwritten in typescript to avoid computing - /// an infinite set on the simulator - /// - /// - @param s a set of any type - /// - @param max_length an upperbound for how many elements there - // should be in the lists - /// - @returns a set of lists - pure def allListsUpTo(s: Set[a], max_length: int): Set[List[a]] = { - s.allLists().filter(l => l.length() <= max_length) - } } diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index 6fd5aca6a..35f68fde6 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -218,7 +218,7 @@ module builtin { /// `s.allLists()` is the set of all lists containing elements in `s`. /// This is an infinite set unless `s` is the empty set. /// - /// Like other inifite sets, this is not supported in the simulator. + /// Like other inifite sets, this is not supported in any execution/verification form. /// /// ### Examples /// @@ -228,6 +228,14 @@ module builtin { /// ``` pure def allLists(s): (Set[a]) => Set[List[a]] + /// `s.allListsUpTo(l)` is the set of all lists of elements in `s` with length <= `l` + /// + /// ``` + /// assert(Set(1, 2).allListsUpTo(1) == Set([], [1], [2])) + /// assert(Set(1).allListsUpTo(2) == Set([], [1], [1, 1])) + /// ``` + pure def allListsUpTo(s: Set[a], max_length: int): Set[List[a]] + /// `s.chooseSome()` is, deterministically, one element of `s`. /// /// ### Examples diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index 1938d6405..310f38e40 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -143,6 +143,7 @@ export const setOperators = [ { name: 'powerset', effect: standardPropagation(1) }, { name: 'flatten', effect: standardPropagation(1) }, { name: 'allLists', effect: standardPropagation(1) }, + { name: 'allListsUpTo', effect: standardPropagation(2) }, { name: 'chooseSome', effect: standardPropagation(1) }, { name: 'oneOf', effect: standardPropagation(1) }, { name: 'isFinite', effect: standardPropagation(1) }, diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 2451fbcc7..1c948ef41 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -170,6 +170,7 @@ export const builtinNames = [ 'powerset', 'flatten', 'allLists', + 'allListsUpTo', 'chooseSome', 'oneOf', 'isFinite', diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index fecaa0308..dcd18b477 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -59,6 +59,7 @@ const setOperators = [ { name: 'powerset', type: '(Set[a]) => Set[Set[a]]' }, { name: 'flatten', type: '(Set[Set[a]]) => Set[a]' }, { name: 'allLists', type: '(Set[a]) => Set[List[a]]' }, + { name: 'allListsUpTo', type: '(Set[a], int) => Set[List[a]]' }, { name: 'chooseSome', type: '(Set[a]) => a' }, { name: 'oneOf', type: '(Set[a]) => a' }, { name: 'isFinite', type: '(Set[a]) => bool' }, diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 3c5d5399c..0798b059c 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -855,19 +855,13 @@ describe('compiling specs to runtime values', () => { }) it('allListsUpTo', () => { - // This should be in our standard library when we have it - const context = `pure def allListsUpTo(s: Set[a], max_length: int): Set[List[a]] = { - s.allLists().filter(l => l.length() <= max_length) -}` - assertResultAsString( 'Set(1, 2, 3).allListsUpTo(2)', - 'Set(List(), List(1, 1), List(1, 2), List(1, 3), List(1), List(2, 1), List(2, 2), List(2, 3), List(2), List(3, 1), List(3, 2), List(3, 3), List(3))', - context + 'Set(List(), List(1, 1), List(1, 2), List(1, 3), List(1), List(2, 1), List(2, 2), List(2, 3), List(2), List(3, 1), List(3, 2), List(3, 3), List(3))' ) - assertResultAsString('Set(1).allListsUpTo(3)', 'Set(List(), List(1, 1, 1), List(1, 1), List(1))', context) - assertResultAsString('Set().allListsUpTo(3)', 'Set(List())', context) - assertResultAsString('Set(1).allListsUpTo(0)', 'Set(List())', context) + assertResultAsString('Set(1).allListsUpTo(3)', 'Set(List(), List(1, 1, 1), List(1, 1), List(1))') + assertResultAsString('Set().allListsUpTo(3)', 'Set(List())') + assertResultAsString('Set(1).allListsUpTo(0)', 'Set(List())') }) }) From dc335f0bf3a6395589a293c3f946c78277e32db7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 22 May 2024 09:11:41 -0300 Subject: [PATCH 395/428] Add an `allListsUpTo` call to SuperSpec --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/SuperSpec.qnt | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 588ec8bce..c9d1fb70c 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":530,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":510,"kind":"def","name":"lists","qualifier":"val","expr":{"id":509,"kind":"app","opcode":"allListsUpTo","args":[{"id":507,"kind":"app","opcode":"Set","args":[{"id":505,"kind":"int","value":1},{"id":506,"kind":"int","value":2}]},{"id":508,"kind":"int","value":3}]}},{"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,"depth":0},{"id":523,"kind":"typedef","name":"INT_SET","type":{"id":522,"kind":"set","elem":{"id":521,"kind":"int"}},"depth":0},{"id":524,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":514,"kind":"assume","name":"positive","assumption":{"id":513,"kind":"app","opcode":"igt","args":[{"id":511,"kind":"name","name":"N"},{"id":512,"kind":"int","value":0}]},"depth":0},{"id":518,"kind":"assume","name":"_","assumption":{"id":517,"kind":"app","opcode":"neq","args":[{"id":515,"kind":"name","name":"N"},{"id":516,"kind":"int","value":0}]}},{"id":519,"kind":"import","defName":"foo","protoName":"M1"},{"id":520,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":525,"kind":"const","name":"INT_SET"},"id":526,"depth":0},{"id":529,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":528,"name":"N"},{"id":527,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"510":{"id":510,"kind":"def","name":"lists","qualifier":"val","expr":{"id":509,"kind":"app","opcode":"allListsUpTo","args":[{"id":507,"kind":"app","opcode":"Set","args":[{"id":505,"kind":"int","value":1},{"id":506,"kind":"int","value":2}]},{"id":508,"kind":"int","value":3}]},"depth":0},"511":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"515":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"525":{"id":523,"kind":"typedef","name":"INT_SET","type":{"id":522,"kind":"set","elem":{"id":521,"kind":"int"}},"depth":0},"527":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"528":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":527,"depth":0,"importedFrom":{"id":529,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":528,"name":"N"},{"id":527,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 789c2de56..0a0804149 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"76":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"77":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"83":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"88":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"89":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"90":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"91":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"92":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"93":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"94":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"95":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"97":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"98":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"99":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"101":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"102":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"103":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"105":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"106":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"107":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"109":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"110":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"111":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"113":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"114":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"115":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"117":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"118":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"120":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"121":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"122":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"124":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"125":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"126":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"128":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"129":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"130":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"132":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"133":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"134":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"136":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"137":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"138":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"140":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"141":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"142":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"144":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"146":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"148":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"149":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"150":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"151":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"152":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"153":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"154":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"156":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"157":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"159":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"160":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"161":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"162":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"163":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"164":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"165":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"166":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"167":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"168":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"169":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"170":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"171":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"172":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"173":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"174":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"175":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"176":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"177":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"178":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"179":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"183":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"185":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"189":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"190":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"195":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"196":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"197":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"200":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"201":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"202":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"203":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"204":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"205":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"206":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"207":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"208":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"211":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"212":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"213":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"214":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"215":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"218":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"219":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"220":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"223":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"228":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"229":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"230":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"231":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"232":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"233":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"234":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"76":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"77":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"83":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"88":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"89":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"90":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"91":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"92":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"93":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"94":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"95":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"97":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"98":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"99":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"101":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"102":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"103":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"105":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"106":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"107":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"109":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"110":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"111":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"113":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"114":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"115":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"117":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"118":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"120":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"121":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"122":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"124":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"125":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"126":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"128":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"129":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"130":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"132":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"133":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"134":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"136":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"137":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"138":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"140":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"141":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"142":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"144":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"146":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"148":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"149":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"150":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"151":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"152":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"153":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"154":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"156":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"157":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"159":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"160":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"161":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"162":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"163":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"164":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"165":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"166":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"167":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"168":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"169":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"170":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"171":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"172":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"173":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"174":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"175":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"176":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"177":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"178":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"179":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"183":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"185":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"189":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"190":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"195":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"196":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"197":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"200":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"201":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"202":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"203":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"204":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"205":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"206":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"207":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"208":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"211":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"212":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"213":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"214":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"215":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"218":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"219":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"220":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"223":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"228":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"229":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"230":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"231":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"232":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"233":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"234":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":18,"index":4504},{"line":200,"col":18,"index":4504}],"506":[0,{"line":200,"col":21,"index":4507},{"line":200,"col":21,"index":4507}],"507":[0,{"line":200,"col":14,"index":4500},{"line":200,"col":22,"index":4508}],"508":[0,{"line":200,"col":37,"index":4523},{"line":200,"col":37,"index":4523}],"509":[0,{"line":200,"col":14,"index":4500},{"line":200,"col":38,"index":4524}],"510":[0,{"line":200,"col":2,"index":4488},{"line":200,"col":38,"index":4524}],"511":[0,{"line":203,"col":20,"index":4571},{"line":203,"col":20,"index":4571}],"512":[0,{"line":203,"col":24,"index":4575},{"line":203,"col":24,"index":4575}],"513":[0,{"line":203,"col":20,"index":4571},{"line":203,"col":24,"index":4575}],"514":[0,{"line":203,"col":2,"index":4553},{"line":203,"col":24,"index":4575}],"515":[0,{"line":205,"col":13,"index":4619},{"line":205,"col":13,"index":4619}],"516":[0,{"line":205,"col":18,"index":4624},{"line":205,"col":18,"index":4624}],"517":[0,{"line":205,"col":13,"index":4619},{"line":205,"col":18,"index":4624}],"518":[0,{"line":205,"col":2,"index":4608},{"line":205,"col":18,"index":4624}],"519":[0,{"line":208,"col":2,"index":4642},{"line":208,"col":14,"index":4654}],"520":[0,{"line":209,"col":2,"index":4658},{"line":209,"col":12,"index":4668}],"521":[0,{"line":212,"col":21,"index":4706},{"line":212,"col":23,"index":4708}],"522":[0,{"line":212,"col":17,"index":4702},{"line":212,"col":24,"index":4709}],"523":[0,{"line":212,"col":2,"index":4687},{"line":212,"col":24,"index":4709}],"524":[0,{"line":214,"col":2,"index":4714},{"line":214,"col":24,"index":4736}],"525":[0,{"line":216,"col":10,"index":4749},{"line":216,"col":16,"index":4755}],"526":[0,{"line":216,"col":2,"index":4741},{"line":216,"col":16,"index":4755}],"527":[0,{"line":224,"col":19,"index":4976},{"line":224,"col":19,"index":4976}],"528":[0,{"line":224,"col":15,"index":4972},{"line":224,"col":15,"index":4972}],"529":[0,{"line":224,"col":2,"index":4959},{"line":224,"col":29,"index":4986}],"530":[0,{"line":14,"col":0,"index":140},{"line":228,"col":4925,"index":5065}]}} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.qnt b/quint/testFixture/SuperSpec.qnt index 2bd8e23ed..cae7f7639 100644 --- a/quint/testFixture/SuperSpec.qnt +++ b/quint/testFixture/SuperSpec.qnt @@ -197,6 +197,9 @@ module withConsts { val subseteq_empty = Set().subseteq(Set()) val powersets = Set(1).in(powerset(Set(1,2,3))) + // Builting list operators + val lists = Set(1, 2).allListsUpTo(3) + // a named assumption assume positive = N > 0 // an anonymous assumption From 20d146607c450f67323f53d5eb748e071c881882 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 22 May 2024 09:12:26 -0300 Subject: [PATCH 396/428] Remove outdated comment --- quint/src/runtime/impl/compilerImpl.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index ca47fc12d..5245b5d4c 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -983,8 +983,6 @@ export class CompilerVisitor implements IRVisitor { break case 'allListsUpTo': - // Overwrite the default implementation of allListsUpTo - // to avoid computing an infinite set of lists this.applyFun(app.id, 2, (set: RuntimeValue, max_length: RuntimeValue) => { let lists: Set = Set([[]]) let last_lists: Set = Set([[]]) From d7639320a15537f901f79cef4d354531a311e1d8 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 22 May 2024 13:31:23 -0300 Subject: [PATCH 397/428] Release v0.20.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06d961e2e..2eb46d14a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.20.0 -- 2024-05-22 + ### Added - Added an experimental `--mbt` flag to produce metadata that is useful for diff --git a/quint/package-lock.json b/quint/package-lock.json index ca404595b..c54766919 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.4", + "version": "0.20.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.4", + "version": "0.20.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 3ae4006bc..069d1f998 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.4", + "version": "0.20.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 25e1ed200..6badad235 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.4' +export const version = '0.20.0' From b2b8525234240b3621ddc880e144573c7ac3fc8f Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 22 May 2024 13:48:11 -0300 Subject: [PATCH 398/428] VSCode Release v0.14.4 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index d6937519b..e7f23e76e 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.4 -- 2024-05-22 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.14.3 -- 2024-05-14 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index d90b5c70d..078507cb5 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.3", + "version": "0.14.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.3", + "version": "0.14.4", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index d61398080..34056db19 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.3", + "version": "0.14.4", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 321c6d4fe..d8335321c 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.3", + "version": "0.14.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.3", + "version": "0.14.4", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.4", + "@informalsystems/quint": "^0.20.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", - "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.20.0.tgz", + "integrity": "sha512-q3jxvzVw0hw4yxOJcGzAMIguGfcyScs/BP5efqCxQeVMDxLsqy+SAgLH5CnM7UNJFXLawwuyRaCbIvq9+2BXRg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7190,9 +7190,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", - "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.20.0.tgz", + "integrity": "sha512-q3jxvzVw0hw4yxOJcGzAMIguGfcyScs/BP5efqCxQeVMDxLsqy+SAgLH5CnM7UNJFXLawwuyRaCbIvq9+2BXRg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 88b0865a0..ea29504b5 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.3", + "version": "0.14.4", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.4", + "@informalsystems/quint": "^0.20.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 650825e4f2504282bd5129e074e08c8cce5d18a9 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 17:05:10 +0200 Subject: [PATCH 399/428] introduce quint verify --server-url --- quint/package.json | 2 +- quint/src/apalache.ts | 30 ++++++++++++++++++++---------- quint/src/cli.ts | 5 +++++ quint/src/cliCommands.ts | 4 ++-- quint/src/compileToTlaplus.ts | 11 +++++++++-- quint/src/quintVerifier.ts | 7 +++++-- quint/src/version.ts | 2 +- 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/quint/package.json b/quint/package.json index 069d1f998..84ad3e449 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.20.0", + "version": "0.20.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index ae00a7015..82d92176f 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -38,7 +38,6 @@ import { verbosity } from './verbosity' import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' -const APALACHE_SERVER_URI = 'localhost:8822' const APALACHE_VERSION_TAG = '0.44.11' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' @@ -183,7 +182,10 @@ const grpcStubOptions = { oneofs: true, } -async function loadProtoDefViaReflection(retry: boolean): Promise> { +async function loadProtoDefViaReflection( + serverUrl: string, + retry: boolean +): Promise> { // Types of the gRPC interface type ServerReflectionRequest = { file_containing_symbol: string } type ServerReflectionResponseSuccess = { @@ -212,7 +214,7 @@ async function loadProtoDefViaReflection(retry: boolean): Promise) => stub.run(data, cb)), } @@ -275,13 +277,18 @@ function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { /** * Connect to the Apalache server, and verify that the gRPC channel is up. * + * @param serverUrl + * a connection URL, e.g., localhost:8822 + * * @param retry Wait for the gRPC connection to come up. * * @returns A promise resolving to a `right` if the connection is * successful, or a `left` if not. */ -async function tryConnect(retry: boolean = false): Promise> { - return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) +async function tryConnect(serverUrl: string, retry: boolean = false): Promise> { + return (await loadProtoDefViaReflection(serverUrl, retry)) + .map(protoDef => loadGrpcClient(serverUrl, protoDef)) + .map(apalache) } function downloadAndUnpackApalache(): Promise> { @@ -369,13 +376,16 @@ async function fetchApalache(verbosityLevel: number): Promise` equal to the path the Apalache dist was unpacked to, * - a `left` indicating an error. */ -export async function connect(verbosityLevel: number): Promise> { +export async function connect(serverUrl: string, verbosityLevel: number): Promise> { // Try to connect to Shai, and try to ping it - const connectionResult = await tryConnect() + const connectionResult = await tryConnect(serverUrl) // We managed to connect, simply return this connection if (connectionResult.isRight()) { return connectionResult @@ -425,7 +435,7 @@ export async function connect(verbosityLevel: number): Promise resolve(err(`Failed to launch Apalache server: ${error.message}`))) }) ) - .then(chain(() => tryConnect(true))) + .then(chain(() => tryConnect(serverUrl, true))) } /** diff --git a/quint/src/cli.ts b/quint/src/cli.ts index de485f4cb..3716e8ab8 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -291,6 +291,11 @@ const verifyCmd = { desc: 'control how much output is produced (0 to 5)', type: 'number', default: verbosity.defaultLevel, + }) + .option('server-url', { + desc: 'Apalache server URL', + type: 'string', + default: 'localhost:8822', }), // Timeouts are postponed for: // https://github.com/informalsystems/quint/issues/633 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 17182dbff..cc2d49a68 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -694,7 +694,7 @@ export async function outputCompilationTarget(compiled: CompiledStage): Promise< process.stdout.write(parsedSpecJson) return right(compiled) case 'tlaplus': { - const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) + const toTlaResult = await compileToTlaplus(args.serverUrl, parsedSpecJson, verbosityLevel) return toTlaResult .mapRight(tla => { process.stdout.write(tla) // Write out, since all went right @@ -763,7 +763,7 @@ export async function verifySpec(prev: CompiledStage): Promise { + return verify(args.serverUrl, config, verbosityLevel).then(res => { const elapsedMs = Date.now() - startMs return res .map(_ => { diff --git a/quint/src/compileToTlaplus.ts b/quint/src/compileToTlaplus.ts index 4df0a7995..f7d53f3ed 100644 --- a/quint/src/compileToTlaplus.ts +++ b/quint/src/compileToTlaplus.ts @@ -17,11 +17,18 @@ import { ApalacheResult, connect } from './apalache' /** * Get apalache to convert quint parse data into TLA+ * + * @param serverUrl + * a connection URL, e.g., localhost:8822 + * * @param parseDataJson the flattened, analyzed, parse data, in as a json string * * @returns right(tlaString) if parsing succeeds, or left(err) explaining the failure */ -export async function compileToTlaplus(parseDataJson: string, verbosityLevel: number): Promise> { +export async function compileToTlaplus( + serverUrl: string, + parseDataJson: string, + verbosityLevel: number +): Promise> { const config = { input: { source: { @@ -31,6 +38,6 @@ export async function compileToTlaplus(parseDataJson: string, verbosityLevel: nu }, }, } - const connectionResult = await connect(verbosityLevel) + const connectionResult = await connect(serverUrl, verbosityLevel) return connectionResult.asyncChain(conn => conn.tla(config)) } diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 3749c1b65..5e9a9e265 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -19,12 +19,15 @@ import { ApalacheResult, connect } from './apalache' /** * Verifies the configuration `config` by model checking it with the Apalache server * + * @param serverUrl + * a connection URL, e.g., localhost:8822 + * * @param config * an apalache configuration. See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(config: any, verbosityLevel: number): Promise> { - const connectionResult = await connect(verbosityLevel) +export async function verify(serverUrl: string, config: any, verbosityLevel: number): Promise> { + const connectionResult = await connect(serverUrl, verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } diff --git a/quint/src/version.ts b/quint/src/version.ts index 6badad235..0f80c2abd 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.20.0' +export const version = '0.20.1' From 73cca0e12d97dd2d328538897b702c808706cf3b Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 18:49:42 +0200 Subject: [PATCH 400/428] specify a server port + output by default --- quint/src/apalache.ts | 86 +++++++++++++++++++++++++++-------- quint/src/cli.ts | 14 +++++- quint/src/cliCommands.ts | 4 +- quint/src/compileToTlaplus.ts | 13 +++--- quint/src/quintVerifier.ts | 13 +++--- 5 files changed, 95 insertions(+), 35 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index 82d92176f..fdbd2d0df 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -10,7 +10,8 @@ * This functionality is enabled by managing and interacting with the Apalache * server. * - * @author Shon Feder + * @author Shon Feder, Informal Systems, 2024 + * @author Igor Konnov, konnov.phd, 2024 * * @module */ @@ -23,7 +24,7 @@ import os from 'os' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // import semver from 'semver' import { pipeline } from 'stream/promises' -import child_process from 'child_process' +import child_process, { StdioOptions } from 'child_process' import * as tar from 'tar' import * as grpc from '@grpc/grpc-js' import * as proto from '@grpc/proto-loader' @@ -38,6 +39,42 @@ import { verbosity } from './verbosity' import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' +/** + * A server endpoint for establishing a connection with the Apalache server. + */ +export interface ServerEndpoint { + hostname: string, + port: number, +} + +/** + * Parse an endpoint URL in the format hostname:port + * @param input the string to parse + * @returns either `left(error)`, or `right(ServerEndpoint)` + */ +export function parseServerEndpoint(input: string): Either { + const m = /^([a-zA-Z0-9\.]*):([0-9]+)$/.exec(input) + if (m) { + const port = Number.parseInt(m[2]) + if (port > 65535) { + return left(`Invalid port number ${port} in ${input}`) + } else { + return right({ hostname: m[1], port }) + } + } else { + return left(`Expected hostname:port, found: ${input}`) + } +} + +/** + * Convert an endpoint to a GRPC connection string. + * @param endpoint an endpoint + * @returns the connection string expected by the Apalache server API + */ +export function serverEndpointToConnectionString(endpoint: ServerEndpoint): string { + return `${endpoint.hostname}:${endpoint.port}` +} + const APALACHE_VERSION_TAG = '0.44.11' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' @@ -183,7 +220,7 @@ const grpcStubOptions = { } async function loadProtoDefViaReflection( - serverUrl: string, + serverEndpoint: ServerEndpoint, retry: boolean ): Promise> { // Types of the gRPC interface @@ -214,7 +251,8 @@ async function loadProtoDefViaReflection( const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection - const reflectionClient = new serverReflectionService(serverUrl, grpc.credentials.createInsecure()) + const connectionString = serverEndpointToConnectionString(serverEndpoint) + const reflectionClient = new serverReflectionService(connectionString, grpc.credentials.createInsecure()) // Wait for gRPC channel to come up, with 1sec pauses if (retry) { @@ -263,12 +301,13 @@ async function loadProtoDefViaReflection( ) } -function loadGrpcClient(serverUrl: string, protoDef: ProtoPackageDefinition): AsyncCmdExecutor { +function loadGrpcClient(serverEndpoint: ServerEndpoint, protoDef: ProtoPackageDefinition): AsyncCmdExecutor { const protoDescriptor = grpc.loadPackageDefinition(protoDef) - // The cast thru `unkown` lets us convince the type system of anything + // The cast thru `unknown` lets us convince the type system of anything // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion const pkg = protoDescriptor.shai as unknown as ShaiPkg - const stub: any = new pkg.cmdExecutor.CmdExecutor(serverUrl, grpc.credentials.createInsecure()) + const connectionString = serverEndpointToConnectionString(serverEndpoint) + const stub: any = new pkg.cmdExecutor.CmdExecutor(connectionString, grpc.credentials.createInsecure()) return { run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), } @@ -277,17 +316,17 @@ function loadGrpcClient(serverUrl: string, protoDef: ProtoPackageDefinition): As /** * Connect to the Apalache server, and verify that the gRPC channel is up. * - * @param serverUrl - * a connection URL, e.g., localhost:8822 + * @param serverEndpoint + * a server endpoint * * @param retry Wait for the gRPC connection to come up. * * @returns A promise resolving to a `right` if the connection is * successful, or a `left` if not. */ -async function tryConnect(serverUrl: string, retry: boolean = false): Promise> { - return (await loadProtoDefViaReflection(serverUrl, retry)) - .map(protoDef => loadGrpcClient(serverUrl, protoDef)) +async function tryConnect(serverEndpoint: ServerEndpoint, retry: boolean = false): Promise> { + return (await loadProtoDefViaReflection(serverEndpoint, retry)) + .map(protoDef => loadGrpcClient(serverEndpoint, protoDef)) .map(apalache) } @@ -376,16 +415,16 @@ async function fetchApalache(verbosityLevel: number): Promise` equal to the path the Apalache dist was unpacked to, * - a `left` indicating an error. */ -export async function connect(serverUrl: string, verbosityLevel: number): Promise> { +export async function connect(serverEndpoint: ServerEndpoint, verbosityLevel: number): Promise> { // Try to connect to Shai, and try to ping it - const connectionResult = await tryConnect(serverUrl) + const connectionResult = await tryConnect(serverEndpoint) // We managed to connect, simply return this connection if (connectionResult.isRight()) { return connectionResult @@ -399,8 +438,17 @@ export async function connect(serverUrl: string, verbosityLevel: number): Promis .asyncChain( async exe => new Promise>((resolve, _) => { - debugLog(verbosityLevel, 'Launching Apalache server') - const apalache = child_process.spawn(exe, ['server']) + debugLog(verbosityLevel, + `Launching Apalache server on ${serverEndpoint.hostname}:${serverEndpoint.port}`) + debugLog(verbosityLevel, `Spawning: ${exe}`) + // unless non-verbose output is requested, let Apalache write to stdout and stderr + const stdio: StdioOptions = + (verbosityLevel >= verbosity.defaultLevel ) + ? [ 'ignore', process.stdout, process.stderr ] + : [ 'ignore', 'ignore', 'ignore' ] + const options = { shell: true, stdio: stdio } + const args = ['server', `--port=${serverEndpoint.port}` ] + const apalache = child_process.spawn(exe, args, options) // Exit handler that kills Apalache if Quint exists function exitHandler() { @@ -435,7 +483,7 @@ export async function connect(serverUrl: string, verbosityLevel: number): Promis apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) }) ) - .then(chain(() => tryConnect(serverUrl, true))) + .then(chain(() => tryConnect(serverEndpoint, true))) } /** diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 3716e8ab8..ccfabefc7 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -7,6 +7,7 @@ * https://github.com/informalsystems/quint/blob/main/doc/quint.md * * @author Igor Konnov, Gabriela Moreira, Shon Feder, Informal Systems, 2021-2023 + * @author Igor Konnov, konnov.phd, 2024 */ import { fail } from 'assert' @@ -30,6 +31,7 @@ import { import { verbosity } from './verbosity' import { version } from './version' +import { parseServerEndpoint } from './apalache' const defaultOpts = (yargs: any) => yargs.option('out', { @@ -292,10 +294,18 @@ const verifyCmd = { type: 'number', default: verbosity.defaultLevel, }) - .option('server-url', { - desc: 'Apalache server URL', + .option('server-endpoint', { + desc: 'Apalache server GRPC endpoint hostname:port', type: 'string', default: 'localhost:8822', + }) + .coerce('server-endpoint', (arg: string) => { + const errorOrEndpoint = parseServerEndpoint(arg) + if (errorOrEndpoint.isLeft()) { + throw new Error(errorOrEndpoint.value) + } else { + return errorOrEndpoint.value + } }), // Timeouts are postponed for: // https://github.com/informalsystems/quint/issues/633 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index cc2d49a68..2df98973c 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -694,7 +694,7 @@ export async function outputCompilationTarget(compiled: CompiledStage): Promise< process.stdout.write(parsedSpecJson) return right(compiled) case 'tlaplus': { - const toTlaResult = await compileToTlaplus(args.serverUrl, parsedSpecJson, verbosityLevel) + const toTlaResult = await compileToTlaplus(args.serverEndpoint, parsedSpecJson, verbosityLevel) return toTlaResult .mapRight(tla => { process.stdout.write(tla) // Write out, since all went right @@ -763,7 +763,7 @@ export async function verifySpec(prev: CompiledStage): Promise { + return verify(args.serverEndpoint, config, verbosityLevel).then(res => { const elapsedMs = Date.now() - startMs return res .map(_ => { diff --git a/quint/src/compileToTlaplus.ts b/quint/src/compileToTlaplus.ts index f7d53f3ed..1ac0e62a1 100644 --- a/quint/src/compileToTlaplus.ts +++ b/quint/src/compileToTlaplus.ts @@ -7,25 +7,26 @@ /** * Use apalache to convert quint parse data into TLA+ * - * @author Shon Feder + * @author Shon Feder, Informal Systems, 2024 + * @author Igor Konnov, konnov.phd, 2024 * * @module */ -import { ApalacheResult, connect } from './apalache' +import { ApalacheResult, ServerEndpoint, connect } from './apalache' /** * Get apalache to convert quint parse data into TLA+ * - * @param serverUrl - * a connection URL, e.g., localhost:8822 + * @param serverEndpoint + * a server endpoint * * @param parseDataJson the flattened, analyzed, parse data, in as a json string * * @returns right(tlaString) if parsing succeeds, or left(err) explaining the failure */ export async function compileToTlaplus( - serverUrl: string, + serverEndpoint: ServerEndpoint, parseDataJson: string, verbosityLevel: number ): Promise> { @@ -38,6 +39,6 @@ export async function compileToTlaplus( }, }, } - const connectionResult = await connect(serverUrl, verbosityLevel) + const connectionResult = await connect(serverEndpoint, verbosityLevel) return connectionResult.asyncChain(conn => conn.tla(config)) } diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 5e9a9e265..7d50824b3 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -7,27 +7,28 @@ /** * Core logic of verification * - * @author Shon Feder + * @author Shon Feder, Informal Systems, 2024 + * @author Igor Konnov, konnov.phd, 2024 * * @module */ // TODO This module should subsume the pure logic from the verify commaind in cliCommand -import { ApalacheResult, connect } from './apalache' +import { ApalacheResult, ServerEndpoint, connect } from './apalache' /** * Verifies the configuration `config` by model checking it with the Apalache server * - * @param serverUrl - * a connection URL, e.g., localhost:8822 + * @param serverEndpoint + * a server endpoint * * @param config * an apalache configuration. See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(serverUrl: string, config: any, verbosityLevel: number): Promise> { - const connectionResult = await connect(serverUrl, verbosityLevel) +export async function verify(serverEndpoint: ServerEndpoint, config: any, verbosityLevel: number): Promise> { + const connectionResult = await connect(serverEndpoint, verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } From 1feab59924bc1cec60868adfb2b8add6d2e03ec0 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:01:02 +0200 Subject: [PATCH 401/428] update apalache-tests and my email --- quint/apalache-tests.md | 7 +++++++ quint/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index f377a9e77..864fcf7c0 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -65,6 +65,13 @@ quint verify ../examples/verification/defaultOpNames.qnt quint verify --invariant inv ../examples/verification/defaultOpNames.qnt ``` +### Can verify with custom server endpoint + + +``` +quint verify --server-endpoint=localhost:18000 ../examples/verification/defaultOpNames.qnt +``` + ### Can verify with two invariants diff --git a/quint/package.json b/quint/package.json index 84ad3e449..93b0fdbf9 100644 --- a/quint/package.json +++ b/quint/package.json @@ -20,7 +20,7 @@ }, { "name": "Igor Konnov", - "email": "igor@informal.systems" + "email": "igor@konnov.phd" }, { "name": "Shon Feder", From 41de64f8c0d62eb63beaff73f7b3ec47a95d4827 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:03:38 +0200 Subject: [PATCH 402/428] fix formatting --- quint/src/apalache.ts | 20 +++++++++++--------- quint/src/quintVerifier.ts | 6 +++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index fdbd2d0df..fd2b7ee01 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -43,8 +43,8 @@ import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-lo * A server endpoint for establishing a connection with the Apalache server. */ export interface ServerEndpoint { - hostname: string, - port: number, + hostname: string + port: number } /** @@ -422,7 +422,10 @@ async function fetchApalache(verbosityLevel: number): Promise` equal to the path the Apalache dist was unpacked to, * - a `left` indicating an error. */ -export async function connect(serverEndpoint: ServerEndpoint, verbosityLevel: number): Promise> { +export async function connect( + serverEndpoint: ServerEndpoint, + verbosityLevel: number +): Promise> { // Try to connect to Shai, and try to ping it const connectionResult = await tryConnect(serverEndpoint) // We managed to connect, simply return this connection @@ -438,16 +441,15 @@ export async function connect(serverEndpoint: ServerEndpoint, verbosityLevel: nu .asyncChain( async exe => new Promise>((resolve, _) => { - debugLog(verbosityLevel, - `Launching Apalache server on ${serverEndpoint.hostname}:${serverEndpoint.port}`) + debugLog(verbosityLevel, `Launching Apalache server on ${serverEndpoint.hostname}:${serverEndpoint.port}`) debugLog(verbosityLevel, `Spawning: ${exe}`) // unless non-verbose output is requested, let Apalache write to stdout and stderr const stdio: StdioOptions = - (verbosityLevel >= verbosity.defaultLevel ) - ? [ 'ignore', process.stdout, process.stderr ] - : [ 'ignore', 'ignore', 'ignore' ] + verbosityLevel >= verbosity.defaultLevel + ? ['ignore', process.stdout, process.stderr] + : ['ignore', 'ignore', 'ignore'] const options = { shell: true, stdio: stdio } - const args = ['server', `--port=${serverEndpoint.port}` ] + const args = ['server', `--port=${serverEndpoint.port}`] const apalache = child_process.spawn(exe, args, options) // Exit handler that kills Apalache if Quint exists diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 7d50824b3..5a8888510 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -28,7 +28,11 @@ import { ApalacheResult, ServerEndpoint, connect } from './apalache' * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(serverEndpoint: ServerEndpoint, config: any, verbosityLevel: number): Promise> { +export async function verify( + serverEndpoint: ServerEndpoint, + config: any, + verbosityLevel: number +): Promise> { const connectionResult = await connect(serverEndpoint, verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } From 630544c6b02d1f2b4c9a0d842ab3c2c73c3f38fc Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:05:08 +0200 Subject: [PATCH 403/428] reset the version number to 0.20.0 --- quint/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/package.json b/quint/package.json index 93b0fdbf9..6e5d2bffe 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.20.1", + "version": "0.20.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", From b32f3f3ac22a062cbdcd8279b3926f761c7a20bd Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:07:55 +0200 Subject: [PATCH 404/428] set quint verify verbosity to 0 --- quint/apalache-dist-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/apalache-dist-tests.md b/quint/apalache-dist-tests.md index c4a0a9294..82d20a1c3 100644 --- a/quint/apalache-dist-tests.md +++ b/quint/apalache-dist-tests.md @@ -21,10 +21,10 @@ again. ``` -quint verify ../examples/language-features/booleans.qnt | \ +quint verify --verbosity=0 ../examples/language-features/booleans.qnt | \ sed 's!https://.*!(asseturl)!' | \ sed -e 's/([0-9]*ms)/(duration)/' -quint verify ../examples/language-features/booleans.qnt | \ +quint verify --verbosity=0 ../examples/language-features/booleans.qnt | \ sed 's!\(Using existing Apalache distribution in \).*!\1(distdir)!' | \ sed -e 's/([0-9]*ms)/(duration)/' ``` From 00d22e9412a2e0153a673b91e2589a74d75dbf6e Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:10:21 +0200 Subject: [PATCH 405/428] fix formatting --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index fd2b7ee01..f04dd0c73 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -53,7 +53,7 @@ export interface ServerEndpoint { * @returns either `left(error)`, or `right(ServerEndpoint)` */ export function parseServerEndpoint(input: string): Either { - const m = /^([a-zA-Z0-9\.]*):([0-9]+)$/.exec(input) + const m = /^([a-zA-Z0-9.]*):([0-9]+)$/.exec(input) if (m) { const port = Number.parseInt(m[2]) if (port > 65535) { From 870a19723c1e8e687c4d40f75e2b0c76b5aba23a Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:10:56 +0200 Subject: [PATCH 406/428] unbump version --- quint/src/version.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/version.ts b/quint/src/version.ts index 0f80c2abd..6badad235 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.20.1' +export const version = '0.20.0' From a32de7cbfa8f2df9d462be03ae2bdac875a638b5 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:21:14 +0200 Subject: [PATCH 407/428] fix the compile tests --- quint/src/cli.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index ccfabefc7..96d069051 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -122,6 +122,19 @@ const compileCmd = { desc: 'control how much output is produced (0 to 5)', type: 'number', default: verbosity.defaultLevel, + }) + .option('server-endpoint', { + desc: 'Apalache server endpoint hostname:port', + type: 'string', + default: 'localhost:8822', + }) + .coerce('server-endpoint', (arg: string) => { + const errorOrEndpoint = parseServerEndpoint(arg) + if (errorOrEndpoint.isLeft()) { + throw new Error(errorOrEndpoint.value) + } else { + return errorOrEndpoint.value + } }), handler: (args: any) => load(args) @@ -295,7 +308,7 @@ const verifyCmd = { default: verbosity.defaultLevel, }) .option('server-endpoint', { - desc: 'Apalache server GRPC endpoint hostname:port', + desc: 'Apalache server endpoint hostname:port', type: 'string', default: 'localhost:8822', }) From ee418cfefe7d2be14e18c2cc9f064290908d5548 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 29 May 2024 19:30:54 +0200 Subject: [PATCH 408/428] fix the distribution test --- quint/apalache-dist-tests.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/quint/apalache-dist-tests.md b/quint/apalache-dist-tests.md index 82d20a1c3..c4ded45fb 100644 --- a/quint/apalache-dist-tests.md +++ b/quint/apalache-dist-tests.md @@ -21,10 +21,10 @@ again. ``` -quint verify --verbosity=0 ../examples/language-features/booleans.qnt | \ +quint verify --verbosity=1 ../examples/language-features/booleans.qnt | \ sed 's!https://.*!(asseturl)!' | \ sed -e 's/([0-9]*ms)/(duration)/' -quint verify --verbosity=0 ../examples/language-features/booleans.qnt | \ +quint verify --verbosity=1 ../examples/language-features/booleans.qnt | \ sed 's!\(Using existing Apalache distribution in \).*!\1(distdir)!' | \ sed -e 's/([0-9]*ms)/(duration)/' ``` @@ -33,9 +33,5 @@ quint verify --verbosity=0 ../examples/language-features/booleans.qnt | \ ``` Downloading Apalache distribution... done. [ok] No violation found (duration). -You may increase --max-steps. -Use --verbosity to produce more (or less) output. [ok] No violation found (duration). -You may increase --max-steps. -Use --verbosity to produce more (or less) output. ``` From a88639a76921ab2796f1cd8d3854ea61d6ba7eff Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Fri, 31 May 2024 14:56:59 +0200 Subject: [PATCH 409/428] comment out the new test to see whether it works --- quint/apalache-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 864fcf7c0..f13c5186d 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -69,7 +69,7 @@ quint verify --invariant inv ../examples/verification/defaultOpNames.qnt ``` -quint verify --server-endpoint=localhost:18000 ../examples/verification/defaultOpNames.qnt +#quint verify --server-endpoint=localhost:18000 ../examples/verification/defaultOpNames.qnt ``` ### Can verify with two invariants From 14c6bb4d54c8539ed55b8d1d96ee8766bdf28a32 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Fri, 31 May 2024 15:13:54 +0200 Subject: [PATCH 410/428] change the port --- quint/apalache-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index f13c5186d..578a0f764 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -69,7 +69,7 @@ quint verify --invariant inv ../examples/verification/defaultOpNames.qnt ``` -#quint verify --server-endpoint=localhost:18000 ../examples/verification/defaultOpNames.qnt +quint verify --server-endpoint=0.0.0.0:8823 --max-steps=2 ../examples/verification/defaultOpNames.qnt ``` ### Can verify with two invariants From 20331b28d374f712fff1a400bd40a31ecbc38953 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Fri, 31 May 2024 15:27:34 +0200 Subject: [PATCH 411/428] change the port to 8822 --- quint/apalache-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 578a0f764..edc84cec4 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -69,7 +69,7 @@ quint verify --invariant inv ../examples/verification/defaultOpNames.qnt ``` -quint verify --server-endpoint=0.0.0.0:8823 --max-steps=2 ../examples/verification/defaultOpNames.qnt +quint verify --server-endpoint=0.0.0.0:8822 --max-steps=2 ../examples/verification/defaultOpNames.qnt ``` ### Can verify with two invariants From ef9bc50cde9dfdac8b131e3dfbdc5b32d980e1ca Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 3 Jun 2024 14:57:02 -0300 Subject: [PATCH 412/428] Fix some comments --- quint/src/runtime/impl/compilerImpl.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 0d854800b..042aab958 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -934,10 +934,6 @@ export class CompilerVisitor implements IRVisitor { eval: () => { this.execListener.onUserOperatorCall(app) // compute the values of the arguments at this point - // const merged = mergeInMany().mapLeft((errors): QuintError => { - // this.execListener.onUserOperatorReturn(app, [], none()) - // return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } - // }) const values = args.map(arg => arg.eval()) const result = callableRef().chain(callable => { return callable.eval(values) @@ -962,7 +958,7 @@ export class CompilerVisitor implements IRVisitor { }) // After this point, the body of the lambda gets compiled. // The body of the lambda may refer to the parameter via names, - // which are stored in the registers we've right created. + // which are stored in the registers we've just created. } exitLambda(lam: ir.QuintLambda) { From 2519a952e05fe601b2414912dfdb0e0e1ef06db6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 3 Jun 2024 15:52:21 -0300 Subject: [PATCH 413/428] Fix reporting of assertion failures --- quint/src/runtime/impl/compilerImpl.ts | 16 +++++++--------- quint/src/runtime/testing.ts | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 042aab958..1e7668afe 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -823,7 +823,7 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - return left({ code: 'QNT508', message: 'Assertion failed' }) + return left({ code: 'QNT508', message: 'Assertion failed', reference: app.id }) } return right(cond) }) @@ -1146,16 +1146,14 @@ export class CompilerVisitor implements IRVisitor { // translate all { A, ..., C } or A.then(B) private translateAllOrThen(app: ir.QuintApp): void { - if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) - return - } - const args = this.compStack.splice(-app.args.length) - const kind = app.opcode === 'then' ? 'then' : 'all' - const lazyCompute = () => this.chainAllOrThen(args, kind, idx => app.args[idx].id) - this.compStack.push(mkFunComputable(lazyCompute)) + this.popArgs(app.args.length) + .map(args => { + const lazyComputable = () => this.chainAllOrThen(args, kind, idx => app.args[idx].id) + return this.compStack.push(mkFunComputable(lazyComputable)) + }) + .mapLeft(e => this.errorTracker.addRuntimeError(app.id, e)) } // Translate A.expect(P): diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index ef4ee0b53..d9f034122 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -148,7 +148,7 @@ export function compileAndTest( return { name, status: 'failed', - errors: ctx.getRuntimeErrors(), + errors: ctx.getRuntimeErrors().concat(result.value), seed, frames: recorder.getBestTrace().subframes, nsamples: nsamples, From b7aa7a80634bf88f9c39ac13858904918690c967 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 3 Jun 2024 18:24:32 -0300 Subject: [PATCH 414/428] Fix unit tests --- quint/src/repl.ts | 1 + quint/src/runtime/impl/base.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 15 +++++++++------ quint/src/runtime/impl/operatorEvaluator.ts | 11 ++++++++--- quint/test/runtime/compile.test.ts | 4 ++-- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/quint/src/repl.ts b/quint/src/repl.ts index 651d28ab8..de006c7b0 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -727,6 +727,7 @@ function evalExpr(state: ReplState, out: writer): Either { } return right(ex) }) + .mapLeft(e => state.evaluationState.errorTracker.addRuntimeError(e.reference, e)) .mapLeft(_ => '') }) diff --git a/quint/src/runtime/impl/base.ts b/quint/src/runtime/impl/base.ts index 73fa097cc..33fb33fa9 100644 --- a/quint/src/runtime/impl/base.ts +++ b/quint/src/runtime/impl/base.ts @@ -60,7 +60,7 @@ export class CompilerErrorTracker { this.compileErrors.push({ code, message, reference }) } - addRuntimeError(reference: bigint, error: QuintError) { + addRuntimeError(reference: bigint | undefined, error: QuintError) { this.runtimeErrors.push({ ...error, reference }) } } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e7668afe..34564bd67 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -2,9 +2,9 @@ * Compiler of Quint expressions and definitions to Computable values * that can be evaluated in the runtime. * - * Igor Konnov, Gabriela Moreira, 2022-2023 + * Igor Konnov, Gabriela Moreira, 2022-2024 * - * Copyright 2022-2023 Informal Systems + * Copyright 2022-2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. */ @@ -147,6 +147,7 @@ export class CompilerVisitor implements IRVisitor { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. let boundValue = this.compStack.pop() + if (boundValue === undefined) { this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return @@ -423,7 +424,7 @@ export class CompilerVisitor implements IRVisitor { if (q.toInt() !== 0n) { return right(rv.mkInt(p.toInt() / q.toInt())) } else { - return left({ code: 'QNT503', message: 'Division by zero' }) + return left({ code: 'QNT503', message: 'Division by zero', reference: app.id }) } }) break @@ -1034,7 +1035,7 @@ export class CompilerVisitor implements IRVisitor { reduceFunction: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { this.popArgs(2) - .map(args => mapLambdaThenReduce(reduceFunction, args)) + .map(args => mapLambdaThenReduce(sourceId, reduceFunction, args)) .map(comp => this.compStack.push(comp)) .mapLeft(e => this.errorTracker.addRuntimeError(sourceId, e)) } @@ -1053,7 +1054,7 @@ export class CompilerVisitor implements IRVisitor { // push the combined computable value on the stack private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => EvaluationResult) { this.popArgs(nargs) - .map(args => applyFun(fun, args)) + .map(args => applyFun(sourceId, fun, args)) .map(comp => this.compStack.push(comp)) .mapLeft(e => this.errorTracker.addRuntimeError(sourceId, e)) } @@ -1077,6 +1078,7 @@ export class CompilerVisitor implements IRVisitor { const comp = { eval: () => { // compute the values of the arguments at this point + // TODO: register errors const v = cond.eval().map(pred => (pred.equals(rv.mkBool(true)) ? thenArm.eval() : elseArm.eval())) return v.join() }, @@ -1121,11 +1123,12 @@ export class CompilerVisitor implements IRVisitor { if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - return left({ + result = left({ code: 'QNT513', message: `Cannot continue in A.then(B), A evaluates to 'false'`, reference: actionId(actionNo), }) + return result } else { return result } diff --git a/quint/src/runtime/impl/operatorEvaluator.ts b/quint/src/runtime/impl/operatorEvaluator.ts index 1777d4ccb..16666a2e3 100644 --- a/quint/src/runtime/impl/operatorEvaluator.ts +++ b/quint/src/runtime/impl/operatorEvaluator.ts @@ -8,7 +8,11 @@ import { List } from 'immutable' import { QuintError, quintErrorToString } from '../../quintError' // push the combined computable value on the stack -export function applyFun(fun: (..._args: RuntimeValue[]) => EvaluationResult, args: Computable[]): Computable { +export function applyFun( + sourceId: bigint, + fun: (..._args: RuntimeValue[]) => EvaluationResult, + args: Computable[] +): Computable { // produce the new computable value return { eval: () => { @@ -21,8 +25,7 @@ export function applyFun(fun: (..._args: RuntimeValue[]) => EvaluationResult, ar .chain(vs => fun(...vs.map(v => v as RuntimeValue))) } catch (error) { const msg = error instanceof Error ? error.message : 'unknown error' - console.error(`Internal error: ${msg}`) - return left({ code: 'QNT501', message: `Internal error: ${msg}` }) + return left({ code: 'QNT501', message: msg, reference: sourceId }) } }, } @@ -137,6 +140,7 @@ export function applyBoolOp( * The final result is stored on the stack. */ export function mapLambdaThenReduce( + sourceId: bigint, reduceFunction: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue, args: Computable[] ): Computable { @@ -149,6 +153,7 @@ export function mapLambdaThenReduce( return result.map(result => [result as RuntimeValue, elem]) } return applyFun( + sourceId, (iterable: Iterable): EvaluationResult => { const lambdaApplicationResults = mergeInMany(Array.from(iterable).map(value => evaluateElem(value))) return lambdaApplicationResults diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index a285b7f8e..6133a5219 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -973,7 +973,7 @@ describe('compiling specs to runtime values', () => { evalRun('run1', input) .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) - .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + .mapLeft(m => assert.equal(m, "[QNT513] Cannot continue in A.then(B), A evaluates to 'false'")) }) it('then returns false when rhs is false', () => { @@ -1012,7 +1012,7 @@ describe('compiling specs to runtime values', () => { evalRun('run1', input) .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) - .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + .mapLeft(m => assert.equal(m, "[QNT513] Cannot continue in A.then(B), A evaluates to 'false'")) }) it('fail', () => { From ccdac058815d863be3cf0828eb12e86601a350d6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 3 Jun 2024 18:34:13 -0300 Subject: [PATCH 415/428] Fix comments --- quint/src/runtime/impl/base.ts | 5 ++--- quint/src/runtime/impl/compilerImpl.ts | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/quint/src/runtime/impl/base.ts b/quint/src/runtime/impl/base.ts index 33fb33fa9..83bdddde0 100644 --- a/quint/src/runtime/impl/base.ts +++ b/quint/src/runtime/impl/base.ts @@ -1,6 +1,3 @@ -// Internal names in the compiler, which have special treatment. -// For some reason, if we replace 'q::input' with inputDefName, everything breaks. - import { Maybe, just, none } from '@sweet-monads/maybe' import { ErrorCode, QuintError } from '../../quintError' import { Computable, EvaluationResult, Register, kindName, mkCallable } from '../runtime' @@ -9,6 +6,8 @@ import { Trace } from './trace' import { Either, right } from '@sweet-monads/either' import { RuntimeValue, rv } from './runtimeValue' +// Internal names in the compiler, which have special treatment. +// For some reason, if we replace 'q::input' with inputDefName, everything breaks. // What kind of JS magic is that? export const specialNames = ['q::input', 'q::runResult', 'q::nruns', 'q::nsteps', 'q::init', 'q::next', 'q::inv'] diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 34564bd67..1e9487ffe 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -665,7 +665,7 @@ export class CompilerVisitor implements IRVisitor { break case 'isFinite': - // at the moment, we support only finite sets, so right return true + // at the moment, we support only finite sets, so just return true this.applyFun(app.id, 1, _set => right(rv.mkBool(true))) break @@ -887,7 +887,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push({ eval: () => error }) } - // look up for the operator to see, whether it's right an operator, or a parameter + // look up for the operator to see, whether it's just an operator, or a parameter const lookupEntry = this.lookupTable.get(app.id) if (lookupEntry === undefined) { return onError(app.id, `Called unknown operator ${app.opcode}`) From 816a9f02ebd10b2967caa6b6c7faa668a4b3e31b Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 4 Jun 2024 17:11:02 -0300 Subject: [PATCH 416/428] Fix and improve error reporting for registers --- quint/src/runtime/impl/compilerImpl.ts | 22 +++++++++++++++------- quint/src/runtime/runtime.ts | 7 +++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e9487ffe..81e4a9a4b 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -277,16 +277,20 @@ export class CompilerVisitor implements IRVisitor { // simply introduce two registers: // one for the variable, and // one for its next-state version - const prevRegister = mkRegister('var', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, { code: 'QNT502', message: `Variable ${varName} is not set` }) - ) + const prevRegister = mkRegister('var', varName, none(), { + code: 'QNT502', + message: `Variable ${varName} is not set`, + reference: vardef.id, + }) this.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name this.context.set(kindName('var', varName), prevRegister) this.context.set(kindName('var', vardef.id), prevRegister) - const nextRegister = mkRegister('nextvar', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, { code: 'QNT502', message: `${varName}' is not set` }) - ) + const nextRegister = mkRegister('nextvar', varName, none(), { + code: 'QNT502', + message: `${varName}' is not set`, + reference: vardef.id, + }) this.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name this.context.set(kindName('nextvar', varName), nextRegister) @@ -950,7 +954,11 @@ export class CompilerVisitor implements IRVisitor { enterLambda(lam: ir.QuintLambda) { // introduce a register for every parameter lam.params.forEach(p => { - const register = mkRegister('arg', p.name, none(), () => `Parameter ${p} is not set`) + const register = mkRegister('arg', p.name, none(), { + code: 'QNT501', + message: `Parameter ${p} is not set`, + reference: p.id, + }) this.context.set(kindName('arg', p.id), register) if (specialNames.includes(p.name)) { diff --git a/quint/src/runtime/runtime.ts b/quint/src/runtime/runtime.ts index 9a201bef3..d0f466a65 100644 --- a/quint/src/runtime/runtime.ts +++ b/quint/src/runtime/runtime.ts @@ -94,7 +94,7 @@ export function mkRegister( kind: ComputableKind, registerName: string, initValue: Maybe, - onUndefined: () => void + errorForMissing: QuintError ): Register { const reg: Register = { name: registerName, @@ -102,15 +102,14 @@ export function mkRegister( registerValue: initValue, // first, define a fruitless eval, as we cannot refer to registerValue yet eval: () => { - return left({ code: 'QNT501', message: `register ${registerName} is not defined` }) + return left(errorForMissing) }, } // override `eval`, as we can use `reg` now reg.eval = () => { // computing a register just evaluates to the contents that it stores if (reg.registerValue.isNone()) { - onUndefined() - return left({ code: 'QNT501', message: `register ${registerName} is not defined` }) + return left(errorForMissing) } return right(reg.registerValue.value) } From fe319b574017e74d37c33277c6e776972b4d8386 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 4 Jun 2024 17:11:20 -0300 Subject: [PATCH 417/428] Update tests with equivalent results from new random results (due to the seed-related fix) --- quint/cli-tests.md | 2 +- quint/io-cli-tests.md | 110 ++++++++++++++++++++---------------------- 2 files changed, 53 insertions(+), 59 deletions(-) diff --git a/quint/cli-tests.md b/quint/cli-tests.md index 8673077ad..1687b37e5 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -327,7 +327,7 @@ fi quint run --invariant=progressInv --main=gradualPonziTest \ --max-samples=1000 --max-steps=50 \ - --seed=0x8272b36d6a57f \ + --seed=0xa7bf730b93981 \ ../examples/solidity/GradualPonzi/gradualPonzi.qnt ### FAIL on run gradualPonzi::noLeftoversInv diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index d9744bc60..6c8c3cf22 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -523,10 +523,10 @@ An example execution: Map( "alice" -> 0, "bob" -> 0, - "charlie" -> - 44102953916667308628507282398473780107575312859495896164716387801811669677303, + "charlie" -> 0, "eve" -> 0, - "null" -> 0 + "null" -> + 47468303772350480796754932551497789850659553878128630540503207933116325625281 ), minter: "alice" } @@ -537,17 +537,17 @@ An example execution: Map( "alice" -> 0, "bob" -> 0, - "charlie" -> - 44102953916667308628507282398473780107575312859495896164716387801811669677303, - "eve" -> 0, + "charlie" -> 0, + "eve" -> + 86701019854146491074035808072771270690110858489697827845755906419340818387504, "null" -> - 106908608291568456374887716989928730685737039774957994870160634616776887554850 + 47468303772350480796754932551497789850659553878128630540503207933116325625281 ), minter: "alice" } [violation] Found an issue (duration). -Use --seed=0x1e352e160ffa12 to reproduce. +Use --seed=0x1e352e160ffbb3 to reproduce. Use --verbosity=3 to show executions. error: Invariant violated ``` @@ -582,7 +582,7 @@ q::initAndInvariant => true { balances: Map("alice" -> 0, "bob" -> 0, "charlie" -> 0, "eve" -> 0, "null" -> 0), - minter: "bob" + minter: "alice" } [Frame 1] @@ -590,17 +590,17 @@ q::stepAndInvariant => true ├─ q::step => true │ └─ step => true │ └─ mint( -│ "bob", -│ "null", -│ 65338262739825284111745959589547129900185534924167607765304796328491174113858 +│ "alice", +│ "eve", +│ 33944027745092921485394061592130395256199599638916782090017603421409072478812 │ ) => true │ ├─ require(true) => true │ └─ require(true) => true │ └─ isUInt( -│ 65338262739825284111745959589547129900185534924167607765304796328491174113858 +│ 33944027745092921485394061592130395256199599638916782090017603421409072478812 │ ) => true └─ isUInt( - 65338262739825284111745959589547129900185534924167607765304796328491174113858 + 33944027745092921485394061592130395256199599638916782090017603421409072478812 ) => true [State 1] @@ -610,33 +610,29 @@ q::stepAndInvariant => true "alice" -> 0, "bob" -> 0, "charlie" -> 0, - "eve" -> 0, - "null" -> - 65338262739825284111745959589547129900185534924167607765304796328491174113858 + "eve" -> + 33944027745092921485394061592130395256199599638916782090017603421409072478812, + "null" -> 0 ), - minter: "bob" + minter: "alice" } [Frame 2] q::stepAndInvariant => true ├─ q::step => true │ └─ step => true -│ └─ send( -│ "null", -│ "charlie", -│ 27846403266649766800055905337678576473819522457314621838114493230792952096574 +│ └─ mint( +│ "alice", +│ "eve", +│ 37478542505835205046968520025158070945751003972871720238447843997511300995974 │ ) => true │ ├─ require(true) => true -│ ├─ require(true) => true -│ │ └─ isUInt( -│ │ 37491859473175517311690054251868553426366012466852985927190303097698222017284 -│ │ ) => true │ └─ require(true) => true │ └─ isUInt( -│ 27846403266649766800055905337678576473819522457314621838114493230792952096574 +│ 71422570250928126532362581617288466201950603611788502328465447418920373474786 │ ) => true └─ isUInt( - 65338262739825284111745959589547129900185534924167607765304796328491174113858 + 71422570250928126532362581617288466201950603611788502328465447418920373474786 ) => true [State 2] @@ -645,13 +641,12 @@ q::stepAndInvariant => true Map( "alice" -> 0, "bob" -> 0, - "charlie" -> - 27846403266649766800055905337678576473819522457314621838114493230792952096574, - "eve" -> 0, - "null" -> - 37491859473175517311690054251868553426366012466852985927190303097698222017284 + "charlie" -> 0, + "eve" -> + 71422570250928126532362581617288466201950603611788502328465447418920373474786, + "null" -> 0 ), - minter: "bob" + minter: "alice" } [Frame 3] @@ -659,17 +654,17 @@ q::stepAndInvariant => true ├─ q::step => true │ └─ step => true │ └─ mint( -│ "bob", -│ "bob", -│ 78309058398957644239556030729021834730669174305685174769880015395650570612692 +│ "alice", +│ "null", +│ 109067983118832076063755963802104322727953985633488183463930115464609414175363 │ ) => true │ ├─ require(true) => true │ └─ require(true) => true │ └─ isUInt( -│ 78309058398957644239556030729021834730669174305685174769880015395650570612692 +│ 109067983118832076063755963802104322727953985633488183463930115464609414175363 │ ) => true └─ isUInt( - 143647321138782928351301990318568964630854709229852782535184811724141744726550 + 180490553369760202596118545419392788929904589245276685792395562883529787650149 ) => false [State 3] @@ -677,19 +672,18 @@ q::stepAndInvariant => true balances: Map( "alice" -> 0, - "bob" -> - 78309058398957644239556030729021834730669174305685174769880015395650570612692, - "charlie" -> - 27846403266649766800055905337678576473819522457314621838114493230792952096574, - "eve" -> 0, + "bob" -> 0, + "charlie" -> 0, + "eve" -> + 71422570250928126532362581617288466201950603611788502328465447418920373474786, "null" -> - 37491859473175517311690054251868553426366012466852985927190303097698222017284 + 109067983118832076063755963802104322727953985633488183463930115464609414175363 ), - minter: "bob" + minter: "alice" } [violation] Found an issue (duration). -Use --seed=0x1786e678d45fe0 to reproduce. +Use --seed=0x1786e678d460fe to reproduce. Use --verbosity=3 to show executions. error: Invariant violated ``` @@ -850,7 +844,7 @@ exit $exit_code ``` coin - 1) mintTwiceThenSendError failed after 1 test(s) + 1) mintTwiceThenSendError failed after 2 test(s) 1 failed @@ -863,45 +857,45 @@ init => true [Frame 1] mint( + "alice", "eve", - "eve", - 73435308175381280179895447726690458129319530672748326532002365461395069401291 + 62471107147077426559451191183102889181018012614560866566772535482230624081662 ) => true ├─ require(true) => true └─ require(true) => true └─ isUInt( - 73435308175381280179895447726690458129319530672748326532002365461395069401291 + 62471107147077426559451191183102889181018012614560866566772535482230624081662 ) => true [Frame 2] mint( - "eve", + "alice", "bob", - 99734648034668586428235027805035599638068011144525474004474309631475456844332 + 108068598360285515924422306643202051157703255799754639660642704769543958308579 ) => true ├─ require(true) => true └─ require(true) => true └─ isUInt( - 99734648034668586428235027805035599638068011144525474004474309631475456844332 + 108068598360285515924422306643202051157703255799754639660642704769543958308579 ) => true [Frame 3] send( "eve", "bob", - 31114836464924134533662521748469381767604427020159348918484988427058728862690 + 17111225533527540742175456584955554462321462289172248790585577326828420782641 ) => false ├─ require(true) => true ├─ require(true) => true │ └─ isUInt( -│ 42320471710457145646232925978221076361715103652588977613517377034336340538601 +│ 45359881613549885817275734598147334718696550325388617776186958155402203299021 │ ) => true └─ require(false) => false └─ isUInt( - 130849484499592720961897549553504981405672438164684822922959298058534185707022 + 125179823893813056666597763228157605620024718088926888451228282096372379091220 ) => false - Use --seed=0x1cce8452305113 --match=mintTwiceThenSendError to repeat. + Use --seed=0x1cce845230512f --match=mintTwiceThenSendError to repeat. ``` ### test fails on invalid seed From ea32f544853ff6769f4dc86810dfc3843bcd79f0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 4 Jun 2024 18:08:56 -0300 Subject: [PATCH 418/428] Update test from merge --- quint/io-cli-tests.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index c983ecaab..b8ccdecc3 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -780,13 +780,13 @@ rm out-itf-mbt-example.itf.json [ "bob", { - "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + "#bigint": "0" } ], [ "charlie", { - "#bigint": "0" + "#bigint": "49617995555028370892926474303042238797407019137772330780016167115018841762373" } ], [ @@ -808,7 +808,7 @@ rm out-itf-mbt-example.itf.json "amount": { "tag": "Some", "value": { - "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + "#bigint": "49617995555028370892926474303042238797407019137772330780016167115018841762373" } }, "eveToBob": { @@ -831,7 +831,7 @@ rm out-itf-mbt-example.itf.json }, "receiver": { "tag": "Some", - "value": "bob" + "value": "charlie" }, "sender": { "tag": "Some", From 73e21977e173933f03b3e37011c763f3f08fc97d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 4 Jun 2024 18:21:26 -0300 Subject: [PATCH 419/428] Add header comment to new files --- quint/src/runtime/impl/base.ts | 14 ++++++++++++++ quint/src/runtime/impl/operatorEvaluator.ts | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/quint/src/runtime/impl/base.ts b/quint/src/runtime/impl/base.ts index 83bdddde0..aea0e74df 100644 --- a/quint/src/runtime/impl/base.ts +++ b/quint/src/runtime/impl/base.ts @@ -1,3 +1,17 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2022-2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Base types and functions for the runtime implementation. + * + * @author Igor Konnov, Gabriela Moreira + * + * @module + */ + import { Maybe, just, none } from '@sweet-monads/maybe' import { ErrorCode, QuintError } from '../../quintError' import { Computable, EvaluationResult, Register, kindName, mkCallable } from '../runtime' diff --git a/quint/src/runtime/impl/operatorEvaluator.ts b/quint/src/runtime/impl/operatorEvaluator.ts index 16666a2e3..3c22f17d0 100644 --- a/quint/src/runtime/impl/operatorEvaluator.ts +++ b/quint/src/runtime/impl/operatorEvaluator.ts @@ -1,4 +1,17 @@ -// pop nargs computable values, pass them the 'fun' function, and +/* ---------------------------------------------------------------------------------- + * Copyright 2022-2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Stateless implementations for evaluating more complex operators, and helpers + * to operator evaluation. + * + * @author Igor Konnov, Gabriela Moreira + * + * @module + */ import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Callable, Computable, EvaluationResult } from '../runtime' @@ -7,6 +20,7 @@ import { strict as assert } from 'assert' import { List } from 'immutable' import { QuintError, quintErrorToString } from '../../quintError' +// pop nargs computable values, pass them the 'fun' function, and // push the combined computable value on the stack export function applyFun( sourceId: bigint, From df79bb5392b4f72c88e3b522aee1a67feb24ba78 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 4 Jun 2024 18:23:58 -0300 Subject: [PATCH 420/428] Add CHANGELOG entry for the seed behavior change --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eb46d14a..4b173e351 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed a problem where random numbers where internally produced without being + used. This affects behavior of randomness, and therefore same seeds will + behave differently before and after this version (#1453). + ### Security ## v0.20.0 -- 2024-05-22 From 78bd3104647ee2aded30ac996211b2aa5e0484ca Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Fri, 7 Jun 2024 15:39:47 -0300 Subject: [PATCH 421/428] Update CHANGELOG.md Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b173e351..1740fc9b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- Fixed a problem where random numbers where internally produced without being +- Fixed a problem where random numbers were internally produced without being used. This affects behavior of randomness, and therefore same seeds will behave differently before and after this version (#1453). From b74af27cdbf9b49edc8b8c105d4e6f000e919eff Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 10 Jun 2024 09:28:50 -0300 Subject: [PATCH 422/428] Fix interface and test after merge --- quint/io-cli-tests.md | 2 +- quint/src/cliCommands.ts | 18 +----------------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 8f807cbef..f41611598 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -758,7 +758,7 @@ rm out-itf-example.itf.json quint run --out-itf=out-itf-mbt-example.itf.json --max-steps=5 --seed=123 \ --invariant=totalSupplyDoesNotOverflowInv --mbt\ ../examples/solidity/Coin/coin.qnt -cat out-itf-mbt-example.itf.json | jq '.states[1]' +cat out-itf-mbt-example.itf.json | jq '.[0].states[1]' rm out-itf-mbt-example.itf.json ``` diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index e82778d14..5c09e06d8 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -532,23 +532,6 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Mon, 10 Jun 2024 09:34:55 -0300 Subject: [PATCH 423/428] Add CHANGELOG entries --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1740fc9b7..1cb49b379 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added an `--n-traces` option to the `run` subcommand so multiple traces can be + produced in a single CLI call (#1365). + ### Changed + +- The `run` subcommand, when used with `--out-itf`, now produces a list of + objects, just like `verify` (#1365). + ### Deprecated ### Removed ### Fixed From ea9c5518bfb5d0ba9bbdd3d62b6c8ad99795ce6b Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 10 Jun 2024 12:17:41 -0300 Subject: [PATCH 424/428] Produce multiple .itf.json files instead of a single file with a list, to comply with the standard --- quint/io-cli-tests.md | 33 +++++++--- quint/src/cliCommands.ts | 71 +++++++++------------ quint/src/repl.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 34 +++++----- quint/src/runtime/testing.ts | 24 +++---- quint/src/runtime/trace.ts | 87 ++++++++++++++------------ quint/src/simulation.ts | 27 ++++++-- 7 files changed, 154 insertions(+), 124 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index f41611598..f6c0d5d7e 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -737,7 +737,7 @@ error: Invariant violated quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 \ --invariant=totalSupplyDoesNotOverflowInv \ ../examples/solidity/Coin/coin.qnt -cat out-itf-example.itf.json | jq '.[0].states[0]."balances"."#map"[0]' +cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' rm out-itf-example.itf.json ``` @@ -758,7 +758,7 @@ rm out-itf-example.itf.json quint run --out-itf=out-itf-mbt-example.itf.json --max-steps=5 --seed=123 \ --invariant=totalSupplyDoesNotOverflowInv --mbt\ ../examples/solidity/Coin/coin.qnt -cat out-itf-mbt-example.itf.json | jq '.[0].states[1]' +cat out-itf-mbt-example.itf.json | jq '.states[1]' rm out-itf-mbt-example.itf.json ``` @@ -846,7 +846,7 @@ rm out-itf-mbt-example.itf.json ``` quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt -cat out-itf-example.itf.json | jq '.[0].states[0]."balances"."#map"[0]' +cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' rm out-itf-example.itf.json ``` @@ -864,14 +864,33 @@ rm out-itf-example.itf.json ``` -quint run --out-itf=out-itf-example.itf.json --n-traces=5 --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt -cat out-itf-example.itf.json | jq 'length' -rm out-itf-example.itf.json +quint run --out-itf=out-itf-example.itf.json --n-traces=3 --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt +cat out-itf-example0.itf.json | jq '.["#meta"].status' +rm out-itf-example*.itf.json ``` ``` -5 +"ok" +``` + +### Run to generate multiple ITF traces with violation + + +``` +quint run --out-itf=out-itf-example.itf.json --n-traces=3 --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt \ + --invariant=totalSupplyDoesNotOverflowInv +cat out-itf-example0.itf.json | jq '.["#meta"].status' +cat out-itf-example1.itf.json | jq '.["#meta"].status' +cat out-itf-example2.itf.json | jq '.["#meta"].status' +rm out-itf-example*.itf.json +``` + + +``` +"violation" +"violation" +"violation" ``` ### Test outputs ITF diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 5c09e06d8..d672db0ac 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -543,53 +543,40 @@ export async function runSimulator(prev: TypecheckedStage): Promise { + const itfFile: string | undefined = prev.args.outItf + if (itfFile) { + const filename = prev.args.nTraces > 1 ? itfFile.replaceAll('.itf.json', `${index}.itf.json`) : itfFile + const trace = toItf(vars, states) + if (trace.isRight()) { + const jsonObj = addItfHeader(prev.args.input, status, trace.value) + writeToJson(filename, jsonObj) + } else { + console.error(`ITF conversion failed on ${index}: ${trace.value}`) + } + } + }, } const elapsedMs = Date.now() - startMs - if (prev.args.outItf) { - const itfOutResult = mergeInMany( - results.map( - (result: SimulatorResult): Either => - toItf(result.vars, result.states).map(itf => [result.outcome, itf]) - ) - ).map(traceResults => { - const jsonObj = traceResults.map(([outcome, trace]) => addItfHeader(prev.args.input, outcome.status, trace)) - writeToJson(prev.args.outItf, jsonObj) - }) - - if (itfOutResult.isLeft()) { - return cliErr(`ITF conversion failed: ${itfOutResult.value}`, { ...simulator, errors: [] }) - } - } else if (results.length > 1) { - console.log( - `${results.length} traces where generated, but only the first failure or last success is printed to the console` - ) - console.log(`to view all the traces in the output file, rerun with the same seed and supply --out-itf`) - } - - const result = - results.find(r => r.outcome.status === 'error' || r.outcome.status === 'violation') ?? results[results.length - 1] + const result = compileAndRun(newIdGenerator(), mainText, mainStart, mainEnd, mainName, mainPath, options) switch (result.outcome.status) { case 'error': diff --git a/quint/src/repl.ts b/quint/src/repl.ts index 7ae8ad959..400177beb 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -733,7 +733,7 @@ function evalExpr(state: ReplState, out: writer): Either { }) if (verbosity.hasUserOpTracking(state.verbosity)) { - const trace = state.recorder.getBestTrace() + const trace = state.recorder.getBestTraces(1)[0].frame if (trace.subframes.length > 0) { out('\n') trace.subframes.forEach((f, i) => { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 760dc78c7..f5036dcfb 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1427,24 +1427,24 @@ export class CompilerVisitor implements IRVisitor { } private test(sourceId: bigint) { - if (this.compStack.length < 5) { + if (this.compStack.length < 6) { this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::test"') return } - const [nruns, nsteps, init, next, inv] = this.compStack.splice(-5) - this.runTestSimulation(nruns, nsteps, init, next, inv) + const [nruns, nsteps, nstraces, init, next, inv] = this.compStack.splice(-6) + this.runTestSimulation(nruns, nsteps, nstraces, init, next, inv) } private testOnce(sourceId: bigint) { - if (this.compStack.length < 4) { + if (this.compStack.length < 5) { this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::testOnce"') return } - const [nsteps, init, next, inv] = this.compStack.splice(-4) + const [nsteps, nstraces, init, next, inv] = this.compStack.splice(-5) const nruns = mkConstComputable(rv.mkInt(1n)) - this.runTestSimulation(nruns, nsteps, init, next, inv) + this.runTestSimulation(nruns, nsteps, nstraces, init, next, inv) } // The simulator core: produce multiple random runs @@ -1455,29 +1455,31 @@ export class CompilerVisitor implements IRVisitor { private runTestSimulation( nrunsComp: Computable, nstepsComp: Computable, + ntracesComp: Computable, init: Computable, next: Computable, inv: Computable ) { const doRun = (): EvaluationResult => { - return mergeInMany([nrunsComp, nstepsComp].map(c => c.eval())) + return mergeInMany([nrunsComp, nstepsComp, ntracesComp].map(c => c.eval())) .mapLeft((errors): QuintError => { return { code: 'QNT501', message: errors.map(quintErrorToString).join('\n') } }) - .chain(([nrunsRes, nstepsRes]) => { + .chain(([nrunsRes, nstepsRes, nTracesRes]) => { const isTrue = (res: EvaluationResult) => { return !res.isLeft() && (res.value as RuntimeValue).toBool() === true } // a failure flag for the case a runtime error is found let failure = false - // the value to be returned in the end of evaluation - let errorFound = false + // counter for errors found + let errorsFound = 0 // save the registers to recover them later const vars = this.snapshotVars() const nextVars = this.snapshotNextVars() // do multiple runs, stop at the first failing run const nruns = (nrunsRes as RuntimeValue).toInt() - for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { + const ntraces = (nTracesRes as RuntimeValue).toInt() + for (let runNo = 0; errorsFound < ntraces && !failure && runNo < nruns; runNo++) { this.execListener.onRunCall() this.trace.reset() // check Init() @@ -1497,11 +1499,11 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorReturn(initApp, [], toMaybe(initResult)) failure = invResult.isLeft() || failure if (!isTrue(invResult)) { - errorFound = true + errorsFound++ } else { // check all { Next(), shift(), Inv } in a loop const nsteps = (nstepsRes as RuntimeValue).toInt() - for (let i = 0; !errorFound && !failure && i < nsteps; i++) { + for (let i = 0; errorsFound < ntraces && !failure && i < nsteps; i++) { const nextApp: ir.QuintApp = { id: 0n, kind: 'app', @@ -1514,7 +1516,7 @@ export class CompilerVisitor implements IRVisitor { if (isTrue(nextResult)) { this.shiftVars() this.trace.extend(this.varsToRecord()) - errorFound = !isTrue(inv.eval()) + errorsFound += isTrue(inv.eval()) ? 0 : 1 this.execListener.onUserOperatorReturn(nextApp, [], toMaybe(nextResult)) } else { // Otherwise, the run cannot be extended. @@ -1531,7 +1533,7 @@ export class CompilerVisitor implements IRVisitor { } } } - const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() + const outcome = !failure ? just(rv.mkBool(errorsFound == 0)) : none() this.execListener.onRunReturn(outcome, this.trace.get()) // recover the state variables this.recoverVars(vars) @@ -1539,7 +1541,7 @@ export class CompilerVisitor implements IRVisitor { } // end of a single random run // finally, return true, if no error was found - return !failure ? right(rv.mkBool(!errorFound)) : left({ code: 'QNT501', message: 'Simulation failure' }) + return !failure ? right(rv.mkBool(errorsFound == 0)) : left({ code: 'QNT501', message: 'Simulation failure' }) }) } this.compStack.push(mkFunComputable(doRun)) diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index bed16a367..77b351bbc 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -16,7 +16,7 @@ import { CompilationContext, CompilationState, compile } from './compile' import { zerog } from './../idGenerator' import { LookupTable } from '../names/base' import { Computable, kindName } from './runtime' -import { ExecutionFrame, newTraceRecorder } from './trace' +import { ExecutionFrame, Trace, newTraceRecorder } from './trace' import { Rng } from '../rng' import { QuintError } from '../quintError' import { newEvaluationState, toMaybe } from './impl/base' @@ -104,11 +104,11 @@ export function compileAndTest( return left(ctxErrors) } - const saveTrace = (index: number, name: string, status: string) => { + const saveTrace = (trace: ExecutionFrame, index: number, name: string, status: string) => { // Save the best traces that are reported by the recorder: // If a test failed, it is the first failing trace. // Otherwise, it is the longest trace explored by the test. - const states = recorder.getBestTrace().args.map(e => e.toQuintEx(zerog)) + const states = trace.args.map(e => e.toQuintEx(zerog)) options.onTrace( index, name, @@ -149,6 +149,7 @@ export function compileAndTest( recorder.onRunReturn(toMaybe(result), []) } + const bestTrace = recorder.getBestTraces(1)[0].frame // evaluate the result if (result.isLeft()) { // if the test failed, return immediately @@ -157,7 +158,7 @@ export function compileAndTest( status: 'failed', errors: ctx.getRuntimeErrors().concat(result.value), seed, - frames: recorder.getBestTrace().subframes, + frames: bestTrace.subframes, nsamples: nsamples, } } @@ -170,7 +171,7 @@ export function compileAndTest( status: 'ignored', errors: [], seed: seed, - frames: recorder.getBestTrace().subframes, + frames: bestTrace.subframes, nsamples: nsamples, } } @@ -182,26 +183,26 @@ export function compileAndTest( message: `Test ${name} returned false`, reference: def.id, } - saveTrace(index, name, 'failed') + saveTrace(bestTrace, index, name, 'failed') return { name, status: 'failed', errors: [error], seed: seed, - frames: recorder.getBestTrace().subframes, + frames: bestTrace.subframes, nsamples: nsamples, } } else { if (options.rng.getState() === seed) { // This successful test did not use non-determinism. // Running it one time is sufficient. - saveTrace(index, name, 'passed') + saveTrace(bestTrace, index, name, 'passed') return { name, status: 'passed', errors: [], seed: seed, - frames: recorder.getBestTrace().subframes, + frames: bestTrace.subframes, nsamples: nsamples, } } @@ -209,13 +210,14 @@ export function compileAndTest( } // the test was run maxSamples times, and no errors were found - saveTrace(index, name, 'passed') + const bestTrace = recorder.getBestTraces(1)[0].frame + saveTrace(bestTrace, index, name, 'passed') return { name, status: 'passed', errors: [], seed: seed, - frames: recorder.getBestTrace().subframes, + frames: bestTrace.subframes, nsamples: nsamples - 1, } }) diff --git a/quint/src/runtime/trace.ts b/quint/src/runtime/trace.ts index 4120353bb..618024db6 100644 --- a/quint/src/runtime/trace.ts +++ b/quint/src/runtime/trace.ts @@ -16,6 +16,7 @@ import { EvalResult } from './runtime' import { verbosity } from './../verbosity' import { Rng } from './../rng' import { rv } from './impl/runtimeValue' +import { take } from 'lodash' /** * A snapshot of how a single operator (e.g., an action) was executed. @@ -50,6 +51,11 @@ export interface ExecutionFrame { subframes: ExecutionFrame[] } +export interface Trace { + frame: ExecutionFrame + seed: bigint +} + /** * A listener that receives events in the course of Quint evaluation. * This listener may be used to collect a trace, or to record profiling data. @@ -163,16 +169,11 @@ export interface TraceRecorder extends ExecutionListener { clear: () => void /** - * Get the best recorded trace. - * @returns the best recorded trace. - */ - getBestTrace: () => ExecutionFrame - - /** - * Get the seed of the best recorded trace. - * @returns the seed that was used to generate the best trace. + * Get the best recorded traces. + * @param n the number of traces to get + * @returns the best recorded traces. */ - getBestTraceSeed: () => bigint + getBestTraces(n: number): Trace[] } // a trace recording listener @@ -184,10 +185,8 @@ export const newTraceRecorder = (verbosityLevel: number, rng: Rng): TraceRecorde class TraceRecorderImpl implements TraceRecorder { verbosityLevel: number rng: Rng - // the best trace is stored here - private bestTrace: ExecutionFrame - // the seed value for the best trace is stored here - private bestTraceSeed: bigint + // all trace are stored here with their respective seeds + private traces: Trace[] // whenever a run is entered, we store its seed here private runSeed: bigint // During simulation, a trace is built here. @@ -201,24 +200,19 @@ class TraceRecorderImpl implements TraceRecorder { this.verbosityLevel = verbosityLevel this.rng = rng const bottom = this.newBottomFrame() - this.bestTrace = bottom - this.bestTraceSeed = rng.getState() - this.runSeed = this.bestTraceSeed + this.traces = [] + this.runSeed = this.rng.getState() this.frameStack = [bottom] } clear() { + this.traces = [] const bottom = this.newBottomFrame() - this.bestTrace = bottom this.frameStack = [bottom] } - getBestTrace(): ExecutionFrame { - return this.bestTrace - } - - getBestTraceSeed(): bigint { - return this.bestTraceSeed + getBestTraces(n: number): Trace[] { + return take(this.tracesByQuality(), n) } onUserOperatorCall(app: QuintApp) { @@ -325,8 +319,14 @@ class TraceRecorderImpl implements TraceRecorder { onRunReturn(outcome: Maybe, trace: EvalResult[]) { assert(this.frameStack.length > 0) - const bottom = this.frameStack[0] + const traceToSave = this.frameStack[0] + traceToSave.result = outcome + traceToSave.args = trace + this.traces.push({ frame: traceToSave, seed: this.runSeed }) + } + + private tracesByQuality(): Trace[] { const fromResult = (r: Maybe) => { if (r.isNone()) { return true @@ -336,23 +336,28 @@ class TraceRecorderImpl implements TraceRecorder { } } - const notOk = fromResult(outcome) - const prevNotOk = fromResult(this.bestTrace.result) - - // Prefer short traces for error, and longer traces for non error. - // Therefore, override the best trace only if: - // - there is an error, the new trace is shorter, or the old trace is non-error; - // - there is no error, the new trace is longer, and there was no error before. - const override = notOk - ? this.bestTrace.args.length === 0 || !prevNotOk || this.bestTrace.args.length >= bottom.args.length - : !prevNotOk && this.bestTrace.args.length <= bottom.args.length - - if (override) { - this.bestTrace = bottom - this.bestTraceSeed = this.runSeed - this.bestTrace.result = outcome - this.bestTrace.args = trace - } + return this.traces.sort((a, b) => { + // Prefer short traces for error, and longer traces for non error. + // Therefore, trace a is better than trace b if + // - a has an error, a is shorter, or b has error; + // - a has no error, a is longer, and b has no error. + const aNotOk = fromResult(a.frame.result) + const bNotOk = fromResult(b.frame.result) + if (aNotOk) { + if (bNotOk) { + return a.frame.args.length - b.frame.args.length + } else { + return -1 + } + } else { + // a is ok + if (bNotOk) { + return 1 + } else { + return b.frame.args.length - a.frame.args.length + } + } + }) } // create a bottom frame, which encodes the whole trace diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index dda8c5001..e8ddbd99b 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -13,7 +13,7 @@ import { Either } from '@sweet-monads/either' import { compileFromCode, contextNameLookup } from './runtime/compile' import { QuintEx } from './ir/quintIr' import { Computable } from './runtime/runtime' -import { ExecutionFrame, newTraceRecorder } from './runtime/trace' +import { ExecutionFrame, Trace, newTraceRecorder } from './runtime/trace' import { IdGenerator } from './idGenerator' import { Rng } from './rng' import { SourceLookupPath } from './parsing/sourceResolver' @@ -31,9 +31,11 @@ export interface SimulatorOptions { invariant: string maxSamples: number maxSteps: number + numberOfTraces: number rng: Rng verbosity: number storeMetadata: boolean + onTrace(index: number, status: string, vars: string[], states: QuintEx[]): void } /** The outcome of a simulation @@ -95,11 +97,11 @@ export function compileAndRun( const o = options // Defs required by the simulator, to be added to the main module before compilation const extraDefs = [ - `def q::test(q::nrunsArg, q::nstepsArg, q::initArg, q::nextArg, q::invArg) = false`, + `def q::test(q::nrunsArg, q::nstepsArg, q::ntracesArg, q::initArg, q::nextArg, q::invArg) = false`, `action q::init = { ${o.init} }`, `action q::step = { ${o.step} }`, `val q::inv = { ${o.invariant} }`, - `val q::runResult = q::test(${o.maxSamples}, ${o.maxSteps}, q::init, q::step, q::inv)`, + `val q::runResult = q::test(${o.maxSamples}, ${o.maxSteps}, ${o.numberOfTraces}, q::init, q::step, q::inv)`, ] // Construct the modules' code, adding the extra definitions to the main module @@ -132,8 +134,23 @@ export function compileAndRun( res.value.eval() } - const topFrame: ExecutionFrame = recorder.getBestTrace() + const topTraces: Trace[] = recorder.getBestTraces(options.numberOfTraces) + const vars = evaluationState.vars.map(v => v.name) + + topTraces.forEach((trace, index) => { + const maybeEvalResult = trace.frame.result + assert(maybeEvalResult.isJust(), 'invalid simulation failed to produce a result') + const quintExResult = maybeEvalResult.value.toQuintEx(idGen) + assert(quintExResult.kind === 'bool', 'invalid simulation produced non-boolean value ') + const simulationSucceeded = quintExResult.value + const status = simulationSucceeded ? 'ok' : 'violation' + const states = trace.frame.args.map(e => e.toQuintEx(idGen)) + options.onTrace(index, status, vars, states) + }) + + const topFrame = topTraces[0].frame + const seed = topTraces[0].seed // Validate required outcome of correct simulation const maybeEvalResult = topFrame.result assert(maybeEvalResult.isJust(), 'invalid simulation failed to produce a result') @@ -141,10 +158,8 @@ export function compileAndRun( assert(quintExResult.kind === 'bool', 'invalid simulation produced non-boolean value ') const simulationSucceeded = quintExResult.value - const vars = evaluationState.vars.map(v => v.name) const states = topFrame.args.map(e => e.toQuintEx(idGen)) const frames = topFrame.subframes - const seed = recorder.getBestTraceSeed() const runtimeErrors = ctx.getRuntimeErrors() if (runtimeErrors.length > 0) { From e78c17305a2c0abfedc9c577395d8ecdd0d530b2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 10 Jun 2024 12:56:25 -0300 Subject: [PATCH 425/428] Fix stateless frame tracking and tests --- quint/src/cliCommands.ts | 30 +++++++++++++------------- quint/src/repl.ts | 14 +++++++++--- quint/src/runtime/impl/compilerImpl.ts | 8 +++---- quint/src/runtime/testing.ts | 2 +- quint/src/runtime/trace.ts | 8 +++++++ quint/test/repl.test.ts | 16 +++++++------- quint/test/runtime/trace.test.ts | 6 +++--- 7 files changed, 50 insertions(+), 34 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index d672db0ac..ca2c8d76a 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -24,7 +24,7 @@ import { } from './parsing/quintParserFrontend' import { ErrorMessage } from './ErrorMessage' -import { Either, left, mergeInMany, right } from '@sweet-monads/either' +import { Either, left, right } from '@sweet-monads/either' import { fail } from 'assert' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' @@ -36,8 +36,8 @@ import { DocumentationEntry, produceDocs, toMarkdown } from './docs' import { QuintError, quintErrorToString } from './quintError' import { TestOptions, TestResult, compileAndTest } from './runtime/testing' import { IdGenerator, newIdGenerator } from './idGenerator' -import { SimulatorOptions, compileAndRun, SimulatorResult, Outcome } from './simulation' -import { ItfTrace, ofItf, toItf } from './itf' +import { SimulatorOptions, compileAndRun } from './simulation' +import { ofItf, toItf } from './itf' import { printExecutionFrameRec, printTrace, terminalWidth } from './graphics' import { verbosity } from './verbosity' import { Rng, newRng } from './rng' @@ -532,17 +532,6 @@ export async function runSimulator(prev: TypecheckedStage): Promise m.name === mainName) - if (mainModule === undefined) { - return cliErr(`Main module ${mainName} not found`, { ...simulator, errors: [] }) - } - const mainId = mainModule.id - const mainStart = prev.sourceMap.get(mainId)!.start.index - const mainEnd = prev.sourceMap.get(mainId)!.end!.index const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { return cliErr(rngOrError.value, { ...simulator, errors: [] }) @@ -574,10 +563,21 @@ export async function runSimulator(prev: TypecheckedStage): Promise m.name === mainName) + if (mainModule === undefined) { + return cliErr(`Main module ${mainName} not found`, { ...simulator, errors: [] }) + } + const mainId = mainModule.id + const mainStart = prev.sourceMap.get(mainId)!.start.index + const mainEnd = prev.sourceMap.get(mainId)!.end!.index const result = compileAndRun(newIdGenerator(), mainText, mainStart, mainEnd, mainName, mainPath, options) + const elapsedMs = Date.now() - startMs + switch (result.outcome.status) { case 'error': return cliErr('Runtime error', { diff --git a/quint/src/repl.ts b/quint/src/repl.ts index 400177beb..968c2b9aa 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -481,8 +481,16 @@ function saveVars(vars: Register[], nextvars: Register[]): Maybe { // In the future, we will declare them in a separate module. function simulatorBuiltins(st: CompilationState): QuintDef[] { return [ - parseDefOrThrow(`def q::test = (q::nruns, q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), - parseDefOrThrow(`def q::testOnce = (q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), + parseDefOrThrow( + `def q::test = (q::nruns, q::nsteps, q::ntraces, q::init, q::next, q::inv) => false`, + st.idGen, + st.sourceMap + ), + parseDefOrThrow( + `def q::testOnce = (q::nsteps, q::ntraces, q::init, q::next, q::inv) => false`, + st.idGen, + st.sourceMap + ), ] } @@ -733,7 +741,7 @@ function evalExpr(state: ReplState, out: writer): Either { }) if (verbosity.hasUserOpTracking(state.verbosity)) { - const trace = state.recorder.getBestTraces(1)[0].frame + const trace = state.recorder.currentFrame if (trace.subframes.length > 0) { out('\n') trace.subframes.forEach((f, i) => { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index f5036dcfb..e825ed166 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1432,8 +1432,8 @@ export class CompilerVisitor implements IRVisitor { return } - const [nruns, nsteps, nstraces, init, next, inv] = this.compStack.splice(-6) - this.runTestSimulation(nruns, nsteps, nstraces, init, next, inv) + const [nruns, nsteps, ntraces, init, next, inv] = this.compStack.splice(-6) + this.runTestSimulation(nruns, nsteps, ntraces, init, next, inv) } private testOnce(sourceId: bigint) { @@ -1442,9 +1442,9 @@ export class CompilerVisitor implements IRVisitor { return } - const [nsteps, nstraces, init, next, inv] = this.compStack.splice(-5) + const [nsteps, ntraces, init, next, inv] = this.compStack.splice(-5) const nruns = mkConstComputable(rv.mkInt(1n)) - this.runTestSimulation(nruns, nsteps, nstraces, init, next, inv) + this.runTestSimulation(nruns, nsteps, ntraces, init, next, inv) } // The simulator core: produce multiple random runs diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 77b351bbc..47a9fa549 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -16,7 +16,7 @@ import { CompilationContext, CompilationState, compile } from './compile' import { zerog } from './../idGenerator' import { LookupTable } from '../names/base' import { Computable, kindName } from './runtime' -import { ExecutionFrame, Trace, newTraceRecorder } from './trace' +import { ExecutionFrame, newTraceRecorder } from './trace' import { Rng } from '../rng' import { QuintError } from '../quintError' import { newEvaluationState, toMaybe } from './impl/base' diff --git a/quint/src/runtime/trace.ts b/quint/src/runtime/trace.ts index 618024db6..06f0ec82e 100644 --- a/quint/src/runtime/trace.ts +++ b/quint/src/runtime/trace.ts @@ -163,6 +163,11 @@ export interface TraceRecorder extends ExecutionListener { */ rng: Rng + /** + * The current frame that is being recorded. + */ + currentFrame: ExecutionFrame + /** * Clear the recorded trace */ @@ -185,6 +190,7 @@ export const newTraceRecorder = (verbosityLevel: number, rng: Rng): TraceRecorde class TraceRecorderImpl implements TraceRecorder { verbosityLevel: number rng: Rng + currentFrame: ExecutionFrame // all trace are stored here with their respective seeds private traces: Trace[] // whenever a run is entered, we store its seed here @@ -202,12 +208,14 @@ class TraceRecorderImpl implements TraceRecorder { const bottom = this.newBottomFrame() this.traces = [] this.runSeed = this.rng.getState() + this.currentFrame = bottom this.frameStack = [bottom] } clear() { this.traces = [] const bottom = this.newBottomFrame() + this.currentFrame = bottom this.frameStack = [bottom] } diff --git a/quint/test/repl.test.ts b/quint/test/repl.test.ts index 128b7006b..764fe03e0 100644 --- a/quint/test/repl.test.ts +++ b/quint/test/repl.test.ts @@ -678,10 +678,10 @@ describe('repl ok', () => { |action Init = n' = 0 |action Next = n' = n + 1 |val Inv = n < 10 - |q::testOnce(5, Init, Next, Inv) - |q::testOnce(10, Init, Next, Inv) - |q::test(5, 5, Init, Next, Inv) - |q::test(5, 10, Init, Next, Inv) + |q::testOnce(5, 1, Init, Next, Inv) + |q::testOnce(10, 1, Init, Next, Inv) + |q::test(5, 5, 1, Init, Next, Inv) + |q::test(5, 10, 1, Init, Next, Inv) |q::lastTrace.length() |q::lastTrace.nth(q::lastTrace.length() - 1) |` @@ -696,13 +696,13 @@ describe('repl ok', () => { | |>>> val Inv = n < 10 | - |>>> q::testOnce(5, Init, Next, Inv) + |>>> q::testOnce(5, 1, Init, Next, Inv) |true - |>>> q::testOnce(10, Init, Next, Inv) + |>>> q::testOnce(10, 1, Init, Next, Inv) |false - |>>> q::test(5, 5, Init, Next, Inv) + |>>> q::test(5, 5, 1, Init, Next, Inv) |true - |>>> q::test(5, 10, Init, Next, Inv) + |>>> q::test(5, 10, 1, Init, Next, Inv) |false |>>> q::lastTrace.length() |11 diff --git a/quint/test/runtime/trace.test.ts b/quint/test/runtime/trace.test.ts index 7c9f34c66..ef210f7cf 100644 --- a/quint/test/runtime/trace.test.ts +++ b/quint/test/runtime/trace.test.ts @@ -15,7 +15,7 @@ describe('newTraceRecorder', () => { rec.onUserOperatorReturn(A, [], none()) rec.onUserOperatorCall(A) rec.onUserOperatorReturn(A, [], none()) - const trace = rec.getBestTrace() + const trace = rec.currentFrame assert(trace.subframes.length === 2) assert(trace.subframes[0].app === A) assert(trace.subframes[0].subframes.length === 0) @@ -36,7 +36,7 @@ describe('newTraceRecorder', () => { rec.onUserOperatorReturn(A, [], none()) rec.onUserOperatorCall(A) rec.onUserOperatorReturn(A, [], none()) - const trace = rec.getBestTrace() + const trace = rec.currentFrame assert(trace.subframes.length === 2) assert(trace.subframes[0].app === A) assert(trace.subframes[0].subframes.length === 2) @@ -87,7 +87,7 @@ describe('newTraceRecorder', () => { rec.onUserOperatorCall(A) rec.onUserOperatorReturn(A, [], none()) - const trace = rec.getBestTrace() + const trace = rec.currentFrame assert(trace.subframes.length === 4) // A() is the operator before `any { ... }` assert(trace.subframes[0].app === A) From 3f0c6c7744dc6e57833fadbf81de7c5c1c7454e7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 10 Jun 2024 12:58:45 -0300 Subject: [PATCH 426/428] Update CHANGELOG and documentation --- CHANGELOG.md | 4 ---- doc/quint.md | 4 +++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cb49b379..ca7a5f84d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 produced in a single CLI call (#1365). ### Changed - -- The `run` subcommand, when used with `--out-itf`, now produces a list of - objects, just like `verify` (#1365). - ### Deprecated ### Removed ### Fixed diff --git a/doc/quint.md b/doc/quint.md index e3c3c079f..569ae9a64 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -224,6 +224,8 @@ Options: (suppresses all console output) [string] --max-samples the maximum on the number of traces to try [number] [default: 10000] + --n-traces how many traces to generate (only affects output to out-itf) + [number] [default: 1] --max-steps the maximum on the number of steps in every trace [number] [default: 20] --init name of the initializer action [string] [default: "init"] @@ -241,7 +243,7 @@ Options: violating trace, it prints the longest sample trace that the simulator has found during the execution. When the parameter `--out` is supplied, the trace is written as a JSON representation of Quint IR in the output file. When the - parameter `--out-itf` is supplied, the trace is written in the [Informal Trace + parameter `--out-itf` is supplied, the traces are written in the [Informal Trace Format][]. This output can be conviently displayed with the [ITF Trace Viewer][], or just with [jq][]. From 1afcbb19105f52e3f8911b5ef48b2dfa56b50d5c Mon Sep 17 00:00:00 2001 From: bugarela Date: Sun, 16 Jun 2024 19:52:15 -0300 Subject: [PATCH 427/428] Fix comment description --- quint/src/runtime/trace.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/src/runtime/trace.ts b/quint/src/runtime/trace.ts index 06f0ec82e..59c0be85d 100644 --- a/quint/src/runtime/trace.ts +++ b/quint/src/runtime/trace.ts @@ -346,9 +346,9 @@ class TraceRecorderImpl implements TraceRecorder { return this.traces.sort((a, b) => { // Prefer short traces for error, and longer traces for non error. - // Therefore, trace a is better than trace b if - // - a has an error, a is shorter, or b has error; - // - a has no error, a is longer, and b has no error. + // Therefore, trace a is better than trace b iff + // - when a has an error: a is shorter or b has no error; + // - when a has no error: a is longer and b has no error. const aNotOk = fromResult(a.frame.result) const bNotOk = fromResult(b.frame.result) if (aNotOk) { From 4f6748d870cf31217fe453827b439e280c9bd021 Mon Sep 17 00:00:00 2001 From: bugarela Date: Sun, 16 Jun 2024 20:33:35 -0300 Subject: [PATCH 428/428] Release v0.21.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca7a5f84d..464e86526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.21.0 -- 2024-06-16 + ### Added - Added an `--n-traces` option to the `run` subcommand so multiple traces can be diff --git a/quint/package-lock.json b/quint/package-lock.json index c54766919..3e83d44f1 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.20.0", + "version": "0.21.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.20.0", + "version": "0.21.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 6e5d2bffe..50b1891bc 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.20.0", + "version": "0.21.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 6badad235..a2d809461 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.20.0' +export const version = '0.21.0'

-Quint Lang Logo +Quint Lang Logo

Quint Lang

From 5405ca54c1af130c7875ce7e601ebad11bd4b351 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:32:56 -0300 Subject: [PATCH 147/428] Update ADR indexing --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1ee9e770d..df5d74693 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,6 @@ same principles in Quint, see [Contributing to Apalache][]. ## Developer docs - - [roadmap](./doc/roadmap.md) - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) - [ADR002: Error codes](./doc/adr002-errors.md) @@ -21,6 +20,8 @@ same principles in Quint, see [Contributing to Apalache][]. - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) + - [ADR007: Flattening](./doc/adr007-flattening.md) + - [ADR008: Obtaining and Launching Apalache from Quint](./doc/adr008-managing-apalache.md) ## Coordinating work From 2bbfdb5105cd4898417ace30991250a6f5769f42 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 18:02:34 -0500 Subject: [PATCH 148/428] Simply and clarify verify command - Allows dropping the --main - Shows what is in the config.json --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 42ec9d416..fc65e29fa 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,8 @@ Quint (with the help of [Apalache][apalache]) can check to ensure that after the empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. ``` bluespec -quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json +echo '{ "checker": { "no-deadlocks": true } }' > config.json +quint verify quint_team_secret_santa.qnt --invariant=everyone_gets_a_santa --apalache-config=config.json [ok] No violation found (2119ms). You may increase --max-steps. ``` @@ -113,7 +114,7 @@ This specification has no safeguards against people being their own santa! Quint this happens. Sorry kids, I hope you don't mind buying your own present :cry:! ``` bluespec -quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa +quint verify quint_team_secret_santa.qnt --invariant=no_person_is_self_santa An example execution: [State 0] From d98cbf184e0ca1d681c130e06641c95c8a2362eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 18:06:31 -0500 Subject: [PATCH 149/428] Add documentation and link to that --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fc65e29fa..29db81ea8 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ @@ -254,6 +254,14 @@ Cosmos in 2023. - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint +## Documentation + +View the [Quint documentation](./doc#readme). + +We aspire to having great, comprehensive documentation. At present, we have a +good start, but still far to go. Please try what we have available and share +with us any needs we have not yet been able to meet. + ## On "Quint" Quint is short for 'quintessence', from alchemy, which refers to the fifth From f8e1bd257ede77f93c6c501e3e75d0da7b026af2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 18 Dec 2023 18:42:43 -0300 Subject: [PATCH 150/428] Add confirmation after drawing --- examples/language-features/option.qnt | 15 ------- .../secret-santa/basic_secret_santa.qnt | 42 +++++++++++++++++++ .../secret-santa/quint_team_secret_santa.qnt | 28 +++++++++++++ .../secret_santa_with_confirmation.qnt | 13 ++++++ .../secret-santa/secret_santa_with_redraw.qnt | 41 ++++++++++++++++++ .../secret-santa/secret_santa_with_reset.qnt | 14 +++++++ 6 files changed, 138 insertions(+), 15 deletions(-) create mode 100644 examples/puzzles/secret-santa/basic_secret_santa.qnt create mode 100644 examples/puzzles/secret-santa/quint_team_secret_santa.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_redraw.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_reset.qnt diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 871eda916..f8fbce203 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -7,21 +7,6 @@ module option { | Some(int) var votes: List[VoteOption] - var outcome: int - - action init = all { - votes' = [], - outcome' = 0 - } - - action vote(v) = { - votes' = votes.append(Some(v)) - } - - action unvote(i) = all { - votes[i] != None, - votes' = votes.replaceAt(i, None), - } val sumVotes = votes.foldl(0, (sum, v) => match v { diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt new file mode 100644 index 000000000..6d385225d --- /dev/null +++ b/examples/puzzles/secret-santa/basic_secret_santa.qnt @@ -0,0 +1,42 @@ +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// the bowl of participants, containing a paper piece for each participant name + var bowl: Set[str] + + val santas = recipient_for_santa.keys() + val recipients = participants.map(p => recipient_for_santa.get(p)) + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + } + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + } + } + + action step = all { + bowl.size() > 0, + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } + + val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) + + val no_person_is_self_santa = santas.forall(person => + get(recipient_for_santa, person) != person + ) + + val invariant = everyone_gets_a_santa and no_person_is_self_santa +} diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt new file mode 100644 index 000000000..5e16cde3d --- /dev/null +++ b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt @@ -0,0 +1,28 @@ +module quint_team_secret_santa { + import basicSpells.* from "../../spells/basicSpells" + import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./secret_santa_with_redraw" + + action assign_santa_and_confirm(santa, recipient) = all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient } + } + + run deadlock_Test = init_with_confirmation + .then(assign_santa_and_confirm("Igor", "Jure")) + .then(assign_santa_and_confirm("Thomas", "Shon")) + .then(assign_santa_and_confirm("Jure", "Igor")) + .then(assign_santa_and_confirm("Shon", "Thomas")) + .then(step_with_confirmation) + .expect(bowl == Set() implies no_person_is_self_santa) + + // run finding_out_my_santa_Test = init_redraw + // .then(assign_santa_and_confirm("Igor", "Jure")) + // .then(assign_santa_and_confirm("Thomas", "Shon")) + // .then(assign_santa_and_confirm("Jure", "Igor")) + // .then(assign_santa_and_confirm("Gabriela", "Gabriela")) + // .then(redraw("Gabriela")) + // .then(draw_name("Shon")) + // .expect(santa_for.get("Shon") == "Gabriela") + +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt new file mode 100644 index 000000000..6e37ac6ea --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt @@ -0,0 +1,13 @@ +module secret_santa_with_confirmation { + import secret_santa.* from "./basic_secret_santa" + export secret_santa.* + + // whether the last participant confimed they didn't picked themselves + var last_draw: { participant: str, confirmed: bool } + + action init_with_confirmation = all { + recipient_for_santa' = Map(), + bowl' = participants, + last_draw' = { participant: "none", confirmed: false } + } +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt new file mode 100644 index 000000000..95f6c502e --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt @@ -0,0 +1,41 @@ +module secret_santa_with_redraw { + // When a participant draws themself, they put their name back and draw again + + import basicSpells.* from "../../spells/basicSpells" + import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" + export secret_santa_with_confirmation.* + + action redraw(participant: str): bool = { + nondet new_name = bowl.oneOf() + all { + bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.set(participant, new_name), + last_draw' = { participant: participant, confirmed: new_name != participant } + } + } + + action step_with_confirmation = + if (last_draw.confirmed) all { + bowl.size() > 0, + nondet santa = participants.filter(participant => not(participant.in(recipient_for_santa.keys()))).oneOf() + nondet recipient = bowl.oneOf() + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient } + } + } else all { + bowl != Set(), + redraw(last_draw.participant) + } + + + val inv = (bowl.size() == 0 and last_draw.confirmed) implies no_person_is_self_santa + + // temporal problem = + + // We need fairness for this to work + temporal success = always(bowl == Set() implies eventually(no_person_is_self_santa)) + + // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt new file mode 100644 index 000000000..2d2afd36c --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt @@ -0,0 +1,14 @@ +module secret_santa_with_reset { + // When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" + export secret_santa_with_confirmation.* + + action step_with_reset = + if (last_draw.confirmed) { + step + } else { + init + } + + val inv = bowl.size() == 0 implies no_person_is_self_santa +} From b56a59131e69bc1f1fd5ea0608b884a2d8f9bfd9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 18 Dec 2023 19:14:30 -0500 Subject: [PATCH 151/428] Add quint logo to VSCode Plugin --- vscode/quint-vscode/package.json | 1 + vscode/quint-vscode/quint-logo-vscode.png | Bin 0 -> 3292 bytes 2 files changed, 1 insertion(+) create mode 100644 vscode/quint-vscode/quint-logo-vscode.png diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 010dba7f2..b8d3fb344 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,6 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", + "icon": "quint-logo-vscode.png", "version": "0.12.1", "publisher": "informal", "engines": { diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..d42c03f1f0824838fd6ba4e08a47f82847d79bbb GIT binary patch literal 3292 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 B0 Date: Mon, 18 Dec 2023 20:26:37 -0500 Subject: [PATCH 152/428] Make README example more consistent - Use prefix/postfix calls consistently for the same operator. - Don't use any "spells" --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 29db81ea8..0aab5dce7 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,6 @@ development tooling. ``` bluespec module secret_santa { - import basicSpells.* from "../../spells/basicSpells" - const participants: Set[str] /// get(recipient_for_santa, S) is the recipient for secret santa S @@ -55,7 +53,7 @@ module secret_santa { var bowl: Set[str] val santas = recipient_for_santa.keys() - val recipients = participants.map(p => recipient_for_santa.get(p)) + val recipients = participants.map(p => get(recipient_for_santa, p)) /// The initial state action init = all { @@ -67,13 +65,13 @@ module secret_santa { nondet recipient = oneOf(bowl) all { recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), + bowl' = bowl.exclude(Set(recipient)), } } action step = all { bowl.size() > 0, - nondet next_santa = participants.exclude(santas).oneOf() + nondet next_santa = oneOf(participants.exclude(santas)) draw_recipient(next_santa) } From 500de5c508ffd4deedcd55a6113c8d554f6da69a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 06:31:59 -0500 Subject: [PATCH 153/428] VSCode Release v0.12.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 4 ++-- vscode/quint-vscode/server/package.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 46e8d8863..81a619828 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.2 -- 2023-12-19 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.1 -- 2023-12-05 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 8d8ba8568..a5eeea047 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.1", + "version": "0.12.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b8d3fb344..953059900 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.12.1", + "version": "0.12.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 07a07d165..f642ffc34 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.1", + "version": "0.12.2", "license": "Apache 2.0", "dependencies": { "@informalsystems/quint": "^0.17.1", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index cc9524a0d..059ae1a1b 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.1", + "version": "0.12.2", "author": "Informal Systems", "contributors": [ { From 21f918e4439bf0a764c3b744750542c5db263ad6 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 09:31:46 -0500 Subject: [PATCH 154/428] Fix links on doc/README.org Followup to #1308, in which I broke all these links. Thanks to @jorpic for pointing this out: https://github.com/informalsystems/quint/commit/53b13316c46fe27c7532d56429ebe3bddfeb4a85#commitcomment-135330468 --- doc/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/README.md b/doc/README.md index 694a3f972..97e4ef5cf 100644 --- a/doc/README.md +++ b/doc/README.md @@ -2,19 +2,19 @@ ## Language -- [Language tutorials](./tutorials/README.md) -- [Syntax specification](./doc/lang.md) -- [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [API documentation for built-in operators](./doc/builtin.md) +- [Language tutorials](../tutorials/README.md) +- [Syntax specification](./lang.md) +- [Cheatsheet](./quint-cheatsheet.pdf) +- [API documentation for built-in operators](./builtin.md) ## Tooling -- [REPL tutorial](./tutorials/repl/repl.md) -- [CLI manual](./doc/quint.md) -- [Literate executable specifications](./doc/literate.md) +- [REPL tutorial](../tutorials/repl/repl.md) +- [CLI manual](./quint.md) +- [Literate executable specifications](./literate.md) ## Design and Development -- [Design Principles](./doc/design-principles.md) -- [Roadmap](./doc/roadmap.md) -- [Frequently asked questions](./doc/faq.md) +- [Design Principles](./design-principles.md) +- [Roadmap](./roadmap.md) +- [Frequently asked questions](./faq.md) From 9a7449fd8736c7f2ce5d11ef09d2d62a9e720982 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 11:12:18 -0500 Subject: [PATCH 155/428] Say "type checking" instead of static analysis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0aab5dce7..3ebd44141 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Quint is a modern specification language that is a particularly good fit for distributed systems, such as blockchain protocols, distributed databases, and p2p protocols. Quint combines the robust theoretical basis of the [Temporal -Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and +Logic of Actions (TLA)][TLA] with state-of-the-art type checking and development tooling. ### Example code in Quint :mrs_claus: :gift: :santa: From 2794eb14dddc096d8f28a13d3afbdddb70c12944 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 12:19:20 -0500 Subject: [PATCH 156/428] Add link to secret santa wiki article Also give a line of context. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3ebd44141..0a67bf8a7 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ development tooling. ### Example code in Quint :mrs_claus: :gift: :santa: +Here is a small, partial, holiday special specification of the [Secret +Santa](https://en.wikipedia.org/wiki/Secret_Santa) game: + ``` bluespec module secret_santa { const participants: Set[str] @@ -89,6 +92,9 @@ module quint_team_secret_santa { } ``` +We can use this specification to check whether certain properties needed for a +good game hold: +
Checking if everyone gets a santa From d135aa7e8a158be75932ca877cd749d23cd66645 Mon Sep 17 00:00:00 2001 From: ekexium Date: Wed, 20 Dec 2023 12:59:51 +0800 Subject: [PATCH 157/428] doc: fix dead link in roadmap.md Signed-off-by: ekexium --- doc/roadmap.md | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/doc/roadmap.md b/doc/roadmap.md index c66f9b757..253c2b3fe 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -43,35 +43,35 @@ completely implementing every pass. | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | -[Design Principles]: ./doc/design-principles.md +[Design Principles]: ./design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler -[Imports]: ./doc/lang.md#imports-1 -[Module definitions]: ./doc/lang.md#module-definition -[Constant declarations]: ./doc/lang.md#constant-declarations -[Assumptions]: ./doc/lang.md#assumptions -[Variable definitions]: ./doc/lang.md#variable-definitions -[Operator definitions]: ./doc/lang.md#variable-definitions -[Module instances]: ./doc/lang.md#module-instances -[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators -[Booleans]: ./doc/lang.md#boolean-operators-and-equality -[Integers]: ./doc/lang.md#integers -[Sets]: ./doc/lang.md#sets -[Lists]: ./doc/lang.md#lists-aka-sequences -[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions -[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions -[if-then-else]: ./doc/lang.md#condition -[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice -[Maps]: ./doc/lang.md#maps-aka-functions -[Records]: ./doc/lang.md#records -[Tuples]: ./doc/lang.md#tuples -[Sum types]: ./doc/lang.md#sum-types -[Delayed assignment]: ./doc/lang.md#delayed-assignment -[Runs]: ./doc/lang.md#runs -[Temporal operators]: ./doc/lang.md#temporal-operators -[Fairness]: ./doc/lang.md#fairness -[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers -[Modes]: ./doc/lang.md#modes +[Imports]: ./lang.md#imports-1 +[Module definitions]: ./lang.md#module-definition +[Constant declarations]: ./lang.md#constant-declarations +[Assumptions]: ./lang.md#assumptions +[Variable definitions]: ./lang.md#variable-definitions +[Operator definitions]: ./lang.md#variable-definitions +[Module instances]: ./lang.md#module-instances +[Lambdas]: ./lang.md#lambdas-aka-anonymous-operators +[Booleans]: ./lang.md#boolean-operators-and-equality +[Integers]: ./lang.md#integers +[Sets]: ./lang.md#sets +[Lists]: ./lang.md#lists-aka-sequences +[Multiline disjunctions]: ./lang.md#multiline-disjunctions +[Multiline conjunctions]: ./lang.md#multiline-conjunctions +[if-then-else]: ./lang.md#condition +[nondet]: ./lang.md#existential-quantifier-and-non-deterministic-choice +[Maps]: ./lang.md#maps-aka-functions +[Records]: ./lang.md#records +[Tuples]: ./lang.md#tuples +[Sum types]: ./lang.md#sum-types +[Delayed assignment]: ./lang.md#delayed-assignment +[Runs]: ./lang.md#runs +[Temporal operators]: ./lang.md#temporal-operators +[Fairness]: ./lang.md#fairness +[Unbounded quantifiers]: ./lang.md#unbounded-quantifiers +[Modes]: ./lang.md#modes [Spells]: ./examples/spells/README.md [Contribute your spell]: ./examples/spells/contribute-your-spell.md [539]: https://github.com/informalsystems/quint/issues/539 From 449c7d956fdf9640470718e69d66220ea5a82dfe Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 20 Dec 2023 11:38:10 +0100 Subject: [PATCH 158/428] User stories for interaction with traces (#866) * add two stories * add user stories for the trace exploration --- doc/story008-repl-traces.md | 262 ++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 doc/story008-repl-traces.md diff --git a/doc/story008-repl-traces.md b/doc/story008-repl-traces.md new file mode 100644 index 000000000..840a5a2e0 --- /dev/null +++ b/doc/story008-repl-traces.md @@ -0,0 +1,262 @@ +# Story008: Simulator Traces in REPL + +| Revision | Date | Author | +|---------:|:----------:|:------------------------| +| 1 | 2023-05-05 | Igor Konnov | + +This is a UX design document for the interaction with states and traces in REPL. +This document helps us to understand the user stories before implementing them. + +Over the last months, we had several requests that could be unified under a +common theme that is related to state and trace inspection. + + - [#446][] + - [#795][] + - [#347][] + - [#303][] + - [#288][] + +This document is using [kettle][] as a running example. We assume that +a Quint REPL session is run in the directory of the example: + +```sh +$ cd ./tutorials/repl +$ quint +Quint REPL 0.9.1 +Type ".exit" to exit, or ".help" for more information +>>> import kettle.* from "./kettle" + +``` + +## Story 1: Inspect the current state + +*As a protocol reader, I want to print the protocol state without remembering +the names of the state variables, so I can discover which state variables are +around and which values they carry.* + +Assume that we have initialized the protocol state with `init`: + +```bluespec +>>> init +true +``` + +**Current interface**. Currently, we can inspect the state, by evaluating +the variable names: + +```bluespec +>>> temperature +20 +>>> heatingOn +false +>>> beeping +false +``` + +However, it is often more convenient to see the value of all the state variables +at once, e.g., when we do not remember them. The issues [#446][] and [#795][] +highlight this idea. + +A workaround is to introduce a definition like the following one: + +```bluespec +// a handy definition that captures the state in a record +val kettleState = { + heatingOn: heatingOn, + beeping: beeping, + temperature: temperature +} +``` + +**Proposed interface**. The simplest yet powerful interface is to introduce the +system state as a record that is accessible via a standard name. We decided to +use the name `q::state`. Here is an example: + +```bluespec +>>> q::state +{ + beeping: false, + heatingOn: false, + temperature: 20, +} +``` + +Since `q::state` is simply a `val`, we would be do all kinds of programmatic things with it: + +```bluespec +>>> q::state.fieldNames() +Set("beeping", "heatingOn", "temperature") + +>>> q::state.temperature +20 +``` + +**Shortcut.** Since typing `q::state` often may be tedious, we offer a shortcut +*`q::s` for `q::state`. + +## Story 2: Inspect the trace + +*As a protocol reader, I want to print the sequence of states that were visited +on the way to the current protocol state, so I can see how the system was +progressing.* + +Assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. After executing a few steps, we can inspect the reached +state. However, we would not be able to inspect the intermediate states, e.g., +the states reached by executing `init`, then `pressButton`, then `heat`. + +As mentioned in [#446][], it would be great to observe the sequence of visited +states. Currently, the only way to do that is by replaying the actions from the +start and printing the intermediate states after executing every action. + +**Proposed interface**. Similar to Story 1, we are proposing to use a standard +name such as `q::trace`. + +For the sequence `init.then(pressButton).then(heat).then(depressButton)`, we +expect `q::trace` to evaluate as follows: + +```bluespec +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +As we can see, `q::trace` is simply a value, which is printed as a +syntactically correct Quint expression. We expect REPL to decorate it a bit with +helpful comments: It should print the state numbers and highlight the active +state (with a `*`). However, the fact that `q::trace` is a value, lets us to +access it programmatically: + +```bluespec +>>> q::trace.length() +4 +>>> q::trace[3].temperature - q::trace[0].temperature +1 +``` + +**Shortcut.** Since typing `q::trace` may be tedious, we offer a shortcut +`q::t` for `q::trace`. + +## Story 3: Navigate the trace + +*As a protocol reader, I want to jump between the visited states in the trace, +so I can evaluate invariants against them and explore different paths.* + +As in Story 2, assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. Assuming that `q::trace` from Story 2 is implemented, +we should be able to see the intermediate states that are produced by the above +sequence of actions. However, if we want to evaluate state invariants against +the intermediate states, we have to replay the actions from start, e.g., by +executing `init`, then `pressButton`, then `heat`. + +**Proposed interface**. We introduce several actions for navigating the trace. + +### 3.1. Jump + +The following REPL session highlights the expected interface: + +```bluespec +>>> init.then(pressButton).then(heat).then(depressButton) +true +>>> q::jump(2) +true +>>> q::state +{ beeping: false, heatingOn: true, temperature: 21 } +>>> // we can evaluate expressions against the state +>>> q::state.temperature > 20 +true +>>> // the trace does not change +>>> // the star is pointing to the active state +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2* + { beeping: false, heatingOn: true, temperature: 21 }, + // 3 + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +Importantly, `q::jump` does not modify the trace `q::trace`. Hence, we can jump +forth and back in the current trace, without recomputing it. This is especially +important, since some of the actions may be non-deterministic. + +### 3.2. Continue trace from the active state + +```bluespec +>>> // ...continue the above session +>>> heat +true +>>> // the trace continues from the active state +>>> q::hist +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: true, temperature: 22 }, +] +``` + +Note that when an action is evaluated, the trace beyond the active state is +cleared, and the new state is added after the active state. + +### 3.3. Clear the trace + +The trace is accumulating the states, even when `init` is executed. Hence, at +some point, we have to clear the trace: + +```bluespec +>>> // ...continue the above session +>>> q::reset +true +>>> q::trace +[] +``` + + + +[#446]: https://github.com/informalsystems/quint/issues/446 +[#795]: https://github.com/informalsystems/quint/issues/795 +[#347]: https://github.com/informalsystems/quint/issues/347 +[#303]: https://github.com/informalsystems/quint/issues/303 +[#288]: https://github.com/informalsystems/quint/issues/288 +[kettle]: https://github.com/informalsystems/quint/blob/main/tutorials/repl/kettle.qnt \ No newline at end of file From 4c1942170e0defaa664f6cb02665325635424c4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 20 Dec 2023 20:22:09 -0300 Subject: [PATCH 159/428] Add version with namespace that I'll rollback cause I didn't like it --- .../secret-santa/basic_secret_santa.qnt | 4 +- .../secret-santa/quint_team_secret_santa.qnt | 26 ++++---- .../secret_santa_with_confirmation.qnt | 63 ++++++++++++++++--- .../secret-santa/secret_santa_with_redraw.qnt | 25 +++----- .../secret-santa/secret_santa_with_reset.qnt | 3 +- 5 files changed, 83 insertions(+), 38 deletions(-) diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt index 6d385225d..65833e3c4 100644 --- a/examples/puzzles/secret-santa/basic_secret_santa.qnt +++ b/examples/puzzles/secret-santa/basic_secret_santa.qnt @@ -27,12 +27,12 @@ module secret_santa { } action step = all { - bowl.size() > 0, + not(empty(bowl)), nondet next_santa = participants.exclude(santas).oneOf() draw_recipient(next_santa) } - val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) + val everyone_gets_a_santa = (empty(bowl)).implies(participants == recipients) val no_person_is_self_santa = santas.forall(person => get(recipient_for_santa, person) != person diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt index 5e16cde3d..f49e862b3 100644 --- a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt +++ b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt @@ -1,20 +1,20 @@ module quint_team_secret_santa { import basicSpells.* from "../../spells/basicSpells" - import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./secret_santa_with_redraw" + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./basic_secret_santa" - action assign_santa_and_confirm(santa, recipient) = all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient } - } + // action assign_santa_and_confirm(santa, recipient) = all { + // recipient_for_santa' = put(recipient_for_santa, santa, recipient), + // bowl' = bowl.setRemove(recipient), + // last_draw' = { participant: santa, confirmed: santa != recipient } + // } - run deadlock_Test = init_with_confirmation - .then(assign_santa_and_confirm("Igor", "Jure")) - .then(assign_santa_and_confirm("Thomas", "Shon")) - .then(assign_santa_and_confirm("Jure", "Igor")) - .then(assign_santa_and_confirm("Shon", "Thomas")) - .then(step_with_confirmation) - .expect(bowl == Set() implies no_person_is_self_santa) + // run deadlock_Test = init_with_confirmation + // .then(assign_santa_and_confirm("Igor", "Jure")) + // .then(assign_santa_and_confirm("Thomas", "Shon")) + // .then(assign_santa_and_confirm("Jure", "Igor")) + // .then(assign_santa_and_confirm("Shon", "Thomas")) + // .then(step_with_confirmation) + // .expect(bowl == Set() implies no_person_is_self_santa) // run finding_out_my_santa_Test = init_redraw // .then(assign_santa_and_confirm("Igor", "Jure")) diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt index 6e37ac6ea..d499b0be7 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt @@ -1,13 +1,62 @@ module secret_santa_with_confirmation { - import secret_santa.* from "./basic_secret_santa" - export secret_santa.* + import basicSpells.* from "../../spells/basicSpells" + import secret_santa as B from "./basic_secret_santa" - // whether the last participant confimed they didn't picked themselves + /// whether the last participant confimed they didn't picked themselves var last_draw: { participant: str, confirmed: bool } - action init_with_confirmation = all { - recipient_for_santa' = Map(), - bowl' = participants, - last_draw' = { participant: "none", confirmed: false } + /// Who had alredy drawn a paper when they got themselves. This way, I know + /// that none of those people can be the santa of the person who is drawing. + var gabrielas_memory: str -> Set[str] + + action init = all { + B::recipient_for_santa' = Map(), + B::bowl' = B::participants, + last_draw' = { participant: "none", confirmed: true }, + gabrielas_memory' = Map(), + } + + action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, B::santas) + } + + action step = all { + B::bowl.size() > 0, + nondet santa = B::participants.filter(participant => not(participant.in(B::recipient_for_santa.keys()))).oneOf() + nondet recipient = B::bowl.oneOf() + all { + B::recipient_for_santa' = put(B::recipient_for_santa, santa, recipient), + B::bowl' = B::bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient }, + gabrielas_memory' = gabrielas_memory, + } + } + + type OptionalString = Some(str) | None + pure def toElem(s: Set[str]): OptionalString = { + if (s.size() != 1) { + None + } else { + s.fold(None, (_, elem) => Some(elem)) + } + } + + def find_out_santa_for(recepient: str): OptionalString = { + if (gabrielas_memory.has(recepient)) { + val possible_santas = B::participants.exclude(gabrielas_memory.get(recepient)) + possible_santas.toElem() + } else { + None + } } + + val gabriela_finds_out_a_santa = B::participants.exists(participant => { + match find_out_santa_for(participant) { + | Some(_) => true + | None => false + } + }) + + val safe_from_memorizers = not(gabriela_finds_out_a_santa) + } diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt index 95f6c502e..b96400224 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt @@ -2,40 +2,35 @@ module secret_santa_with_redraw { // When a participant draws themself, they put their name back and draw again import basicSpells.* from "../../spells/basicSpells" + import commonSpells.* from "../../spells/commonSpells" + import secret_santa as B from "./basic_secret_santa" import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" export secret_santa_with_confirmation.* action redraw(participant: str): bool = { - nondet new_name = bowl.oneOf() + nondet new_name = B::bowl.oneOf() all { - bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), - recipient_for_santa' = recipient_for_santa.set(participant, new_name), + B::bowl' = B::bowl.exclude(Set(new_name)).union(Set(participant)), + B::recipient_for_santa' = B::recipient_for_santa.put(participant, new_name), last_draw' = { participant: participant, confirmed: new_name != participant } } } action step_with_confirmation = if (last_draw.confirmed) all { - bowl.size() > 0, - nondet santa = participants.filter(participant => not(participant.in(recipient_for_santa.keys()))).oneOf() - nondet recipient = bowl.oneOf() - all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient } - } + step } else all { bowl != Set(), - redraw(last_draw.participant) + redraw(last_draw.participant), + memorize(last_draw.participant), } - val inv = (bowl.size() == 0 and last_draw.confirmed) implies no_person_is_self_santa + val inv = (bowl.size() == 0 and last_draw.confirmed) implies B::no_person_is_self_santa - // temporal problem = // We need fairness for this to work - temporal success = always(bowl == Set() implies eventually(no_person_is_self_santa)) + temporal success = always(eventually(B::no_person_is_self_santa)) // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" } diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt index 2d2afd36c..3588b9720 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt @@ -1,5 +1,6 @@ module secret_santa_with_reset { // When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa as B from "./basic_secret_santa" import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" export secret_santa_with_confirmation.* @@ -10,5 +11,5 @@ module secret_santa_with_reset { init } - val inv = bowl.size() == 0 implies no_person_is_self_santa + val inv = B::bowl.size() == 0 implies B::no_person_is_self_santa } From 27ded120d87358b61c5afa4000f79a62fa6450a0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:32:02 -0300 Subject: [PATCH 160/428] Move tictacttoe example to games folder --- examples/{puzzles => games}/tictactoe/tictactoe.qnt | 0 examples/{puzzles => games}/tictactoe/tictactoe.tla | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/{puzzles => games}/tictactoe/tictactoe.qnt (100%) rename examples/{puzzles => games}/tictactoe/tictactoe.tla (100%) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/games/tictactoe/tictactoe.qnt similarity index 100% rename from examples/puzzles/tictactoe/tictactoe.qnt rename to examples/games/tictactoe/tictactoe.qnt diff --git a/examples/puzzles/tictactoe/tictactoe.tla b/examples/games/tictactoe/tictactoe.tla similarity index 100% rename from examples/puzzles/tictactoe/tictactoe.tla rename to examples/games/tictactoe/tictactoe.tla From cc7bf4acf8c0619f4fd8faa2dba00d0dc8c89a82 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:33:50 -0300 Subject: [PATCH 161/428] Clean up and move secret santa example --- examples/games/secret-santa/secret_santa.qnt | 130 ++++++++++++++++++ .../secret-santa/basic_secret_santa.qnt | 42 ------ .../secret-santa/quint_team_secret_santa.qnt | 28 ---- .../puzzles/secret-santa/secret_santa.qnt | 114 --------------- .../secret_santa_with_confirmation.qnt | 62 --------- .../secret-santa/secret_santa_with_redraw.qnt | 36 ----- .../secret-santa/secret_santa_with_reset.qnt | 15 -- 7 files changed, 130 insertions(+), 297 deletions(-) create mode 100644 examples/games/secret-santa/secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/basic_secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/quint_team_secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_redraw.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_reset.qnt diff --git a/examples/games/secret-santa/secret_santa.qnt b/examples/games/secret-santa/secret_santa.qnt new file mode 100644 index 000000000..f9eb68da7 --- /dev/null +++ b/examples/games/secret-santa/secret_santa.qnt @@ -0,0 +1,130 @@ +// -*- mode: Bluespec; -*- +/** + * A secret santa spec, in celebration of the 2023 end-of-year holidays. + * This is accompanied by a blogpost! See [1]. + * + * [1]: https://github.com/informalsystems/quint/tree/main/tutorials/blogpost0-secretsanta/secret_santa.org + * + * Gabriela Moreira, Informal Systems, 2023 + */ + +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] + + /// Information about the last draw + type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + + var last_draw: LastDraw + + /// Who had already drawn a paper when someone got themself. This way, I know + /// that none of those people can be the santa of the person who is drawing. + var gabrielas_memory: str -> Set[str] + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + last_draw' = Ok, // if no oe has drawn yet, no one has drawn themself + gabrielas_memory' = Map(), + } + + val santas = recipient_for_santa.keys() + val recipients = recipient_for_santa.values() + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = if (santa == recipient) Self(santa) else Ok, + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } + } + + action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, + last_draw' = last_draw, + gabrielas_memory' = gabrielas_memory, + } + + action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } + + action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } + } + + // Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa + action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) + } + + action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + memorize(participant), + } + } + + action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } + + /* PROPERTIES */ + + val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) + + val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa + ) + + val inv = (last_draw == Ok) implies no_person_is_self_santa + + /// true iff Gabriela can find out who is a santa for someone. + /// That is, if exists a participant where find_out_a_santa_for participant is Some() + val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } + }) + + val safe_from_memorizers = not(gabriela_finds_out_a_santa) +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt deleted file mode 100644 index 65833e3c4..000000000 --- a/examples/puzzles/secret-santa/basic_secret_santa.qnt +++ /dev/null @@ -1,42 +0,0 @@ -module secret_santa { - import basicSpells.* from "../../spells/basicSpells" - - const participants: Set[str] - - /// get(recipient_for_santa, S) is the recipient for secret santa S - var recipient_for_santa: str -> str - - /// the bowl of participants, containing a paper piece for each participant name - var bowl: Set[str] - - val santas = recipient_for_santa.keys() - val recipients = participants.map(p => recipient_for_santa.get(p)) - - /// The initial state - action init = all { - recipient_for_santa' = Map(), // No santas or recipients - bowl' = participants, // Every participant's name in the bowl - } - - action draw_recipient(santa: str): bool = { - nondet recipient = oneOf(bowl) - all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - } - } - - action step = all { - not(empty(bowl)), - nondet next_santa = participants.exclude(santas).oneOf() - draw_recipient(next_santa) - } - - val everyone_gets_a_santa = (empty(bowl)).implies(participants == recipients) - - val no_person_is_self_santa = santas.forall(person => - get(recipient_for_santa, person) != person - ) - - val invariant = everyone_gets_a_santa and no_person_is_self_santa -} diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt deleted file mode 100644 index f49e862b3..000000000 --- a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt +++ /dev/null @@ -1,28 +0,0 @@ -module quint_team_secret_santa { - import basicSpells.* from "../../spells/basicSpells" - import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./basic_secret_santa" - - // action assign_santa_and_confirm(santa, recipient) = all { - // recipient_for_santa' = put(recipient_for_santa, santa, recipient), - // bowl' = bowl.setRemove(recipient), - // last_draw' = { participant: santa, confirmed: santa != recipient } - // } - - // run deadlock_Test = init_with_confirmation - // .then(assign_santa_and_confirm("Igor", "Jure")) - // .then(assign_santa_and_confirm("Thomas", "Shon")) - // .then(assign_santa_and_confirm("Jure", "Igor")) - // .then(assign_santa_and_confirm("Shon", "Thomas")) - // .then(step_with_confirmation) - // .expect(bowl == Set() implies no_person_is_self_santa) - - // run finding_out_my_santa_Test = init_redraw - // .then(assign_santa_and_confirm("Igor", "Jure")) - // .then(assign_santa_and_confirm("Thomas", "Shon")) - // .then(assign_santa_and_confirm("Jure", "Igor")) - // .then(assign_santa_and_confirm("Gabriela", "Gabriela")) - // .then(redraw("Gabriela")) - // .then(draw_name("Shon")) - // .expect(santa_for.get("Shon") == "Gabriela") - -} diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt deleted file mode 100644 index 2ba6db93c..000000000 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ /dev/null @@ -1,114 +0,0 @@ -module secret_santa { - import commonSpells.* from "../../spells/commonSpells" - - const participants: Set[str] - - /// person_to_gift.get(A) == B if A is B's secret santa - var person_to_gift: str -> str - - /// the bowl of participants, containg a paper piece for each participant with their participant - var bowl: Set[str] - - action init = all { - person_to_gift' = Map(), - bowl' = participants, - } - - action assign_santa(p1: str, p2:str): bool = all { - person_to_gift' = person_to_gift.put(p1, p2), - bowl' = bowl.exclude(Set(p2)), - } - - action draw_name(picker: str): bool = { - nondet drawed_name = bowl.oneOf() - assign_santa(picker, drawed_name) - } - - action step = all { - bowl.size() > 0, - nondet picker = participants.filter(participant => not(participant.in(person_to_gift.keys()))).oneOf() - draw_name(picker) - } - - val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - - val no_person_gets_themself = person_to_gift.keys().forall(participant => - person_to_gift.get(participant) != participant - ) -} - -// module quint_team_secret_santa { -// import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } - -// Below here, more complex things that might be interesting for a tutorial. -// This is not in the state I want it to be yet, which should be: -// 1. the version with redraw should show that, if the last person picks themself, theres's no solution -// - Additionally, it would be nice to show that you can find information about who is your secret santa in this method. -// That is, if you pick yourself and redraw, but there is only one person after you, you know that person will be your (non)secret santa. -// 2. the version with reset should show that, eventually, the game is valid (no one gets themselves) - -module secret_santa_with_redraw { - // When a participant draws themself, they put their name back and draw again - - import basicSpells.* from "../../spells/basicSpells" - import secret_santa.* - export secret_santa.* - - action redraw(participant: str): bool = { - nondet new_name = bowl.oneOf() - all { - bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), - person_to_gift' = person_to_gift.set(participant, new_name), - } - } - - action step_with_redraw = - val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) - if (participants_who_got_themselves.size() > 0) { - nondet participant = participants_who_got_themselves.oneOf() - redraw(participant) - } else { - step - } - - val inv = bowl.size() == 0 implies no_person_gets_themself - - // We need fairness for this to work - temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) -} - -module secret_santa_with_reset { -// When a participant draws themself, everyone returns the papers and the process starts over - import secret_santa.* - export secret_santa.* - - action step_with_reset = - if (person_to_gift.keys().exists(participant => person_to_gift.get(participant) == participant)) { - init - } else { - step - } - - val inv = bowl.size() == 0 implies no_person_gets_themself - - // We need fairness for this to work - temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) -} - -module quint_team_secret_santa { - import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* - - run finding_out_my_santa_Test = init - .then(assign_santa("Igor", "Jure")) - .then(assign_santa("Thomas", "Shon")) - .then(assign_santa("Jure", "Igor")) - .then(assign_santa("Gabriela", "Gabriela")) - .then(redraw("Gabriela")) - .then(draw_name("Shon")) - .expect(person_to_gift.get("Shon") == "Gabriela") -} - -// module quint_team_secret_santa { -// import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt deleted file mode 100644 index d499b0be7..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt +++ /dev/null @@ -1,62 +0,0 @@ -module secret_santa_with_confirmation { - import basicSpells.* from "../../spells/basicSpells" - import secret_santa as B from "./basic_secret_santa" - - /// whether the last participant confimed they didn't picked themselves - var last_draw: { participant: str, confirmed: bool } - - /// Who had alredy drawn a paper when they got themselves. This way, I know - /// that none of those people can be the santa of the person who is drawing. - var gabrielas_memory: str -> Set[str] - - action init = all { - B::recipient_for_santa' = Map(), - B::bowl' = B::participants, - last_draw' = { participant: "none", confirmed: true }, - gabrielas_memory' = Map(), - } - - action memorize(participant) = { - gabrielas_memory' = put(gabrielas_memory, participant, B::santas) - } - - action step = all { - B::bowl.size() > 0, - nondet santa = B::participants.filter(participant => not(participant.in(B::recipient_for_santa.keys()))).oneOf() - nondet recipient = B::bowl.oneOf() - all { - B::recipient_for_santa' = put(B::recipient_for_santa, santa, recipient), - B::bowl' = B::bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient }, - gabrielas_memory' = gabrielas_memory, - } - } - - type OptionalString = Some(str) | None - pure def toElem(s: Set[str]): OptionalString = { - if (s.size() != 1) { - None - } else { - s.fold(None, (_, elem) => Some(elem)) - } - } - - def find_out_santa_for(recepient: str): OptionalString = { - if (gabrielas_memory.has(recepient)) { - val possible_santas = B::participants.exclude(gabrielas_memory.get(recepient)) - possible_santas.toElem() - } else { - None - } - } - - val gabriela_finds_out_a_santa = B::participants.exists(participant => { - match find_out_santa_for(participant) { - | Some(_) => true - | None => false - } - }) - - val safe_from_memorizers = not(gabriela_finds_out_a_santa) - -} diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt deleted file mode 100644 index b96400224..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt +++ /dev/null @@ -1,36 +0,0 @@ -module secret_santa_with_redraw { - // When a participant draws themself, they put their name back and draw again - - import basicSpells.* from "../../spells/basicSpells" - import commonSpells.* from "../../spells/commonSpells" - import secret_santa as B from "./basic_secret_santa" - import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" - export secret_santa_with_confirmation.* - - action redraw(participant: str): bool = { - nondet new_name = B::bowl.oneOf() - all { - B::bowl' = B::bowl.exclude(Set(new_name)).union(Set(participant)), - B::recipient_for_santa' = B::recipient_for_santa.put(participant, new_name), - last_draw' = { participant: participant, confirmed: new_name != participant } - } - } - - action step_with_confirmation = - if (last_draw.confirmed) all { - step - } else all { - bowl != Set(), - redraw(last_draw.participant), - memorize(last_draw.participant), - } - - - val inv = (bowl.size() == 0 and last_draw.confirmed) implies B::no_person_is_self_santa - - - // We need fairness for this to work - temporal success = always(eventually(B::no_person_is_self_santa)) - - // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" -} diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt deleted file mode 100644 index 3588b9720..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt +++ /dev/null @@ -1,15 +0,0 @@ -module secret_santa_with_reset { - // When a participant draws themself, everyone returns the papers and the process starts over - import secret_santa as B from "./basic_secret_santa" - import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" - export secret_santa_with_confirmation.* - - action step_with_reset = - if (last_draw.confirmed) { - step - } else { - init - } - - val inv = B::bowl.size() == 0 implies B::no_person_is_self_santa -} From 34ed8ab2c55880de0794a7171730ca866e4e3d25 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:36:43 -0300 Subject: [PATCH 162/428] Update tictactoe path on integration tests and examples dashboard --- examples/README.md | 2 +- quint/cli-tests.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/README.md b/examples/README.md index 480e47aca..9d8b934ed 100644 --- a/examples/README.md +++ b/examples/README.md @@ -88,7 +88,7 @@ listed without any additional command line arguments. | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/prisoners/prisoners.qnt](./puzzles/prisoners/prisoners.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/river/river.qnt](./puzzles/river/river.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [puzzles/tictactoe/tictactoe.qnt](./puzzles/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/quint/cli-tests.md b/quint/cli-tests.md index d06b2c363..8673077ad 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -132,12 +132,12 @@ This example was pointing to Paxos. Now it does not typecheck. ### OK on parse TicTacToe - quint parse ../examples/puzzles/tictactoe/tictactoe.qnt + quint parse ../examples/games/tictactoe/tictactoe.qnt ### OK on typecheck TicTacToe - quint typecheck ../examples/puzzles/tictactoe/tictactoe.qnt + quint typecheck ../examples/games/tictactoe/tictactoe.qnt ### OK on parse ics20 bank From 3ca21e46c3c3f10aaf28520e676cb9af7d1be615 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:40:26 -0300 Subject: [PATCH 163/428] Deprecate (remove) `mapValuesSet` in favor of `values`, move it to basic spells, and introduce the `empty` spell --- examples/spells/basicSpells.qnt | 26 ++++++++++++++++++++++++++ examples/spells/commonSpells.qnt | 13 ------------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/examples/spells/basicSpells.qnt b/examples/spells/basicSpells.qnt index 40764b81b..cc3884728 100644 --- a/examples/spells/basicSpells.qnt +++ b/examples/spells/basicSpells.qnt @@ -140,4 +140,30 @@ module basicSpells { assert(m.mapRemoveAll(Set(5, 7)) == Map(3 -> 4)), assert(m.mapRemoveAll(Set(5, 99999)) == Map(3 -> 4, 7 -> 8)), } + + /// Get the set of values of a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the set of all values in the map + pure def values(__map: a -> b): Set[b] = { + __map.keys().map(k => __map.get(k)) + } + + run valuesTest = all { + assert(values(Map()) == Set()), + assert(values(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), + assert(values(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), + } + + /// Whether a set is empty + /// + /// - @param s a set of any type + /// - @returns true iff the set is the empty set + pure def empty(s: Set[a]): bool = s == Set() + + run emptyTest = all { + assert(empty(Set()) == true), + assert(empty(Set(1, 2)) == false), + assert(empty(Set(Set())) == false), + } } diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index e78c806da..53b124ff9 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -18,19 +18,6 @@ module commonSpells { assert(setSum(Set(-4, 4, 5)) == 5), } - /// Get the set of values of a map. - /// - /// - @param __map a map from type a to type b - /// - @returns the set of all values in the map - pure def mapValuesSet(__map: a -> b): Set[b] = { - __map.keys().map(k => __map.get(k)) - } - - run mapValuesSetTest = all { - assert(mapValuesSet(Map()) == Set()), - assert(mapValuesSet(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), - assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), - } /// Convert a map into a set of pairs coordinating its keys and values /// From 94197dfea397e2e1ce5b16c4ed36329a4e083e66 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:42:36 -0300 Subject: [PATCH 164/428] Add secret santa blogpost --- .../blogpost0-secretsanta/secret_santa.org | 363 ++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 tutorials/blogpost0-secretsanta/secret_santa.org diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org new file mode 100644 index 000000000..8a01b8001 --- /dev/null +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -0,0 +1,363 @@ +* Holiday protocols: secret santa with Quint :santa: + +Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. + +Secret santa is a game for trading presents between participants. We write down the participants' names on individual pieces of paper, fold them, and put them in a bowl. The bowl is passed around to the participants, with each of them taking one piece of paper from the bowl, deciding the person the picker should gift a present to. This goes on until the bowl is empty, and everyone has someone to gift :gift:. + +I played this game at least once a year since I was a little kid, and well, different groups have different standards for the drawing process. I'm always one of the (potentially annoying) people who will make everyone play by the safest rules (well, that applies to many other scenarios, and I guess that's how I ended up working on Quint :grimacing:). So welcome aboard if you are one of these people too, and if you are not, this blogpost might introduce some complications for your next secret santa game. + +Disclaimer: This is not a super didactic tutorial, but rather a fun example of how I personally appreciate Quint (or formal specification in general). If you are looking for tutorials, we have some better introductory material [[https://github.com/informalsystems/quint/tree/main/tutorials][here]], and more documentation [[https://github.com/informalsystems/quint/tree/main/doc][here]]. In any way, I still recommend skimming through this as a potential motivational material :heart:. + +The complete spec described here is available in the [[https://github.com/informalsystems/quint/tree/main/examples/games/secret-santa/secret_santa.qnt][examples folder]]. + +** Basic secret santa + +Let's start with the basics: we have a =bowl= of recipient names. As each +participant draws its recipient, we record the drawn name in a map called +=recipient_for_santa=. The keys of the map are the santas giving gifts, and the +values are the gift-receivers for each santa. Those will be our two *state +variables*, meaning we'll be changing their values as the game progresses. +The set of participants in the game is a constant, which can be seen as +a module parameter (more on that later). + +We also import a library with some utility functions. The import statement +should point to the [[https://github.com/informalsystems/quint/blob/main/examples/spells/basicSpells.qnt][basicSpells.qnt]] file, from the quint repo, on your local file +system. + +#+begin_src bluespec +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] +} +#+end_src + +Now that we have the state variables, we need to specify their values in the initial state: +#+begin_src bluespec +/// The initial state +action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl +} +#+end_src + + +The following definitions are helpers: the set of santas are the keys of the =recipent_for_santa= map, while the recipients are the values of that map. These values are not fixed. Rather, they work as projections, or views, on the current state. When the values for the =recipient_for_santa= state variable change, the values for these helpers will change as well. +#+begin_src bluespec +val santas = recipient_for_santa.keys() +val recipients = recipient_for_santa.values() +#+end_src + +Finally, we define the system's transitions, which is just the drawing process. At each step, we non-deterministically pick the participant who is going to draw, and then, non-deterministically, draw one of the names from the bowl. We register that on our =recipient_for_santa= map and remove the drawn name from the bowl. When the bowl gets empty, we still need to define what happens. In this case, the drawing is over, and all state variables will stay the same - at least until the next holidays :christmas_tree:. When no variables change, we call that a =stutter= step. + +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + } +} + +action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, +} + +action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } +#+end_src + +This is a very basic protocol, but already ensures one of the properties I'm +interested in: no sad kids with no presents at the revelation - everyone gets a +santa. That is, if the bowl is empty. In other words, the bowl being empty +*implies* that all the participants will receive gifts :gift:. + +#+begin_src bluespec +val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) +#+end_src + +Before we can check that our spec satisfies this property, we need to define a +value for our module's constant. Constants parameters to a module, so we need +to instantiate that module and specify the =participants=. Let's use the Quint +developer team as an example! + +#+begin_src bluespec +module secret_santa { + // ... all the code from before +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} +#+end_src + +Now we can use Quint's =verify= command to check that all possible executions +(up to a certain length -- 10 steps, by default) satisfy this property for the =quint_team_secret_santa= module. + +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=everyone_gets_a_santa +#+end_src + +We get a successful result - the property holds! +#+begin_src sh +[ok] No violation found (2119ms). +You may increase --max-steps. +#+end_src + +Let's try a different property! People don't really want to buy themselves +presents. /Well, perhaps except for that teenage cousin who would rather not be +playing, but their mom forced them to. But let's not consider that./ So let's +write a property stating that, for each santa, they are not their own recipient. +#+begin_src bluespec +val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa +) +#+end_src + +And then check that property: +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=no_person_is_self_santa +#+end_src + +This time, we find out that the property does *not* hold! Quint provides us with a minimal counterexample. +#+begin_src bluespec +An example execution: + +[State 0] { quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map() } + +[State 1] { quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") } + +[violation] Found an issue (2068ms). +error: found a counterexample +#+end_src + +In this example, Gabriela (that's me) got themself in the very first draw and would have to buy their own present. Not great! + +A better secret santa game has an additional, currently unspecified, step: after +a person draws a name from the bowl, they should confirm that they didn't get +themself before the drawing can continue. If someone draws themself, one of two strategies can take place: + 1. They immediately put their name back and draw again. + 2. The whole game gets reset: everyone who has already drawn a paper puts it back, and it all starts again. + +I want to try both strategies in Quint, and then show how (2) is better than (1). Usually, people don't want to reset the whole thing and get tempted to do (1), and that's when I say "no no no no no". Well, now I can show them the Quint spec and counterexamples, and they won't have any arguments! But first, let's add the confirmation step to our existing spec, which will be used by both strategies. + +First, we add a variable and change our =init= definition to include an initialization for it. We should also make sure it also stutters in our =stutter= helper definition. +#+begin_src bluespec +/// Information about the last draw +type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + +var last_draw: LastDraw + +action init = all { + // ... + last_draw' = Ok // if no one has drawn yet, no one has drawn themself +} + +action stutter = all { + // ... + last_draw' = last_draw, +} +#+end_src + +Then, we update the =draw_recipent= action to include the confirmation, that is, =last_draw= should be updated to the participant who drew, and its confirmed value should be true if and only if the participant got someone other than themself. +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + // ... + last_draw' = if (santa == recipient) Self(santa) else Ok +} +#+end_src + +With this variable in place, we can now write a new invariant stating that our predicate =no_person_is_self_santa= should be satisfied if the last draw was ok. That is, the condition *implies* the predicate. +#+begin_src bluespec +val inv = (last_draw == Ok) implies no_person_is_self_santa +#+end_src + +Defining the variable on its own doesn't help us with satisfying that property, +tho. We need to define a strategy to deal with scenarios where the last draw +didn't turn out right. + +** Secret santa with the redraw strategy + +In this strategy, when a participant draws themself, they should pick another name. They can either first put their name back in the bowl, and then redraw; or first redraw and then put their name back, ensuring they won't get themself again. Both of them should work the same in the end, since we are not considering efficiency here. But let's define the latter. + +#+begin_src bluespec +action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } +} +#+end_src + +We should call the redraw action whenever we find a self-draw. It is important to ensure that the bowl is not empty when we call that action since we need at least one name in the bowl to be drawn. +#+begin_src bluespec +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + } + } +#+end_src + +Let's check if our new invariant =inv= (defined as =(last_draw == Ok) implies no_person_is_self_santa=) is satisfied with our new step definition. We now have to specify our step definition with =--step=step_with_redraw=, otherwise, Quint will use the default name =step=. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_redraw +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (4360ms). +#+end_src + +** Secret santa with the reset strategy + +In the reset strategy, we restart the whole game when some confirmation is negative. The definition looks quite nice! We could define this in a different module and plug everything together with import statements - but let's keep things simpler here and define yet another step action called =step_with_reset=. +#+begin_src bluespec +action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } +#+end_src + +Now, let's check the property. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_reset +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (2492ms). +#+end_src + +** Redrawing is not good enough! + +Although both strategies can guarantee that, if the last draw was confirmed, then no person is their own santa, I still see two scenarios where the redraw strategy might have problems, while the reset strategy does not. +1. If the player who draws themself is the last player, and the bowl gets empty, there is nothing to be done to solve the issue. +2. If some of the players have a good memory and pay attention, they will have information about who may and may not be someone's santa, and even potentially find out who is a santa of someone, or their own santa! We need to preserve the "secret" part of this game! + +To show how (1) can happen, we should use temporal properties. However, since that requires a deeper explanation, and the tooling for it is not the most stable at the moment, I'll leave this one for next year. Instead, let's play around with (2). + +(2) does not need all the players to have a great memory, so let's say only I (Gabriela) am actually paying attention and memorizing some stuff. For that, let's introduce my memory as a state variable. +#+begin_src bluespec +/// Who had already drawn a paper when someone got themself. This way, I know +/// that none of those people can be the santa of the person who is drawing. +var gabrielas_memory: str -> Set[str] +#+end_src + +This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor have drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he draws. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. + +This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self draws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: + +#+begin_src bluespec +action init = all { + // ... + gabrielas_memory' = Map(), +} + +action draw_recipient(santa: str): bool = { + // ... + all { + // ..., + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } +} + +action stutter = all { + // ... + gabrielas_memory' = gabrielas_memory, +} + +// Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa +action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) +} + +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + // ..., + memorize(participant), + } + } +#+end_src + +*** Is there a scenario where I find out who is someone's santa? + +Now let's define a property that is true when I am able to deduce someone's +santa: + +#+begin_src bluespec +/// true iff Gabriela can find out who is a santa for someone. +/// That is, if exists a participant where find_out_a_santa_for participant is Some() +val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } +}) +#+end_src + +Finally, the invariant we want to check is that Gabriela should NOT be able to find out a santa. +#+begin_src bluespec +val safe_from_memorizers = not(gabriela_finds_out_a_santa) +#+end_src + +Let's verify it, with the redraw version of =step_for_confirmation= +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=safe_from_memorizers --step=step_with_redraw +#+end_src + +We get a violation! After 5 steps, we get to a point where I know that Shon is my santa :santa: +#+begin_src bluespec +... +[State 5] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela"), + quint_team_secret_santa::secret_santa::gabrielas_memory: + Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas")), + quint_team_secret_santa::secret_santa::last_draw: Ok, + quint_team_secret_santa::secret_santa::recipient_for_santa: + Map("Jure" -> "Igor", "Igor" -> "Thomas", "Gabriela" -> "Jure", "Thomas" -> "Shon") +} + +[violation] Found an issue (2628ms). +error: found a counterexample +#+end_src + +On state 5, my memory is =Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas"))=, so only Shon can possibly be my (non-secret) santa! + +Here, we only checked for the presence of the worst scenario: finding out someone's santa. This only happens if the second to last person redraws, and therefore their name is the only one in the bowl when the last person (in this case, Shon) draws. However, memorizers can also find partial information that can also ruin the game a bit, i.e. knowing for sure that a person who always gives the best gifts couldn't possibly have drawn me - that's a bummer, right? + +Well, what actually bothers me is having possible flaws in the drawing protocol like this, and that's why every year I insist on the reset strategy. There are some other interesting properties of secret santa that I'd like to explore, especially in the revelation procedure. But it's almost Christmas already, which means it's time for me to get ready for some beach time: I'm in Brazil, and we get Christmas during summer, and that's my favorite time of the year :sunny:. So let's talk about secret santa Quint specs again next year. + +Wish you all a happy holiday season and a lovely new year! From f6ddf9bf53b0b7719518b345b181c89f88bea360 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:59:57 -0300 Subject: [PATCH 165/428] Fix grammar issues --- tutorials/blogpost0-secretsanta/secret_santa.org | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org index 8a01b8001..d79d207fb 100644 --- a/tutorials/blogpost0-secretsanta/secret_santa.org +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -1,4 +1,4 @@ -* Holiday protocols: secret santa with Quint :santa: +* Holiday protocols: secret santa with Quint \:santa\: Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. @@ -89,7 +89,7 @@ val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) #+end_src Before we can check that our spec satisfies this property, we need to define a -value for our module's constant. Constants parameters to a module, so we need +value for our module's constant. Constants are parameters to a module, so we need to instantiate that module and specify the =participants=. Let's use the Quint developer team as an example! @@ -270,9 +270,9 @@ To show how (1) can happen, we should use temporal properties. However, since th var gabrielas_memory: str -> Set[str] #+end_src -This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor have drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he draws. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. +This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor had drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he drew. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. -This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self draws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: +This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self-sdraws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: #+begin_src bluespec action init = all { From 42ef104f6eb647acdf190489fbbc2aa6430f8980 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:08:26 -0300 Subject: [PATCH 166/428] Update examples dashboard --- examples/.scripts/run-example.sh | 4 +++- examples/README.md | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 6e0115a4a..b2da22272 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -90,6 +90,8 @@ get_main () { main="--main=Lightclient_4_3_correct" elif [[ "$file" == "puzzles/prisoners/prisoners.qnt" ]] ; then main="--main=prisoners3" + elif [[ "$file" == "games/secret-santa/secret_santa.qnt" ]] ; then + main="--main=quint_team_secret_santa" elif [[ "$file" == "solidity/ERC20/erc20.qnt" ]] ; then main="--main=erc20Tests" elif [[ "$file" == "solidity/SimplePonzi/simplePonzi.qnt" ]] ; then @@ -126,7 +128,7 @@ get_verify_args () { args="--init=n4_f1::Init --step=n4_f1::Next --invariant=n4_f1::Agreement" elif [[ "$file" == "cosmos/ics23/ics23.qnt" ]] ; then args="--init=Init --step=Next" - elif [[ "$file" == "puzzles/tictactoe/tictactoe.qnt" ]] ; then + elif [[ "$file" == "games/tictactoe/tictactoe.qnt" ]] ; then args="--max-steps=1" # pretty slow, and we just want to check that verification can run fi echo "${args}" diff --git a/examples/README.md b/examples/README.md index 9d8b934ed..95a502543 100644 --- a/examples/README.md +++ b/examples/README.md @@ -72,6 +72,8 @@ listed without any additional command line arguments. | [cosmwasm/zero-to-hero/vote.qnt](./cosmwasm/zero-to-hero/vote.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cryptography/hashes.qnt](./cryptography/hashes.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cryptography/hashesTest.qnt](./cryptography/hashesTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [games/secret-santa/secret_santa.qnt](./games/secret-santa/secret_santa.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/booleans.qnt](./language-features/booleans.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/counters.qnt](./language-features/counters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/importFrom.qnt](./language-features/importFrom.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -88,7 +90,6 @@ listed without any additional command line arguments. | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/prisoners/prisoners.qnt](./puzzles/prisoners/prisoners.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/river/river.qnt](./puzzles/river/river.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 3ac4474eb30e90e0de79a9d0e3d11bb59138ef49 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:12:18 -0300 Subject: [PATCH 167/428] Fix emoji on title --- tutorials/blogpost0-secretsanta/secret_santa.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org index d79d207fb..4edc24063 100644 --- a/tutorials/blogpost0-secretsanta/secret_santa.org +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -1,4 +1,4 @@ -* Holiday protocols: secret santa with Quint \:santa\: +* Holiday protocols: secret santa with Quint 🎅 Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. From fa5b8dd4d382d4a0e3d6e2f531749a2bfabfea6f Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:17:17 -0300 Subject: [PATCH 168/428] Remove unintended change on `option.qnt` --- examples/language-features/option.qnt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index f8fbce203..871eda916 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -7,6 +7,21 @@ module option { | Some(int) var votes: List[VoteOption] + var outcome: int + + action init = all { + votes' = [], + outcome' = 0 + } + + action vote(v) = { + votes' = votes.append(Some(v)) + } + + action unvote(i) = all { + votes[i] != None, + votes' = votes.replaceAt(i, None), + } val sumVotes = votes.foldl(0, (sum, v) => match v { From 8efb507dcec69cc9968ee0dafdda258ab0d4bc3c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 13:49:49 -0500 Subject: [PATCH 169/428] Release v0.18.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43ca138e6..20a935176 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.0 -- 2024-01-03 + ### Added - Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) diff --git a/quint/package-lock.json b/quint/package-lock.json index 75108d964..096e6597a 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 4e7543db0..7fc8c4a72 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index f84500743..1aff2dbe7 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.17.1' +export const version = '0.18.0' From 20b588fee7f08b9010fdd09f3582e2a637e59b11 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 14:10:57 -0500 Subject: [PATCH 170/428] VSCode Release v0.13.0 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 81a619828..609132a83 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.0 -- 2024-01-03 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.2 -- 2023-12-19 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index a5eeea047..40be843ee 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.2", + "version": "0.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.2", + "version": "0.13.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 953059900..f6c62ac88 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.12.2", + "version": "0.13.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index f642ffc34..79b1dcba0 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.2", + "version": "0.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.2", + "version": "0.13.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.17.1", + "@informalsystems/quint": "^0.18.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", - "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", + "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", - "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", + "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 059ae1a1b..2289fc60f 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.2", + "version": "0.13.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.17.1", + "@informalsystems/quint": "^0.18.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From f3f9f9a14fadb7a68b535008ac25b6026fe24f5d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 14:28:36 -0500 Subject: [PATCH 171/428] Fix link --- vscode/quint-vscode/server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vscode/quint-vscode/server/README.md b/vscode/quint-vscode/server/README.md index e27840ded..bf57df19d 100644 --- a/vscode/quint-vscode/server/README.md +++ b/vscode/quint-vscode/server/README.md @@ -18,6 +18,6 @@ There are currently three clients for this server: 1. The Quint [VSCode extension](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) 2. The [Quint LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/emacs/README.md) for Emacs -3. A [Neovim LSP client]((https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) +3. A [Neovim LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) (1) and (2) are capable of downloading and installing this server for you. (3) requires manual installation (for now). From a91de8035bac09c6bd309d74563cd1b9dffdb3d9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 16:45:27 -0500 Subject: [PATCH 172/428] Update examples dashboard --- examples/.scripts/run-example.sh | 3 ++- examples/README.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 6e0115a4a..7f3a0a369 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -34,7 +34,8 @@ result () { "$file" =~ ^cryptography/ || "$file" =~ ^spells/ || "$file" == "solidity/SimpleAuction/SimpleAuction.qnt" || - "$file" == "cosmos/ics20/base.qnt" ) ]] ; then + "$file" == "cosmos/ics20/base.qnt" || + "$file" == "cosmos/cosmos/bank/bank.qnt" ) ]] ; then printf "N/A[^nostatemachine]"; return fi diff --git a/examples/README.md b/examples/README.md index 480e47aca..1cebc1b67 100644 --- a/examples/README.md +++ b/examples/README.md @@ -57,6 +57,8 @@ listed without any additional command line arguments. | [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1299 | :x:https://github.com/informalsystems/quint/issues/1299 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [cosmos/bank/bank.qnt](./cosmos/bank/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [cosmos/bank/bankTest.qnt](./cosmos/bank/bankTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/ics20/denomTrace.qnt](./cosmos/ics20/denomTrace.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From f6f7cf1705d36adf78ff699fba40fd22dd7795eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 17:02:06 -0500 Subject: [PATCH 173/428] Fix runner script --- examples/.scripts/run-example.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 7f3a0a369..1794010f3 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -35,7 +35,7 @@ result () { "$file" =~ ^spells/ || "$file" == "solidity/SimpleAuction/SimpleAuction.qnt" || "$file" == "cosmos/ics20/base.qnt" || - "$file" == "cosmos/cosmos/bank/bank.qnt" ) ]] ; then + "$file" == "cosmos/bank/bank.qnt" ) ]] ; then printf "N/A[^nostatemachine]"; return fi From 762aea0b564341fd392e740cef527d5efeeda58e Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Jan 2024 09:12:38 -0300 Subject: [PATCH 174/428] Fix formatting and use simpler Map creation --- examples/cosmos/bank/bank.qnt | 2 +- examples/cosmos/bank/bankTest.qnt | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index 59391d399..73353dec8 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -80,6 +80,7 @@ module bank { Map() } } + /// `ValidateBalance` should only be called upon genesis state. /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { @@ -198,5 +199,4 @@ module bank { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - } diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 68112aed1..7f21e4c1c 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -1,3 +1,5 @@ +// -*- mode: Bluespec; -*- + module bankTest { import bank.* from "./bank" @@ -19,9 +21,10 @@ module bankTest { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), _lastError' = "", } + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { val ctx = stateToCtx(0) val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) @@ -41,7 +44,6 @@ module bankTest { } } - action step = any { nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) @@ -96,12 +98,13 @@ module bankTest { } } } + run sendTest = { init // the King has bananas and he can send it .then(send("king", "donkeykong", - Set("banana").mapBy(d => 2_000))) + Map("banana" -> 2_000))) .expect(and { balances.get("king").get("banana") == 8_000, balances.get("donkeykong").get("banana") == 2_000, From c3fc52760af7756cd0fbf26244466541116711ec Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Jan 2024 09:26:43 -0300 Subject: [PATCH 175/428] Move changes to the markdown file and regenerate with LMT --- examples/cosmos/bank/bankTest.qnt | 1 - examples/cosmos/bank/cosmos-bank.md | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 7f21e4c1c..d721d54d0 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -1,5 +1,4 @@ // -*- mode: Bluespec; -*- - module bankTest { import bank.* from "./bank" diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index b6012093b..c8ddcabf8 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -55,6 +55,7 @@ From the protocol designer's point of view, the bank module alone could be tested by introducing the following non-deterministic state machine: ```bluespec bankTest.qnt += +// -*- mode: Bluespec; -*- module bankTest { import bank.* from "./bank" @@ -238,9 +239,10 @@ action init = all { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), _lastError' = "", } + ``` ## Keepers @@ -372,6 +374,7 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } + ``` For example, we expect the `GetAllBalances` to return balances in the genesis state as follows: @@ -404,6 +407,7 @@ def stateToCtx(time: int): BankCtx = { } } } + ``` - `ValidateBalance` validates all balances for a given account address @@ -593,7 +597,7 @@ run sendTest = { // the King has bananas and he can send it .then(send("king", "donkeykong", - Set("banana").mapBy(d => 2_000))) + Map("banana" -> 2_000))) .expect(and { balances.get("king").get("banana") == 8_000, balances.get("donkeykong").get("banana") == 2_000, @@ -662,7 +666,6 @@ pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - ``` - `BlockedAddr` checks if a given address is restricted from receiving funds. @@ -722,7 +725,6 @@ pure val DENOM = Set("banana", "burger") ```bluespec "transitions" += - action step = any { nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) From b806f4081276867df4ce06b485ec51125e65678e Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 12 Jan 2024 09:27:18 -0300 Subject: [PATCH 176/428] Fix API documentation for `allLists` --- doc/builtin.md | 11 ++++++----- quint/src/builtin.qnt | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/builtin.md b/doc/builtin.md index 16e39d655..2ccb49c70 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -239,15 +239,16 @@ assert(Set(Set(1, 2), Set(3, 4)).flatten() == Set(1, 2, 3, 4)) ## `pure def allLists: (Set[a]) => Set[List[a]]` -`s.allLists()` is the set of all lists containing all the elements in `s`. +`s.allLists()` is the set of all lists containing elements in `s`. +This is an infinite set unless `s` is the empty set. + +Like other inifite sets, this is not supported in the simulator. ### Examples ``` -assert(Set(1, 2).allLists() == Set( - List(1, 2), - List(2, 1), -)) +assert(Set(1, 2).allLists().contains([])) +assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) ``` ## `pure def chooseSome: (Set[a]) => a` diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index a1016e636..6fd5aca6a 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -215,15 +215,16 @@ module builtin { /// ``` pure def flatten(s): (Set[Set[a]]) => Set[a] - /// `s.allLists()` is the set of all lists containing all the elements in `s`. + /// `s.allLists()` is the set of all lists containing elements in `s`. + /// This is an infinite set unless `s` is the empty set. + /// + /// Like other inifite sets, this is not supported in the simulator. /// /// ### Examples /// /// ``` - /// assert(Set(1, 2).allLists() == Set( - /// List(1, 2), - /// List(2, 1), - /// )) + /// assert(Set(1, 2).allLists().contains([])) + /// assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) /// ``` pure def allLists(s): (Set[a]) => Set[List[a]] From 9ab7bf624b4677f0f8bf025caf28984729483416 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 10:00:42 -0500 Subject: [PATCH 177/428] Use result type for BoundedUInt Resolves a TODO by replacing the record-based representation using a non-empty error string with a result sum type. --- examples/spells/BoundedUInt.qnt | 698 ++++++++++++++------------------ 1 file changed, 302 insertions(+), 396 deletions(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index f818fee4d..6c8d28531 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -8,258 +8,167 @@ module BoundedUInt { /// The largest value that can be represented by this integer type. pure val MAX = (2^BITS) - 1 - /// Record-representation of an unsigned bounded integer. - /// If the `error` field is nonempty, the record represents an exception of some - /// sort happening during computation, such as an overflow. - /// Otherwise, the record represents the integer `v`, such that `MIN <= v <= MAX`. - /// TODO: Replace with an option type, once those are implemented. - type UIntT = { v: int, error: str } - - /// Constructs a bounded unsigned integer of type `UIntT` from a value `x` of type `int`. - /// If `x` lies outside the `[MIN, MAX]` interval, - /// the error field will be nonempty. - pure def UInt(x: int): UIntT = { - v: x, - error: - if (MIN <= x and x <= MAX) "" - else "out of range" + /// Representation of an unsigned, bounded integer. + /// + /// - `Ok(v)` represents the integer `v`, such that `MIN <= v <= MAX`. + /// - `Err(msg)` holds a message explaining the out of bounds error. + /// + /// NOTE: values of this type must only be constructed using `UInt`, + /// and never via `Ok` or `Err` directly. + // TODO: Replacce with polymorphic result type, once that is avainable + // See https://github.com/informalsystems/quint/issues/1073 + type UIntT = Ok(int) | Err(str) + + /// Given an integer `x`, returns true iff `x` lies in the `[MIN, MAX]` interval. + pure def isInRange(x: int): bool = MIN <= x and x <= MAX + + /// `UInt(x)` is a bounded unsigned integer if `x` is inside the `[MIN, MAX]` interval, + /// otherwise it is an `"out of range"` error. + pure def UInt(x: int): UIntT = if (isInRange(x)) Ok(x) else Err("out of range") + + /// `u.bind(x => f(x))` is `f(x)` iff `u` is `Ok(x)`, i.e., if `u` is a valid bounded int wrapping `x`, + /// otherwise, when `u` is `Err(msg)`, it is `u`. + /// + /// ## Example + /// + /// ``` + /// def checkedIncr(u: UintT): UintT = checkedAdd(u, UIntT(1)) + /// run incr_UintT_twice_test = assert(UInt(0).bind(checkedIncr).bind(checkedIncr) = UInt(2)) + /// ``` + def bind(u: UIntT, f: (int => UIntT)): UIntT = match u { + | Ok(i) => f(i) + | Err(_) => u } - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval. - pure def isInRange(x: UIntT): bool = and { - x.v >= MIN, - x.v <= MAX - } - - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval, and `x.error` is empty. - pure def isValid(x: UIntT): bool = and { - x.error == "", - isInRange(x) - } - - /// Given a (T,T) => T operation `op`, which assumes its inputs are valid (w.r.t. `isValid`), - /// and two T-typed values, l and r, returns op(l,r) iff l and r are both valid. Otheriwse, - /// it returns some arbitrary invalid value. - pure def wrapErrorBin(lhs: UIntT, rhs: UIntT, op: (UIntT, UIntT) => UIntT): UIntT = - if (not(isValid(lhs))) lhs - else if (not(isValid(rhs))) rhs - else op(lhs, rhs) + /// `f.app(u, v, msg)` is `UInt(f(x,y))` if `u` is `Ok(x)` and `v` is `Ok(y)`. + /// If `UInt(f(x,y))` is out of range, it is `Err(msg)`. + pure def app(op: (int, int) => int, lhs: UIntT, rhs:UIntT, errMsg: str): UIntT = + lhs.bind(x => rhs.bind(y => + val res = op(x, y) + if (isInRange(res)) Ok(res) else Err(errMsg))) /// Computes the absolute difference between lhs and rhs. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def absDiffUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res < 0) -res else res, - error: "" - } + pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = { + ((x, y) => { + val res = x - y + if (res < 0) -res else res + }).app(lhs, rhs, + "impossible") } - /// Computes the absolute difference between lhs and rhs. - pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, absDiffUnsafe) - //////////////////////// // CHECKED OPERATIONS // //////////////////////// - /// Unsafe checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } + /// Checked integer addition. + /// Errors with "overflow" + pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => iadd(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer subtraction. + /// Errors with "underflow". + pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => isub(x,y)).app(lhs, rhs, "underflow") + + /// Checked integer multiplication. + /// Errors with "overflow". + pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => imul(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer division. + /// Errors with "division by zero". + pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l / r))) + + /// Checked integer modulo. + /// Errors with "division by zero". + pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l % r))) + + /// Checked exponentiation. + /// Errors with "overflow". + pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + ((x,y) => ipow(x,y)).app(lhs, rhs, "overflow"))) - /// Checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedAddUnsafe) - - /// Unsafe checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: res, - error: if (res < MIN) "underflow" else "" - } - } - - /// Checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedSubUnsafe) - - /// Unsafe checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedMulUnsafe) - - /// Unsafe checked integer division. - /// Computes `lhs / rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedDivUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v / rhs.v, error: "" } - - /// Checked integer division. - /// Computes `lhs / rhs`, setting the error field to "division by zero" if `rhs.v == 0`. - pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedDivUnsafe) - - /// Unsafe checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedRemUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v % rhs.v, error: "" } - - /// Checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedRemUnsafe) - - /// Unsafe checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedPowUnsafe) /////////////////////////// // SATURATING OPERATIONS // /////////////////////////// - /// Unsafe saturating integer addition. - /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - - /// Saturating integer addition. + /// Saturating integer addition. /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingAddUnsafe) + pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x + y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Unsafe saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res > MIN) res else MIN, - error: "" - } - } - - /// Saturating integer subtraction. - /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingSubUnsafe) - - /// Unsafe saturating integer multiplication. - /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } + pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x - y + if (res > MIN) res else MIN) + .app(lhs, rhs, "impossible") - /// Saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingMulUnsafe) - - /// Unsafe saturating exponentiation. - /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - + pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x * y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Saturating exponentiation. + /// Saturating exponentiation. /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingPowUnsafe) + pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + val res = l ^ r + Ok(if (res < MAX) res else MAX))) ///////////////////////// // WRAPPING OPERATIONS // ///////////////////////// - /// Unsafe wrapping integer addition. - /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v + rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer addition. /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingAddUnsafe) + pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x + y) % (MAX + 1)).app(lhs, rhs, "impossible") - /// Unsafe wrapping integer subtraction. - /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - val adjusted = if (res < MIN) res + (MAX + 1) else res - { - v: adjusted % (MAX + 1), - error: "" - } + pure def wrappingSubInt(x: int, y: int): int = { + val res = x - y + val adjusted = if (res < MIN) (res + (MAX + 1)) else res + adjusted % (MAX + 1) } /// Wrapping integer subtraction. /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingSubUnsafe) + pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrappingSubInt.app(lhs, rhs, "impossible") - /// Unsafe wrapping integer multiplication. - /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v * rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer multiplication. /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingMulUnsafe) + pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x * y) % (MAX + 1)).app(lhs, rhs, "impossible") /// Wrapping integer division. /// Computes `lhs / rhs`. Wrapped division on unsigned types is just normal division. @@ -273,19 +182,16 @@ module BoundedUInt { /// This operator exists, so that all operations are accounted for in the wrapping operations. pure def wrappingRem(lhs: UIntT, rhs: UIntT): UIntT = checkedRem(lhs, rhs) - /// Unsafe wrapping exponentiation. - /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - v: (lhs.v ^ rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping exponentiation. /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingPowUnsafe) + pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + Ok((l ^ r) % (MAX + 1)))) } module BoundedUInt_Test { @@ -300,99 +206,99 @@ module BoundedUInt_Test { // Checked add pure val CAddInvsTest = and { - assert(checkedAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(checkedAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(1), UInt(MAX)) == {v: MAX + 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == {v: 2 * MAX - 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX)) == {v: 2 * MAX, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX + 1)).error == "out of range"), + assert(checkedAdd(UInt(0), UInt(0)) == Ok(0)), + assert(checkedAdd(UInt(1), UInt(0)) == Ok(1)), + assert(checkedAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(checkedAdd(UInt(1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX + 1)) == Err("out of range")), } // Checked sub pure val CSubInvsTest = and { - assert(checkedSub(UInt(0), UInt(0)) == {v: 0 , error: ""}), - assert(checkedSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedSub(UInt(0), UInt(MAX)) == {v: -MAX, error: "underflow"}), - assert(checkedSub(UInt(1), UInt(MAX)) == {v: -(MAX - 1), error: "underflow"}), - assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == {v: -1, error: "underflow"}), - assert(checkedSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedSub(UInt(0), UInt(0)) == Ok(0)), + assert(checkedSub(UInt(1), UInt(0)) == Ok(1)), + assert(checkedSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedSub(UInt(0), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked mul pure val CMulInvsTest = and { - assert(checkedMul(UInt(0), UInt(1)) == {v: 0 , error: ""}), - assert(checkedMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX^2 - MAX, error: "overflow"}), - assert(checkedMul(UInt(MAX), UInt(MAX)) == {v: MAX^2, error: "overflow"}), - assert(checkedMul(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedMul(UInt(0), UInt(1)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(1)) == Ok(1)), + assert(checkedMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked div pure val CDivInvsTest = and { - assert(checkedDiv(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedDiv(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(1)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(1)) == Ok(1)), + assert(checkedDiv(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedDiv(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedDiv(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(checkedDiv(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked rem pure val CRemInvsTest = and { - assert(checkedRem(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(checkedRem(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedRem(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX - 1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 1)), + assert(checkedRem(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked Pow pure val CPowInvsTest = and { - assert(checkedPow(UInt(0), UInt(0)).error == "undefined"), - assert(checkedPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedPow(UInt(MAX), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(checkedPow(UInt(2), UInt(BITS)) == {v: MAX + 1, error: "overflow"}), - assert(checkedPow(UInt(2), UInt(BITS + 1)) == {v: 2 * MAX + 2, error: "overflow"}), + assert(checkedPow(UInt(0), UInt(0)) == Err("undefined")), + assert(checkedPow(UInt(0), UInt(1)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(1), UInt(1)) == Ok(1)), + assert(checkedPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedPow(UInt(MAX), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(checkedPow(UInt(2), UInt(BITS)) == Err("overflow")), + assert(checkedPow(UInt(2), UInt(BITS + 1)) == Err("overflow")), } //////////////// @@ -401,61 +307,61 @@ module BoundedUInt_Test { // Saturating add pure val SAddInvsTest = and { - assert(saturatingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating sub pure val SSubInvsTest = and { - assert(saturatingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingSub(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingSub(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingSub(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingSub(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingSub(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating mul pure val SMulInvsTest = and { - assert(saturatingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingMul(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating pow pure val SPowInvsTest = and { - assert(saturatingPow(UInt(0), UInt(0)).error == "undefined"), - assert(saturatingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS + 1)) == {v: MAX, error: ""}), + assert(saturatingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(saturatingPow(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingPow(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(saturatingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(saturatingPow(UInt(2), UInt(BITS)) == Ok(MAX)), + assert(saturatingPow(UInt(2), UInt(BITS + 1)) == Ok(MAX)), } ////////////// @@ -464,47 +370,47 @@ module BoundedUInt_Test { // Wrapping add pure val WAddInvsTest = and { - assert(wrappingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 2, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingAdd(UInt(MAX), UInt(1)) == Ok(0)), + assert(wrappingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(wrappingAdd(UInt(1), UInt(MAX)) == Ok(0)), + assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 2)), + assert(wrappingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping sub pure val WSubInvsTest = and { - assert(wrappingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(0), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingSub(UInt(0), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingSub(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingSub(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingSub(UInt(0), UInt(1)) == Ok(MAX)), + assert(wrappingSub(UInt(1), UInt(1)) == Ok(0)), + assert(wrappingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingSub(UInt(0), UInt(MAX)) == Ok(1)), + assert(wrappingSub(UInt(1), UInt(MAX)) == Ok(2)), + assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(wrappingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping mul pure val WMulInvsTest = and { - assert(wrappingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingMul(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == Ok(2)), + assert(wrappingMul(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(wrappingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping div == checked div @@ -512,18 +418,18 @@ module BoundedUInt_Test { // Wrapping Pow pure val WPowInvsTest = and { - assert(wrappingPow(UInt(0), UInt(0)).error == "undefined"), - assert(wrappingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS + 1)) == {v: 0, error: ""}), + assert(wrappingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(wrappingPow(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingPow(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(wrappingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(wrappingPow(UInt(2), UInt(BITS)) == Ok(0)), + assert(wrappingPow(UInt(2), UInt(BITS + 1)) == Ok(0)), } ////////////// @@ -531,16 +437,16 @@ module BoundedUInt_Test { ////////////// pure val AbsDiffTest = and { - assert(absDiff(UInt(0), UInt(1)) == {v: 1, error: ""}), - assert(absDiff(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(1)) == {v: MAX - 2, error: ""}), - assert(absDiff(UInt(MAX), UInt(1)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(absDiff(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(absDiff(UInt(1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(MAX)) == {v: 1, error: ""}), - assert(absDiff(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(absDiff(UInt(0), UInt(1)) == Ok(1)), + assert(absDiff(UInt(1), UInt(1)) == Ok(0)), + assert(absDiff(UInt(MAX - 1), UInt(1)) == Ok(MAX - 2)), + assert(absDiff(UInt(MAX), UInt(1)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(absDiff(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(absDiff(UInt(1), UInt(MAX)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX - 1), UInt(MAX)) == Ok(1)), + assert(absDiff(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(absDiff(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } } From 64cf284a672c29e515b79c463350b94e490de465 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:51:29 -0500 Subject: [PATCH 178/428] Add distinct grammar rules for type var and const This prevents mis-identification of qualified type constructors as type variables. Closes #1336 --- quint/src/generated/Quint.g4 | 19 +++++++++++++------ quint/src/parsing/ToIrListener.ts | 16 ++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index c0a15396f..f57968779 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -106,12 +106,13 @@ type : type '->' type # typeFun | 'int' # typeInt | 'str' # typeStr | 'bool' # typeBool - | qualId # typeConstOrVar + | LOW_ID # typeVar + | qualId # typeConst | '(' type ')' # typeParen ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=IDENTIFIER))?)? - | '|' (rowVar=IDENTIFIER) +row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=identifier))?)? + | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; @@ -235,10 +236,11 @@ literal: (STRING | BOOL | INT) ; // A (possibly) qualified identifier, like `Foo` or `Foo::bar` -qualId : IDENTIFIER ('::' IDENTIFIER)* ; +qualId : identifier ('::' identifier)* ; + // An unqualified identifier that raises an error if a qualId is supplied simpleId[context: string] - : IDENTIFIER + : identifier | qualId { const err = quintErrorToString( { code: 'QNT008', @@ -249,6 +251,8 @@ simpleId[context: string] } ; +identifier : LOW_ID | CAP_ID; + // TOKENS // literals @@ -285,7 +289,10 @@ LPAREN : '(' ; RPAREN : ')' ; // other TLA+ identifiers -IDENTIFIER : ([a-zA-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with lowercase +LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with uppercase +CAP_ID : ([A-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; DOCCOMMENT : '///' .*? '\n'; diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 2186a87e5..f1e38a236 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1034,17 +1034,17 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'str' }) } + exitTypeVar(ctx: p.TypeVarContext) { + const name = ctx.LOW_ID().text + const id = this.getId(ctx) + this.typeStack.push({ id, kind: 'var', name }) + } + // a type variable, a type constant, or a reference to a type alias - exitTypeConstOrVar(ctx: p.TypeConstOrVarContext) { + exitTypeConst(ctx: p.TypeConstContext) { const name = ctx.qualId().text const id = this.getId(ctx) - if (name[0].match('[a-z]')) { - // a type variable from: a, b, ... z - this.typeStack.push({ id, kind: 'var', name }) - } else { - // a type constant, e.g., declared via typedef - this.typeStack.push({ id, kind: 'const', name }) - } + this.typeStack.push({ id, kind: 'const', name }) } // a set type, e.g., set(int) From 855fbdacabae6b212c9ccd2a18164ece183a6b76 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:54:38 -0500 Subject: [PATCH 179/428] Add generated parser code --- quint/src/generated/Quint.interp | 7 +- quint/src/generated/Quint.tokens | 11 +- quint/src/generated/QuintLexer.interp | 9 +- quint/src/generated/QuintLexer.tokens | 11 +- quint/src/generated/QuintLexer.ts | 437 ++-- quint/src/generated/QuintListener.ts | 36 +- quint/src/generated/QuintParser.ts | 1982 +++++++++-------- quint/src/generated/QuintVisitor.ts | 23 +- quint/testFixture/_1025importeeWithError.json | 2 +- 9 files changed, 1351 insertions(+), 1167 deletions(-) diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 08276dcf9..966bb4ab8 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -69,6 +69,7 @@ null null null null +null token symbolic names: null @@ -136,7 +137,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -181,7 +183,8 @@ operator literal qualId simpleId +identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 753, 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, 3, 2, 6, 2, 80, 10, 2, 13, 2, 14, 2, 81, 3, 2, 3, 2, 3, 3, 7, 3, 87, 10, 3, 12, 3, 14, 3, 90, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 96, 10, 3, 12, 3, 14, 3, 99, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 104, 10, 4, 12, 4, 14, 4, 107, 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, 131, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 139, 10, 6, 12, 6, 14, 6, 142, 11, 6, 5, 6, 144, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 149, 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, 162, 10, 6, 12, 6, 14, 6, 165, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 171, 10, 6, 3, 6, 3, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 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, 191, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 196, 10, 7, 12, 7, 14, 7, 199, 11, 7, 5, 7, 201, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 208, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 214, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 219, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 230, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 244, 10, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 5, 11, 250, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 261, 10, 12, 5, 12, 263, 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, 276, 10, 13, 12, 13, 14, 13, 279, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 286, 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, 299, 10, 13, 12, 13, 14, 13, 302, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 309, 10, 13, 5, 13, 311, 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, 326, 10, 18, 12, 18, 14, 18, 329, 11, 18, 5, 18, 331, 10, 18, 3, 18, 5, 18, 334, 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, 355, 10, 18, 12, 18, 14, 18, 358, 11, 18, 3, 18, 5, 18, 361, 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, 5, 18, 377, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 385, 10, 18, 12, 18, 14, 18, 388, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 395, 10, 19, 12, 19, 14, 19, 398, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 407, 10, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 5, 19, 413, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 422, 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, 438, 10, 21, 12, 21, 14, 21, 441, 11, 21, 3, 21, 5, 21, 444, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 453, 10, 21, 12, 21, 14, 21, 456, 11, 21, 3, 21, 5, 21, 459, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 469, 10, 21, 12, 21, 14, 21, 472, 11, 21, 3, 21, 5, 21, 475, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 484, 10, 21, 12, 21, 14, 21, 487, 11, 21, 3, 21, 5, 21, 490, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 498, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 506, 10, 21, 12, 21, 14, 21, 509, 11, 21, 3, 21, 5, 21, 512, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 520, 10, 21, 12, 21, 14, 21, 523, 11, 21, 3, 21, 5, 21, 526, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 534, 10, 21, 12, 21, 14, 21, 537, 11, 21, 5, 21, 539, 10, 21, 3, 21, 5, 21, 542, 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, 567, 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, 606, 10, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 616, 10, 21, 12, 21, 14, 21, 619, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 625, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 630, 10, 22, 12, 22, 14, 22, 633, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 639, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 662, 10, 25, 3, 26, 3, 26, 5, 26, 666, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 676, 10, 27, 12, 27, 14, 27, 679, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 685, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 692, 10, 28, 13, 28, 14, 28, 693, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 703, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 709, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 714, 10, 32, 12, 32, 14, 32, 717, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 725, 10, 33, 3, 34, 3, 34, 5, 34, 729, 10, 34, 3, 35, 3, 35, 5, 35, 733, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 742, 10, 38, 12, 38, 14, 38, 745, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 751, 10, 39, 3, 39, 2, 2, 4, 34, 40, 40, 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, 70, 2, 72, 2, 74, 2, 76, 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, 849, 2, 79, 3, 2, 2, 2, 4, 88, 3, 2, 2, 2, 6, 105, 3, 2, 2, 2, 8, 130, 3, 2, 2, 2, 10, 132, 3, 2, 2, 2, 12, 200, 3, 2, 2, 2, 14, 202, 3, 2, 2, 2, 16, 209, 3, 2, 2, 2, 18, 229, 3, 2, 2, 2, 20, 249, 3, 2, 2, 2, 22, 262, 3, 2, 2, 2, 24, 310, 3, 2, 2, 2, 26, 312, 3, 2, 2, 2, 28, 314, 3, 2, 2, 2, 30, 316, 3, 2, 2, 2, 32, 318, 3, 2, 2, 2, 34, 376, 3, 2, 2, 2, 36, 412, 3, 2, 2, 2, 38, 414, 3, 2, 2, 2, 40, 566, 3, 2, 2, 2, 42, 620, 3, 2, 2, 2, 44, 638, 3, 2, 2, 2, 46, 643, 3, 2, 2, 2, 48, 661, 3, 2, 2, 2, 50, 665, 3, 2, 2, 2, 52, 684, 3, 2, 2, 2, 54, 686, 3, 2, 2, 2, 56, 702, 3, 2, 2, 2, 58, 704, 3, 2, 2, 2, 60, 708, 3, 2, 2, 2, 62, 710, 3, 2, 2, 2, 64, 724, 3, 2, 2, 2, 66, 728, 3, 2, 2, 2, 68, 732, 3, 2, 2, 2, 70, 734, 3, 2, 2, 2, 72, 736, 3, 2, 2, 2, 74, 738, 3, 2, 2, 2, 76, 750, 3, 2, 2, 2, 78, 80, 5, 4, 3, 2, 79, 78, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 79, 3, 2, 2, 2, 81, 82, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 84, 7, 2, 2, 3, 84, 3, 3, 2, 2, 2, 85, 87, 7, 68, 2, 2, 86, 85, 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 91, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 91, 92, 7, 3, 2, 2, 92, 93, 5, 74, 38, 2, 93, 97, 7, 4, 2, 2, 94, 96, 5, 6, 4, 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, 7, 5, 2, 2, 101, 5, 3, 2, 2, 2, 102, 104, 7, 68, 2, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 5, 8, 5, 2, 109, 7, 3, 2, 2, 2, 110, 111, 7, 6, 2, 2, 111, 112, 5, 74, 38, 2, 112, 113, 7, 7, 2, 2, 113, 114, 5, 34, 18, 2, 114, 131, 3, 2, 2, 2, 115, 116, 7, 8, 2, 2, 116, 117, 5, 74, 38, 2, 117, 118, 7, 7, 2, 2, 118, 119, 5, 34, 18, 2, 119, 131, 3, 2, 2, 2, 120, 121, 7, 9, 2, 2, 121, 122, 5, 56, 29, 2, 122, 123, 7, 64, 2, 2, 123, 124, 5, 40, 21, 2, 124, 131, 3, 2, 2, 2, 125, 131, 5, 24, 13, 2, 126, 131, 5, 10, 6, 2, 127, 131, 5, 12, 7, 2, 128, 131, 5, 20, 11, 2, 129, 131, 5, 22, 12, 2, 130, 110, 3, 2, 2, 2, 130, 115, 3, 2, 2, 2, 130, 120, 3, 2, 2, 2, 130, 125, 3, 2, 2, 2, 130, 126, 3, 2, 2, 2, 130, 127, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 130, 129, 3, 2, 2, 2, 131, 9, 3, 2, 2, 2, 132, 133, 5, 18, 10, 2, 133, 170, 5, 66, 34, 2, 134, 143, 7, 65, 2, 2, 135, 140, 5, 58, 30, 2, 136, 137, 7, 10, 2, 2, 137, 139, 5, 58, 30, 2, 138, 136, 3, 2, 2, 2, 139, 142, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 143, 135, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 148, 7, 66, 2, 2, 146, 147, 7, 7, 2, 2, 147, 149, 5, 34, 18, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 171, 3, 2, 2, 2, 150, 151, 7, 7, 2, 2, 151, 171, 5, 34, 18, 2, 152, 153, 7, 65, 2, 2, 153, 154, 5, 58, 30, 2, 154, 155, 7, 7, 2, 2, 155, 163, 5, 34, 18, 2, 156, 157, 7, 10, 2, 2, 157, 158, 5, 58, 30, 2, 158, 159, 7, 7, 2, 2, 159, 160, 5, 34, 18, 2, 160, 162, 3, 2, 2, 2, 161, 156, 3, 2, 2, 2, 162, 165, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 166, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 166, 167, 7, 66, 2, 2, 167, 168, 7, 7, 2, 2, 168, 169, 5, 34, 18, 2, 169, 171, 3, 2, 2, 2, 170, 134, 3, 2, 2, 2, 170, 150, 3, 2, 2, 2, 170, 152, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 174, 3, 2, 2, 2, 172, 173, 7, 64, 2, 2, 173, 175, 5, 40, 21, 2, 174, 172, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 3, 2, 2, 2, 176, 178, 7, 11, 2, 2, 177, 176, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 11, 3, 2, 2, 2, 179, 180, 7, 12, 2, 2, 180, 201, 5, 74, 38, 2, 181, 182, 7, 12, 2, 2, 182, 183, 5, 74, 38, 2, 183, 184, 7, 64, 2, 2, 184, 185, 5, 34, 18, 2, 185, 201, 3, 2, 2, 2, 186, 187, 7, 12, 2, 2, 187, 188, 5, 74, 38, 2, 188, 190, 7, 64, 2, 2, 189, 191, 7, 13, 2, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 197, 5, 14, 8, 2, 193, 194, 7, 13, 2, 2, 194, 196, 5, 14, 8, 2, 195, 193, 3, 2, 2, 2, 196, 199, 3, 2, 2, 2, 197, 195, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 200, 179, 3, 2, 2, 2, 200, 181, 3, 2, 2, 2, 200, 186, 3, 2, 2, 2, 201, 13, 3, 2, 2, 2, 202, 207, 5, 76, 39, 2, 203, 204, 7, 65, 2, 2, 204, 205, 5, 34, 18, 2, 205, 206, 7, 66, 2, 2, 206, 208, 3, 2, 2, 2, 207, 203, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 15, 3, 2, 2, 2, 209, 210, 7, 14, 2, 2, 210, 213, 5, 74, 38, 2, 211, 212, 7, 7, 2, 2, 212, 214, 5, 34, 18, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 215, 3, 2, 2, 2, 215, 216, 7, 64, 2, 2, 216, 218, 5, 40, 21, 2, 217, 219, 7, 11, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 17, 3, 2, 2, 2, 220, 230, 7, 15, 2, 2, 221, 230, 7, 16, 2, 2, 222, 223, 7, 17, 2, 2, 223, 230, 7, 15, 2, 2, 224, 225, 7, 17, 2, 2, 225, 230, 7, 16, 2, 2, 226, 230, 7, 18, 2, 2, 227, 230, 7, 19, 2, 2, 228, 230, 7, 20, 2, 2, 229, 220, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 222, 3, 2, 2, 2, 229, 224, 3, 2, 2, 2, 229, 226, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 228, 3, 2, 2, 2, 230, 19, 3, 2, 2, 2, 231, 232, 7, 21, 2, 2, 232, 233, 5, 28, 15, 2, 233, 234, 7, 22, 2, 2, 234, 237, 5, 60, 31, 2, 235, 236, 7, 23, 2, 2, 236, 238, 5, 32, 17, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 250, 3, 2, 2, 2, 239, 240, 7, 21, 2, 2, 240, 243, 5, 28, 15, 2, 241, 242, 7, 24, 2, 2, 242, 244, 5, 28, 15, 2, 243, 241, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 246, 7, 23, 2, 2, 246, 248, 5, 32, 17, 2, 247, 245, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 250, 3, 2, 2, 2, 249, 231, 3, 2, 2, 2, 249, 239, 3, 2, 2, 2, 250, 21, 3, 2, 2, 2, 251, 252, 7, 25, 2, 2, 252, 253, 5, 28, 15, 2, 253, 254, 7, 22, 2, 2, 254, 255, 5, 60, 31, 2, 255, 263, 3, 2, 2, 2, 256, 257, 7, 25, 2, 2, 257, 260, 5, 28, 15, 2, 258, 259, 7, 24, 2, 2, 259, 261, 5, 28, 15, 2, 260, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 263, 3, 2, 2, 2, 262, 251, 3, 2, 2, 2, 262, 256, 3, 2, 2, 2, 263, 23, 3, 2, 2, 2, 264, 265, 7, 21, 2, 2, 265, 266, 5, 26, 14, 2, 266, 267, 7, 65, 2, 2, 267, 268, 5, 28, 15, 2, 268, 269, 7, 64, 2, 2, 269, 277, 5, 40, 21, 2, 270, 271, 7, 10, 2, 2, 271, 272, 5, 28, 15, 2, 272, 273, 7, 64, 2, 2, 273, 274, 5, 40, 21, 2, 274, 276, 3, 2, 2, 2, 275, 270, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 281, 7, 66, 2, 2, 281, 282, 7, 22, 2, 2, 282, 285, 7, 55, 2, 2, 283, 284, 7, 23, 2, 2, 284, 286, 5, 32, 17, 2, 285, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 311, 3, 2, 2, 2, 287, 288, 7, 21, 2, 2, 288, 289, 5, 26, 14, 2, 289, 290, 7, 65, 2, 2, 290, 291, 5, 28, 15, 2, 291, 292, 7, 64, 2, 2, 292, 300, 5, 40, 21, 2, 293, 294, 7, 10, 2, 2, 294, 295, 5, 28, 15, 2, 295, 296, 7, 64, 2, 2, 296, 297, 5, 40, 21, 2, 297, 299, 3, 2, 2, 2, 298, 293, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 304, 7, 66, 2, 2, 304, 305, 7, 24, 2, 2, 305, 308, 5, 30, 16, 2, 306, 307, 7, 23, 2, 2, 307, 309, 5, 32, 17, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 311, 3, 2, 2, 2, 310, 264, 3, 2, 2, 2, 310, 287, 3, 2, 2, 2, 311, 25, 3, 2, 2, 2, 312, 313, 5, 74, 38, 2, 313, 27, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 29, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 31, 3, 2, 2, 2, 318, 319, 7, 42, 2, 2, 319, 33, 3, 2, 2, 2, 320, 321, 8, 18, 1, 2, 321, 330, 7, 65, 2, 2, 322, 327, 5, 34, 18, 2, 323, 324, 7, 10, 2, 2, 324, 326, 5, 34, 18, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 322, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 333, 3, 2, 2, 2, 332, 334, 7, 10, 2, 2, 333, 332, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 336, 7, 66, 2, 2, 336, 337, 7, 27, 2, 2, 337, 377, 5, 34, 18, 12, 338, 339, 7, 49, 2, 2, 339, 340, 7, 28, 2, 2, 340, 341, 5, 34, 18, 2, 341, 342, 7, 29, 2, 2, 342, 377, 3, 2, 2, 2, 343, 344, 7, 50, 2, 2, 344, 345, 7, 28, 2, 2, 345, 346, 5, 34, 18, 2, 346, 347, 7, 29, 2, 2, 347, 377, 3, 2, 2, 2, 348, 349, 7, 65, 2, 2, 349, 350, 5, 34, 18, 2, 350, 351, 7, 10, 2, 2, 351, 356, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 34, 18, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 361, 7, 10, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 7, 66, 2, 2, 363, 377, 3, 2, 2, 2, 364, 365, 7, 4, 2, 2, 365, 366, 5, 36, 19, 2, 366, 367, 7, 5, 2, 2, 367, 377, 3, 2, 2, 2, 368, 377, 7, 30, 2, 2, 369, 377, 7, 31, 2, 2, 370, 377, 7, 32, 2, 2, 371, 377, 5, 74, 38, 2, 372, 373, 7, 65, 2, 2, 373, 374, 5, 34, 18, 2, 374, 375, 7, 66, 2, 2, 375, 377, 3, 2, 2, 2, 376, 320, 3, 2, 2, 2, 376, 338, 3, 2, 2, 2, 376, 343, 3, 2, 2, 2, 376, 348, 3, 2, 2, 2, 376, 364, 3, 2, 2, 2, 376, 368, 3, 2, 2, 2, 376, 369, 3, 2, 2, 2, 376, 370, 3, 2, 2, 2, 376, 371, 3, 2, 2, 2, 376, 372, 3, 2, 2, 2, 377, 386, 3, 2, 2, 2, 378, 379, 12, 14, 2, 2, 379, 380, 7, 26, 2, 2, 380, 385, 5, 34, 18, 14, 381, 382, 12, 13, 2, 2, 382, 383, 7, 27, 2, 2, 383, 385, 5, 34, 18, 13, 384, 378, 3, 2, 2, 2, 384, 381, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 35, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 5, 38, 20, 2, 390, 391, 7, 7, 2, 2, 391, 392, 5, 34, 18, 2, 392, 393, 7, 10, 2, 2, 393, 395, 3, 2, 2, 2, 394, 389, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 7, 2, 2, 401, 402, 5, 34, 18, 2, 402, 406, 3, 2, 2, 2, 403, 407, 7, 10, 2, 2, 404, 405, 7, 13, 2, 2, 405, 407, 7, 67, 2, 2, 406, 403, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 409, 3, 2, 2, 2, 408, 399, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 413, 3, 2, 2, 2, 410, 411, 7, 13, 2, 2, 411, 413, 7, 67, 2, 2, 412, 396, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 37, 3, 2, 2, 2, 414, 415, 5, 76, 39, 2, 415, 39, 3, 2, 2, 2, 416, 417, 8, 21, 1, 2, 417, 567, 5, 50, 26, 2, 418, 419, 5, 66, 34, 2, 419, 421, 7, 65, 2, 2, 420, 422, 5, 62, 32, 2, 421, 420, 3, 2, 2, 2, 421, 422, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 424, 7, 66, 2, 2, 424, 567, 3, 2, 2, 2, 425, 426, 7, 54, 2, 2, 426, 567, 5, 40, 21, 27, 427, 428, 5, 74, 38, 2, 428, 429, 7, 34, 2, 2, 429, 430, 7, 64, 2, 2, 430, 431, 5, 40, 21, 23, 431, 567, 3, 2, 2, 2, 432, 433, 7, 45, 2, 2, 433, 434, 7, 4, 2, 2, 434, 439, 5, 40, 21, 2, 435, 436, 7, 10, 2, 2, 436, 438, 5, 40, 21, 2, 437, 435, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 444, 7, 10, 2, 2, 443, 442, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 446, 7, 5, 2, 2, 446, 567, 3, 2, 2, 2, 447, 448, 7, 46, 2, 2, 448, 449, 7, 4, 2, 2, 449, 454, 5, 40, 21, 2, 450, 451, 7, 10, 2, 2, 451, 453, 5, 40, 21, 2, 452, 450, 3, 2, 2, 2, 453, 456, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 459, 7, 10, 2, 2, 458, 457, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 7, 5, 2, 2, 461, 567, 3, 2, 2, 2, 462, 567, 5, 42, 22, 2, 463, 464, 7, 35, 2, 2, 464, 465, 7, 4, 2, 2, 465, 470, 5, 40, 21, 2, 466, 467, 7, 10, 2, 2, 467, 469, 5, 40, 21, 2, 468, 466, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 475, 7, 10, 2, 2, 474, 473, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 7, 5, 2, 2, 477, 567, 3, 2, 2, 2, 478, 479, 7, 36, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 40, 21, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 40, 21, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 567, 3, 2, 2, 2, 493, 498, 5, 74, 38, 2, 494, 498, 7, 44, 2, 2, 495, 498, 7, 43, 2, 2, 496, 498, 7, 42, 2, 2, 497, 493, 3, 2, 2, 2, 497, 494, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 496, 3, 2, 2, 2, 498, 567, 3, 2, 2, 2, 499, 500, 7, 65, 2, 2, 500, 501, 5, 40, 21, 2, 501, 502, 7, 10, 2, 2, 502, 507, 5, 40, 21, 2, 503, 504, 7, 10, 2, 2, 504, 506, 5, 40, 21, 2, 505, 503, 3, 2, 2, 2, 506, 509, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 511, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 510, 512, 7, 10, 2, 2, 511, 510, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 7, 66, 2, 2, 514, 567, 3, 2, 2, 2, 515, 516, 7, 4, 2, 2, 516, 521, 5, 64, 33, 2, 517, 518, 7, 10, 2, 2, 518, 520, 5, 64, 33, 2, 519, 517, 3, 2, 2, 2, 520, 523, 3, 2, 2, 2, 521, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 524, 526, 7, 10, 2, 2, 525, 524, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 7, 5, 2, 2, 528, 567, 3, 2, 2, 2, 529, 538, 7, 28, 2, 2, 530, 535, 5, 40, 21, 2, 531, 532, 7, 10, 2, 2, 532, 534, 5, 40, 21, 2, 533, 531, 3, 2, 2, 2, 534, 537, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 538, 530, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 541, 3, 2, 2, 2, 540, 542, 7, 10, 2, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 567, 7, 29, 2, 2, 544, 545, 7, 37, 2, 2, 545, 546, 7, 65, 2, 2, 546, 547, 5, 40, 21, 2, 547, 548, 7, 66, 2, 2, 548, 549, 5, 40, 21, 2, 549, 550, 7, 38, 2, 2, 550, 551, 5, 40, 21, 7, 551, 567, 3, 2, 2, 2, 552, 553, 5, 10, 6, 2, 553, 554, 5, 40, 21, 6, 554, 567, 3, 2, 2, 2, 555, 556, 5, 16, 9, 2, 556, 557, 5, 40, 21, 5, 557, 567, 3, 2, 2, 2, 558, 559, 7, 65, 2, 2, 559, 560, 5, 40, 21, 2, 560, 561, 7, 66, 2, 2, 561, 567, 3, 2, 2, 2, 562, 563, 7, 4, 2, 2, 563, 564, 5, 40, 21, 2, 564, 565, 7, 5, 2, 2, 565, 567, 3, 2, 2, 2, 566, 416, 3, 2, 2, 2, 566, 418, 3, 2, 2, 2, 566, 425, 3, 2, 2, 2, 566, 427, 3, 2, 2, 2, 566, 432, 3, 2, 2, 2, 566, 447, 3, 2, 2, 2, 566, 462, 3, 2, 2, 2, 566, 463, 3, 2, 2, 2, 566, 478, 3, 2, 2, 2, 566, 497, 3, 2, 2, 2, 566, 499, 3, 2, 2, 2, 566, 515, 3, 2, 2, 2, 566, 529, 3, 2, 2, 2, 566, 544, 3, 2, 2, 2, 566, 552, 3, 2, 2, 2, 566, 555, 3, 2, 2, 2, 566, 558, 3, 2, 2, 2, 566, 562, 3, 2, 2, 2, 567, 617, 3, 2, 2, 2, 568, 569, 12, 28, 2, 2, 569, 570, 7, 33, 2, 2, 570, 616, 5, 40, 21, 28, 571, 572, 12, 26, 2, 2, 572, 573, 9, 2, 2, 2, 573, 616, 5, 40, 21, 27, 574, 575, 12, 25, 2, 2, 575, 576, 9, 3, 2, 2, 576, 616, 5, 40, 21, 26, 577, 578, 12, 24, 2, 2, 578, 579, 9, 4, 2, 2, 579, 616, 5, 40, 21, 25, 580, 581, 12, 22, 2, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 40, 21, 23, 583, 584, 8, 21, 1, 2, 584, 616, 3, 2, 2, 2, 585, 586, 12, 20, 2, 2, 586, 587, 7, 45, 2, 2, 587, 616, 5, 40, 21, 21, 588, 589, 12, 18, 2, 2, 589, 590, 7, 46, 2, 2, 590, 616, 5, 40, 21, 19, 591, 592, 12, 17, 2, 2, 592, 593, 7, 47, 2, 2, 593, 616, 5, 40, 21, 18, 594, 595, 12, 16, 2, 2, 595, 596, 7, 48, 2, 2, 596, 616, 5, 40, 21, 17, 597, 598, 12, 10, 2, 2, 598, 599, 7, 26, 2, 2, 599, 616, 5, 40, 21, 11, 600, 601, 12, 32, 2, 2, 601, 602, 7, 22, 2, 2, 602, 608, 5, 68, 35, 2, 603, 605, 7, 65, 2, 2, 604, 606, 5, 62, 32, 2, 605, 604, 3, 2, 2, 2, 605, 606, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 609, 7, 66, 2, 2, 608, 603, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 616, 3, 2, 2, 2, 610, 611, 12, 29, 2, 2, 611, 612, 7, 28, 2, 2, 612, 613, 5, 40, 21, 2, 613, 614, 7, 29, 2, 2, 614, 616, 3, 2, 2, 2, 615, 568, 3, 2, 2, 2, 615, 571, 3, 2, 2, 2, 615, 574, 3, 2, 2, 2, 615, 577, 3, 2, 2, 2, 615, 580, 3, 2, 2, 2, 615, 585, 3, 2, 2, 2, 615, 588, 3, 2, 2, 2, 615, 591, 3, 2, 2, 2, 615, 594, 3, 2, 2, 2, 615, 597, 3, 2, 2, 2, 615, 600, 3, 2, 2, 2, 615, 610, 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, 7, 52, 2, 2, 621, 622, 5, 40, 21, 2, 622, 624, 7, 4, 2, 2, 623, 625, 7, 13, 2, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 631, 5, 44, 23, 2, 627, 628, 7, 13, 2, 2, 628, 630, 5, 44, 23, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 5, 2, 2, 635, 43, 3, 2, 2, 2, 636, 639, 5, 46, 24, 2, 637, 639, 7, 39, 2, 2, 638, 636, 3, 2, 2, 2, 638, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 641, 7, 27, 2, 2, 641, 642, 5, 40, 21, 2, 642, 45, 3, 2, 2, 2, 643, 650, 5, 76, 39, 2, 644, 647, 7, 65, 2, 2, 645, 648, 5, 76, 39, 2, 646, 648, 7, 39, 2, 2, 647, 645, 3, 2, 2, 2, 647, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 66, 2, 2, 650, 644, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 47, 3, 2, 2, 2, 652, 653, 5, 8, 5, 2, 653, 654, 7, 2, 2, 3, 654, 662, 3, 2, 2, 2, 655, 656, 5, 40, 21, 2, 656, 657, 7, 2, 2, 3, 657, 662, 3, 2, 2, 2, 658, 659, 7, 68, 2, 2, 659, 662, 7, 2, 2, 3, 660, 662, 7, 2, 2, 3, 661, 652, 3, 2, 2, 2, 661, 655, 3, 2, 2, 2, 661, 658, 3, 2, 2, 2, 661, 660, 3, 2, 2, 2, 662, 49, 3, 2, 2, 2, 663, 666, 5, 52, 27, 2, 664, 666, 5, 54, 28, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 51, 3, 2, 2, 2, 667, 668, 5, 58, 30, 2, 668, 669, 7, 27, 2, 2, 669, 670, 5, 40, 21, 2, 670, 685, 3, 2, 2, 2, 671, 672, 7, 65, 2, 2, 672, 677, 5, 58, 30, 2, 673, 674, 7, 10, 2, 2, 674, 676, 5, 58, 30, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 66, 2, 2, 681, 682, 7, 27, 2, 2, 682, 683, 5, 40, 21, 2, 683, 685, 3, 2, 2, 2, 684, 667, 3, 2, 2, 2, 684, 671, 3, 2, 2, 2, 685, 53, 3, 2, 2, 2, 686, 687, 7, 65, 2, 2, 687, 688, 7, 65, 2, 2, 688, 691, 5, 58, 30, 2, 689, 690, 7, 10, 2, 2, 690, 692, 5, 58, 30, 2, 691, 689, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 7, 66, 2, 2, 696, 697, 7, 66, 2, 2, 697, 698, 7, 27, 2, 2, 698, 699, 5, 40, 21, 2, 699, 55, 3, 2, 2, 2, 700, 703, 7, 39, 2, 2, 701, 703, 5, 74, 38, 2, 702, 700, 3, 2, 2, 2, 702, 701, 3, 2, 2, 2, 703, 57, 3, 2, 2, 2, 704, 705, 5, 56, 29, 2, 705, 59, 3, 2, 2, 2, 706, 709, 7, 55, 2, 2, 707, 709, 5, 74, 38, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 61, 3, 2, 2, 2, 710, 715, 5, 40, 21, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 40, 21, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 63, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 5, 76, 39, 2, 719, 720, 7, 7, 2, 2, 720, 721, 5, 40, 21, 2, 721, 725, 3, 2, 2, 2, 722, 723, 7, 40, 2, 2, 723, 725, 5, 40, 21, 2, 724, 718, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 725, 65, 3, 2, 2, 2, 726, 729, 5, 74, 38, 2, 727, 729, 9, 5, 2, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 67, 3, 2, 2, 2, 730, 733, 5, 74, 38, 2, 731, 733, 9, 6, 2, 2, 732, 730, 3, 2, 2, 2, 732, 731, 3, 2, 2, 2, 733, 69, 3, 2, 2, 2, 734, 735, 9, 7, 2, 2, 735, 71, 3, 2, 2, 2, 736, 737, 9, 8, 2, 2, 737, 73, 3, 2, 2, 2, 738, 743, 7, 67, 2, 2, 739, 740, 7, 41, 2, 2, 740, 742, 7, 67, 2, 2, 741, 739, 3, 2, 2, 2, 742, 745, 3, 2, 2, 2, 743, 741, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 75, 3, 2, 2, 2, 745, 743, 3, 2, 2, 2, 746, 751, 7, 67, 2, 2, 747, 748, 5, 74, 38, 2, 748, 749, 8, 39, 1, 2, 749, 751, 3, 2, 2, 2, 750, 746, 3, 2, 2, 2, 750, 747, 3, 2, 2, 2, 751, 77, 3, 2, 2, 2, 84, 81, 88, 97, 105, 130, 140, 143, 148, 163, 170, 174, 177, 190, 197, 200, 207, 213, 218, 229, 237, 243, 247, 249, 260, 262, 277, 285, 300, 308, 310, 327, 330, 333, 356, 360, 376, 384, 386, 396, 406, 408, 412, 421, 439, 443, 454, 458, 470, 474, 485, 489, 497, 507, 511, 521, 525, 535, 538, 541, 566, 605, 608, 615, 617, 624, 631, 638, 647, 650, 661, 665, 677, 684, 693, 702, 708, 715, 724, 728, 732, 743, 750] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 758, 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, 3, 2, 6, 2, 82, 10, 2, 13, 2, 14, 2, 83, 3, 2, 3, 2, 3, 3, 7, 3, 89, 10, 3, 12, 3, 14, 3, 92, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 98, 10, 3, 12, 3, 14, 3, 101, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 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, 133, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 141, 10, 6, 12, 6, 14, 6, 144, 11, 6, 5, 6, 146, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 151, 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, 164, 10, 6, 12, 6, 14, 6, 167, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 3, 6, 5, 6, 177, 10, 6, 3, 6, 5, 6, 180, 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, 193, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 198, 10, 7, 12, 7, 14, 7, 201, 11, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 210, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 216, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 221, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 5, 11, 252, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 263, 10, 12, 5, 12, 265, 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, 278, 10, 13, 12, 13, 14, 13, 281, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 288, 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, 301, 10, 13, 12, 13, 14, 13, 304, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 311, 10, 13, 5, 13, 313, 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, 328, 10, 18, 12, 18, 14, 18, 331, 11, 18, 5, 18, 333, 10, 18, 3, 18, 5, 18, 336, 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, 357, 10, 18, 12, 18, 14, 18, 360, 11, 18, 3, 18, 5, 18, 363, 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, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 398, 10, 19, 12, 19, 14, 19, 401, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 410, 10, 19, 5, 19, 412, 10, 19, 3, 19, 3, 19, 5, 19, 416, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 425, 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, 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, 3, 21, 7, 21, 472, 10, 21, 12, 21, 14, 21, 475, 11, 21, 3, 21, 5, 21, 478, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 487, 10, 21, 12, 21, 14, 21, 490, 11, 21, 3, 21, 5, 21, 493, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 501, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 509, 10, 21, 12, 21, 14, 21, 512, 11, 21, 3, 21, 5, 21, 515, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 523, 10, 21, 12, 21, 14, 21, 526, 11, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 537, 10, 21, 12, 21, 14, 21, 540, 11, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 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, 570, 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, 609, 10, 21, 3, 21, 5, 21, 612, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 619, 10, 21, 12, 21, 14, 21, 622, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 633, 10, 22, 12, 22, 14, 22, 636, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 642, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 5, 24, 654, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 665, 10, 25, 3, 26, 3, 26, 5, 26, 669, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 679, 10, 27, 12, 27, 14, 27, 682, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 688, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 695, 10, 28, 13, 28, 14, 28, 696, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 706, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 712, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 717, 10, 32, 12, 32, 14, 32, 720, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 728, 10, 33, 3, 34, 3, 34, 5, 34, 732, 10, 34, 3, 35, 3, 35, 5, 35, 736, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 745, 10, 38, 12, 38, 14, 38, 748, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 754, 10, 39, 3, 40, 3, 40, 3, 40, 2, 2, 4, 34, 40, 41, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 2, 10, 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, 3, 2, 67, 68, 2, 854, 2, 81, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 132, 3, 2, 2, 2, 10, 134, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 211, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 251, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 312, 3, 2, 2, 2, 26, 314, 3, 2, 2, 2, 28, 316, 3, 2, 2, 2, 30, 318, 3, 2, 2, 2, 32, 320, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 415, 3, 2, 2, 2, 38, 417, 3, 2, 2, 2, 40, 569, 3, 2, 2, 2, 42, 623, 3, 2, 2, 2, 44, 641, 3, 2, 2, 2, 46, 646, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 668, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 689, 3, 2, 2, 2, 56, 705, 3, 2, 2, 2, 58, 707, 3, 2, 2, 2, 60, 711, 3, 2, 2, 2, 62, 713, 3, 2, 2, 2, 64, 727, 3, 2, 2, 2, 66, 731, 3, 2, 2, 2, 68, 735, 3, 2, 2, 2, 70, 737, 3, 2, 2, 2, 72, 739, 3, 2, 2, 2, 74, 741, 3, 2, 2, 2, 76, 753, 3, 2, 2, 2, 78, 755, 3, 2, 2, 2, 80, 82, 5, 4, 3, 2, 81, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 7, 2, 2, 3, 86, 3, 3, 2, 2, 2, 87, 89, 7, 69, 2, 2, 88, 87, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 7, 3, 2, 2, 94, 95, 5, 74, 38, 2, 95, 99, 7, 4, 2, 2, 96, 98, 5, 6, 4, 2, 97, 96, 3, 2, 2, 2, 98, 101, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 5, 3, 2, 2, 2, 104, 106, 7, 69, 2, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 8, 5, 2, 111, 7, 3, 2, 2, 2, 112, 113, 7, 6, 2, 2, 113, 114, 5, 74, 38, 2, 114, 115, 7, 7, 2, 2, 115, 116, 5, 34, 18, 2, 116, 133, 3, 2, 2, 2, 117, 118, 7, 8, 2, 2, 118, 119, 5, 74, 38, 2, 119, 120, 7, 7, 2, 2, 120, 121, 5, 34, 18, 2, 121, 133, 3, 2, 2, 2, 122, 123, 7, 9, 2, 2, 123, 124, 5, 56, 29, 2, 124, 125, 7, 64, 2, 2, 125, 126, 5, 40, 21, 2, 126, 133, 3, 2, 2, 2, 127, 133, 5, 24, 13, 2, 128, 133, 5, 10, 6, 2, 129, 133, 5, 12, 7, 2, 130, 133, 5, 20, 11, 2, 131, 133, 5, 22, 12, 2, 132, 112, 3, 2, 2, 2, 132, 117, 3, 2, 2, 2, 132, 122, 3, 2, 2, 2, 132, 127, 3, 2, 2, 2, 132, 128, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 131, 3, 2, 2, 2, 133, 9, 3, 2, 2, 2, 134, 135, 5, 18, 10, 2, 135, 172, 5, 66, 34, 2, 136, 145, 7, 65, 2, 2, 137, 142, 5, 58, 30, 2, 138, 139, 7, 10, 2, 2, 139, 141, 5, 58, 30, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 137, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 150, 7, 66, 2, 2, 148, 149, 7, 7, 2, 2, 149, 151, 5, 34, 18, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 173, 3, 2, 2, 2, 152, 153, 7, 7, 2, 2, 153, 173, 5, 34, 18, 2, 154, 155, 7, 65, 2, 2, 155, 156, 5, 58, 30, 2, 156, 157, 7, 7, 2, 2, 157, 165, 5, 34, 18, 2, 158, 159, 7, 10, 2, 2, 159, 160, 5, 58, 30, 2, 160, 161, 7, 7, 2, 2, 161, 162, 5, 34, 18, 2, 162, 164, 3, 2, 2, 2, 163, 158, 3, 2, 2, 2, 164, 167, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 168, 169, 7, 66, 2, 2, 169, 170, 7, 7, 2, 2, 170, 171, 5, 34, 18, 2, 171, 173, 3, 2, 2, 2, 172, 136, 3, 2, 2, 2, 172, 152, 3, 2, 2, 2, 172, 154, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 177, 5, 40, 21, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 179, 3, 2, 2, 2, 178, 180, 7, 11, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 11, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 203, 5, 74, 38, 2, 183, 184, 7, 12, 2, 2, 184, 185, 5, 74, 38, 2, 185, 186, 7, 64, 2, 2, 186, 187, 5, 34, 18, 2, 187, 203, 3, 2, 2, 2, 188, 189, 7, 12, 2, 2, 189, 190, 5, 74, 38, 2, 190, 192, 7, 64, 2, 2, 191, 193, 7, 13, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 199, 5, 14, 8, 2, 195, 196, 7, 13, 2, 2, 196, 198, 5, 14, 8, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 181, 3, 2, 2, 2, 202, 183, 3, 2, 2, 2, 202, 188, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 209, 5, 76, 39, 2, 205, 206, 7, 65, 2, 2, 206, 207, 5, 34, 18, 2, 207, 208, 7, 66, 2, 2, 208, 210, 3, 2, 2, 2, 209, 205, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 15, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 215, 5, 74, 38, 2, 213, 214, 7, 7, 2, 2, 214, 216, 5, 34, 18, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 64, 2, 2, 218, 220, 5, 40, 21, 2, 219, 221, 7, 11, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 17, 3, 2, 2, 2, 222, 232, 7, 15, 2, 2, 223, 232, 7, 16, 2, 2, 224, 225, 7, 17, 2, 2, 225, 232, 7, 15, 2, 2, 226, 227, 7, 17, 2, 2, 227, 232, 7, 16, 2, 2, 228, 232, 7, 18, 2, 2, 229, 232, 7, 19, 2, 2, 230, 232, 7, 20, 2, 2, 231, 222, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 224, 3, 2, 2, 2, 231, 226, 3, 2, 2, 2, 231, 228, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 21, 2, 2, 234, 235, 5, 28, 15, 2, 235, 236, 7, 22, 2, 2, 236, 239, 5, 60, 31, 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, 252, 3, 2, 2, 2, 241, 242, 7, 21, 2, 2, 242, 245, 5, 28, 15, 2, 243, 244, 7, 24, 2, 2, 244, 246, 5, 28, 15, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 249, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 250, 5, 32, 17, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 233, 3, 2, 2, 2, 251, 241, 3, 2, 2, 2, 252, 21, 3, 2, 2, 2, 253, 254, 7, 25, 2, 2, 254, 255, 5, 28, 15, 2, 255, 256, 7, 22, 2, 2, 256, 257, 5, 60, 31, 2, 257, 265, 3, 2, 2, 2, 258, 259, 7, 25, 2, 2, 259, 262, 5, 28, 15, 2, 260, 261, 7, 24, 2, 2, 261, 263, 5, 28, 15, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 265, 3, 2, 2, 2, 264, 253, 3, 2, 2, 2, 264, 258, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 267, 7, 21, 2, 2, 267, 268, 5, 26, 14, 2, 268, 269, 7, 65, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 279, 5, 40, 21, 2, 272, 273, 7, 10, 2, 2, 273, 274, 5, 28, 15, 2, 274, 275, 7, 64, 2, 2, 275, 276, 5, 40, 21, 2, 276, 278, 3, 2, 2, 2, 277, 272, 3, 2, 2, 2, 278, 281, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 282, 283, 7, 66, 2, 2, 283, 284, 7, 22, 2, 2, 284, 287, 7, 55, 2, 2, 285, 286, 7, 23, 2, 2, 286, 288, 5, 32, 17, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 313, 3, 2, 2, 2, 289, 290, 7, 21, 2, 2, 290, 291, 5, 26, 14, 2, 291, 292, 7, 65, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 302, 5, 40, 21, 2, 295, 296, 7, 10, 2, 2, 296, 297, 5, 28, 15, 2, 297, 298, 7, 64, 2, 2, 298, 299, 5, 40, 21, 2, 299, 301, 3, 2, 2, 2, 300, 295, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 66, 2, 2, 306, 307, 7, 24, 2, 2, 307, 310, 5, 30, 16, 2, 308, 309, 7, 23, 2, 2, 309, 311, 5, 32, 17, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 313, 3, 2, 2, 2, 312, 266, 3, 2, 2, 2, 312, 289, 3, 2, 2, 2, 313, 25, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 27, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 29, 3, 2, 2, 2, 318, 319, 5, 74, 38, 2, 319, 31, 3, 2, 2, 2, 320, 321, 7, 42, 2, 2, 321, 33, 3, 2, 2, 2, 322, 323, 8, 18, 1, 2, 323, 332, 7, 65, 2, 2, 324, 329, 5, 34, 18, 2, 325, 326, 7, 10, 2, 2, 326, 328, 5, 34, 18, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 336, 7, 10, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 7, 66, 2, 2, 338, 339, 7, 27, 2, 2, 339, 380, 5, 34, 18, 13, 340, 341, 7, 49, 2, 2, 341, 342, 7, 28, 2, 2, 342, 343, 5, 34, 18, 2, 343, 344, 7, 29, 2, 2, 344, 380, 3, 2, 2, 2, 345, 346, 7, 50, 2, 2, 346, 347, 7, 28, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 29, 2, 2, 349, 380, 3, 2, 2, 2, 350, 351, 7, 65, 2, 2, 351, 352, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 358, 5, 34, 18, 2, 354, 355, 7, 10, 2, 2, 355, 357, 5, 34, 18, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 380, 3, 2, 2, 2, 366, 367, 7, 4, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 5, 2, 2, 369, 380, 3, 2, 2, 2, 370, 380, 7, 30, 2, 2, 371, 380, 7, 31, 2, 2, 372, 380, 7, 32, 2, 2, 373, 380, 7, 67, 2, 2, 374, 380, 5, 74, 38, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 322, 3, 2, 2, 2, 379, 340, 3, 2, 2, 2, 379, 345, 3, 2, 2, 2, 379, 350, 3, 2, 2, 2, 379, 366, 3, 2, 2, 2, 379, 370, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 5, 38, 20, 2, 393, 394, 7, 7, 2, 2, 394, 395, 5, 34, 18, 2, 395, 396, 7, 10, 2, 2, 396, 398, 3, 2, 2, 2, 397, 392, 3, 2, 2, 2, 398, 401, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 403, 5, 38, 20, 2, 403, 404, 7, 7, 2, 2, 404, 405, 5, 34, 18, 2, 405, 409, 3, 2, 2, 2, 406, 410, 7, 10, 2, 2, 407, 408, 7, 13, 2, 2, 408, 410, 5, 78, 40, 2, 409, 406, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 402, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 416, 3, 2, 2, 2, 413, 414, 7, 13, 2, 2, 414, 416, 5, 78, 40, 2, 415, 399, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 37, 3, 2, 2, 2, 417, 418, 5, 76, 39, 2, 418, 39, 3, 2, 2, 2, 419, 420, 8, 21, 1, 2, 420, 570, 5, 50, 26, 2, 421, 422, 5, 66, 34, 2, 422, 424, 7, 65, 2, 2, 423, 425, 5, 62, 32, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 66, 2, 2, 427, 570, 3, 2, 2, 2, 428, 429, 7, 54, 2, 2, 429, 570, 5, 40, 21, 27, 430, 431, 5, 74, 38, 2, 431, 432, 7, 34, 2, 2, 432, 433, 7, 64, 2, 2, 433, 434, 5, 40, 21, 23, 434, 570, 3, 2, 2, 2, 435, 436, 7, 45, 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, 570, 3, 2, 2, 2, 450, 451, 7, 46, 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, 570, 3, 2, 2, 2, 465, 570, 5, 42, 22, 2, 466, 467, 7, 35, 2, 2, 467, 468, 7, 4, 2, 2, 468, 473, 5, 40, 21, 2, 469, 470, 7, 10, 2, 2, 470, 472, 5, 40, 21, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 7, 10, 2, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 5, 2, 2, 480, 570, 3, 2, 2, 2, 481, 482, 7, 36, 2, 2, 482, 483, 7, 4, 2, 2, 483, 488, 5, 40, 21, 2, 484, 485, 7, 10, 2, 2, 485, 487, 5, 40, 21, 2, 486, 484, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 491, 493, 7, 10, 2, 2, 492, 491, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 7, 5, 2, 2, 495, 570, 3, 2, 2, 2, 496, 501, 5, 74, 38, 2, 497, 501, 7, 44, 2, 2, 498, 501, 7, 43, 2, 2, 499, 501, 7, 42, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 570, 3, 2, 2, 2, 502, 503, 7, 65, 2, 2, 503, 504, 5, 40, 21, 2, 504, 505, 7, 10, 2, 2, 505, 510, 5, 40, 21, 2, 506, 507, 7, 10, 2, 2, 507, 509, 5, 40, 21, 2, 508, 506, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 515, 7, 10, 2, 2, 514, 513, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 7, 66, 2, 2, 517, 570, 3, 2, 2, 2, 518, 519, 7, 4, 2, 2, 519, 524, 5, 64, 33, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 64, 33, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 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, 531, 7, 5, 2, 2, 531, 570, 3, 2, 2, 2, 532, 541, 7, 28, 2, 2, 533, 538, 5, 40, 21, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 40, 21, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 533, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 10, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 570, 7, 29, 2, 2, 547, 548, 7, 37, 2, 2, 548, 549, 7, 65, 2, 2, 549, 550, 5, 40, 21, 2, 550, 551, 7, 66, 2, 2, 551, 552, 5, 40, 21, 2, 552, 553, 7, 38, 2, 2, 553, 554, 5, 40, 21, 7, 554, 570, 3, 2, 2, 2, 555, 556, 5, 10, 6, 2, 556, 557, 5, 40, 21, 6, 557, 570, 3, 2, 2, 2, 558, 559, 5, 16, 9, 2, 559, 560, 5, 40, 21, 5, 560, 570, 3, 2, 2, 2, 561, 562, 7, 65, 2, 2, 562, 563, 5, 40, 21, 2, 563, 564, 7, 66, 2, 2, 564, 570, 3, 2, 2, 2, 565, 566, 7, 4, 2, 2, 566, 567, 5, 40, 21, 2, 567, 568, 7, 5, 2, 2, 568, 570, 3, 2, 2, 2, 569, 419, 3, 2, 2, 2, 569, 421, 3, 2, 2, 2, 569, 428, 3, 2, 2, 2, 569, 430, 3, 2, 2, 2, 569, 435, 3, 2, 2, 2, 569, 450, 3, 2, 2, 2, 569, 465, 3, 2, 2, 2, 569, 466, 3, 2, 2, 2, 569, 481, 3, 2, 2, 2, 569, 500, 3, 2, 2, 2, 569, 502, 3, 2, 2, 2, 569, 518, 3, 2, 2, 2, 569, 532, 3, 2, 2, 2, 569, 547, 3, 2, 2, 2, 569, 555, 3, 2, 2, 2, 569, 558, 3, 2, 2, 2, 569, 561, 3, 2, 2, 2, 569, 565, 3, 2, 2, 2, 570, 620, 3, 2, 2, 2, 571, 572, 12, 28, 2, 2, 572, 573, 7, 33, 2, 2, 573, 619, 5, 40, 21, 28, 574, 575, 12, 26, 2, 2, 575, 576, 9, 2, 2, 2, 576, 619, 5, 40, 21, 27, 577, 578, 12, 25, 2, 2, 578, 579, 9, 3, 2, 2, 579, 619, 5, 40, 21, 26, 580, 581, 12, 24, 2, 2, 581, 582, 9, 4, 2, 2, 582, 619, 5, 40, 21, 25, 583, 584, 12, 22, 2, 2, 584, 585, 7, 64, 2, 2, 585, 586, 5, 40, 21, 23, 586, 587, 8, 21, 1, 2, 587, 619, 3, 2, 2, 2, 588, 589, 12, 20, 2, 2, 589, 590, 7, 45, 2, 2, 590, 619, 5, 40, 21, 21, 591, 592, 12, 18, 2, 2, 592, 593, 7, 46, 2, 2, 593, 619, 5, 40, 21, 19, 594, 595, 12, 17, 2, 2, 595, 596, 7, 47, 2, 2, 596, 619, 5, 40, 21, 18, 597, 598, 12, 16, 2, 2, 598, 599, 7, 48, 2, 2, 599, 619, 5, 40, 21, 17, 600, 601, 12, 10, 2, 2, 601, 602, 7, 26, 2, 2, 602, 619, 5, 40, 21, 11, 603, 604, 12, 32, 2, 2, 604, 605, 7, 22, 2, 2, 605, 611, 5, 68, 35, 2, 606, 608, 7, 65, 2, 2, 607, 609, 5, 62, 32, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 66, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 619, 3, 2, 2, 2, 613, 614, 12, 29, 2, 2, 614, 615, 7, 28, 2, 2, 615, 616, 5, 40, 21, 2, 616, 617, 7, 29, 2, 2, 617, 619, 3, 2, 2, 2, 618, 571, 3, 2, 2, 2, 618, 574, 3, 2, 2, 2, 618, 577, 3, 2, 2, 2, 618, 580, 3, 2, 2, 2, 618, 583, 3, 2, 2, 2, 618, 588, 3, 2, 2, 2, 618, 591, 3, 2, 2, 2, 618, 594, 3, 2, 2, 2, 618, 597, 3, 2, 2, 2, 618, 600, 3, 2, 2, 2, 618, 603, 3, 2, 2, 2, 618, 613, 3, 2, 2, 2, 619, 622, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 41, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 623, 624, 7, 52, 2, 2, 624, 625, 5, 40, 21, 2, 625, 627, 7, 4, 2, 2, 626, 628, 7, 13, 2, 2, 627, 626, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 634, 5, 44, 23, 2, 630, 631, 7, 13, 2, 2, 631, 633, 5, 44, 23, 2, 632, 630, 3, 2, 2, 2, 633, 636, 3, 2, 2, 2, 634, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 637, 638, 7, 5, 2, 2, 638, 43, 3, 2, 2, 2, 639, 642, 5, 46, 24, 2, 640, 642, 7, 39, 2, 2, 641, 639, 3, 2, 2, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 7, 27, 2, 2, 644, 645, 5, 40, 21, 2, 645, 45, 3, 2, 2, 2, 646, 653, 5, 76, 39, 2, 647, 650, 7, 65, 2, 2, 648, 651, 5, 76, 39, 2, 649, 651, 7, 39, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 654, 7, 66, 2, 2, 653, 647, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 47, 3, 2, 2, 2, 655, 656, 5, 8, 5, 2, 656, 657, 7, 2, 2, 3, 657, 665, 3, 2, 2, 2, 658, 659, 5, 40, 21, 2, 659, 660, 7, 2, 2, 3, 660, 665, 3, 2, 2, 2, 661, 662, 7, 69, 2, 2, 662, 665, 7, 2, 2, 3, 663, 665, 7, 2, 2, 3, 664, 655, 3, 2, 2, 2, 664, 658, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 49, 3, 2, 2, 2, 666, 669, 5, 52, 27, 2, 667, 669, 5, 54, 28, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 51, 3, 2, 2, 2, 670, 671, 5, 58, 30, 2, 671, 672, 7, 27, 2, 2, 672, 673, 5, 40, 21, 2, 673, 688, 3, 2, 2, 2, 674, 675, 7, 65, 2, 2, 675, 680, 5, 58, 30, 2, 676, 677, 7, 10, 2, 2, 677, 679, 5, 58, 30, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 684, 7, 66, 2, 2, 684, 685, 7, 27, 2, 2, 685, 686, 5, 40, 21, 2, 686, 688, 3, 2, 2, 2, 687, 670, 3, 2, 2, 2, 687, 674, 3, 2, 2, 2, 688, 53, 3, 2, 2, 2, 689, 690, 7, 65, 2, 2, 690, 691, 7, 65, 2, 2, 691, 694, 5, 58, 30, 2, 692, 693, 7, 10, 2, 2, 693, 695, 5, 58, 30, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 66, 2, 2, 699, 700, 7, 66, 2, 2, 700, 701, 7, 27, 2, 2, 701, 702, 5, 40, 21, 2, 702, 55, 3, 2, 2, 2, 703, 706, 7, 39, 2, 2, 704, 706, 5, 74, 38, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 57, 3, 2, 2, 2, 707, 708, 5, 56, 29, 2, 708, 59, 3, 2, 2, 2, 709, 712, 7, 55, 2, 2, 710, 712, 5, 74, 38, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 61, 3, 2, 2, 2, 713, 718, 5, 40, 21, 2, 714, 715, 7, 10, 2, 2, 715, 717, 5, 40, 21, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 63, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 722, 5, 76, 39, 2, 722, 723, 7, 7, 2, 2, 723, 724, 5, 40, 21, 2, 724, 728, 3, 2, 2, 2, 725, 726, 7, 40, 2, 2, 726, 728, 5, 40, 21, 2, 727, 721, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 65, 3, 2, 2, 2, 729, 732, 5, 74, 38, 2, 730, 732, 9, 5, 2, 2, 731, 729, 3, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 67, 3, 2, 2, 2, 733, 736, 5, 74, 38, 2, 734, 736, 9, 6, 2, 2, 735, 733, 3, 2, 2, 2, 735, 734, 3, 2, 2, 2, 736, 69, 3, 2, 2, 2, 737, 738, 9, 7, 2, 2, 738, 71, 3, 2, 2, 2, 739, 740, 9, 8, 2, 2, 740, 73, 3, 2, 2, 2, 741, 746, 5, 78, 40, 2, 742, 743, 7, 41, 2, 2, 743, 745, 5, 78, 40, 2, 744, 742, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 75, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 754, 5, 78, 40, 2, 750, 751, 5, 74, 38, 2, 751, 752, 8, 39, 1, 2, 752, 754, 3, 2, 2, 2, 753, 749, 3, 2, 2, 2, 753, 750, 3, 2, 2, 2, 754, 77, 3, 2, 2, 2, 755, 756, 9, 9, 2, 2, 756, 79, 3, 2, 2, 2, 84, 83, 90, 99, 107, 132, 142, 145, 150, 165, 172, 176, 179, 192, 199, 202, 209, 215, 220, 231, 239, 245, 249, 251, 262, 264, 279, 287, 302, 310, 312, 329, 332, 335, 358, 362, 379, 387, 389, 399, 409, 411, 415, 424, 442, 446, 457, 461, 473, 477, 488, 492, 500, 510, 514, 524, 528, 538, 541, 544, 569, 608, 611, 618, 620, 627, 634, 641, 650, 653, 664, 668, 680, 687, 696, 705, 711, 718, 727, 731, 735, 746, 753] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index 427758cd2..a3529881a 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -62,11 +62,12 @@ EQ=61 ASGN=62 LPAREN=63 RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index 700db184e..e66950a16 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -69,6 +69,7 @@ null null null null +null token symbolic names: null @@ -136,7 +137,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -207,7 +209,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -221,4 +224,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, 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 +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 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, 303, 10, 41, 12, 41, 14, 41, 306, 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, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 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, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 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, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 199, 3, 2, 2, 2, 33, 204, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 215, 3, 2, 2, 2, 39, 224, 3, 2, 2, 2, 41, 231, 3, 2, 2, 2, 43, 233, 3, 2, 2, 2, 45, 238, 3, 2, 2, 2, 47, 241, 3, 2, 2, 2, 49, 248, 3, 2, 2, 2, 51, 251, 3, 2, 2, 2, 53, 254, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 372, 3, 2, 2, 2, 101, 376, 3, 2, 2, 2, 103, 382, 3, 2, 2, 2, 105, 384, 3, 2, 2, 2, 107, 386, 3, 2, 2, 2, 109, 388, 3, 2, 2, 2, 111, 390, 3, 2, 2, 2, 113, 392, 3, 2, 2, 2, 115, 394, 3, 2, 2, 2, 117, 396, 3, 2, 2, 2, 119, 399, 3, 2, 2, 2, 121, 402, 3, 2, 2, 2, 123, 405, 3, 2, 2, 2, 125, 408, 3, 2, 2, 2, 127, 410, 3, 2, 2, 2, 129, 412, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 126, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 113, 2, 2, 186, 187, 7, 112, 2, 2, 187, 188, 7, 102, 2, 2, 188, 189, 7, 103, 2, 2, 189, 190, 7, 118, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 120, 2, 2, 192, 193, 7, 99, 2, 2, 193, 194, 7, 110, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 102, 2, 2, 196, 197, 7, 103, 2, 2, 197, 198, 7, 104, 2, 2, 198, 30, 3, 2, 2, 2, 199, 200, 7, 114, 2, 2, 200, 201, 7, 119, 2, 2, 201, 202, 7, 116, 2, 2, 202, 203, 7, 103, 2, 2, 203, 32, 3, 2, 2, 2, 204, 205, 7, 99, 2, 2, 205, 206, 7, 101, 2, 2, 206, 207, 7, 118, 2, 2, 207, 208, 7, 107, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 116, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 112, 2, 2, 214, 36, 3, 2, 2, 2, 215, 216, 7, 118, 2, 2, 216, 217, 7, 103, 2, 2, 217, 218, 7, 111, 2, 2, 218, 219, 7, 114, 2, 2, 219, 220, 7, 113, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 38, 3, 2, 2, 2, 224, 225, 7, 107, 2, 2, 225, 226, 7, 111, 2, 2, 226, 227, 7, 114, 2, 2, 227, 228, 7, 113, 2, 2, 228, 229, 7, 116, 2, 2, 229, 230, 7, 118, 2, 2, 230, 40, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 42, 3, 2, 2, 2, 233, 234, 7, 104, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 111, 2, 2, 237, 44, 3, 2, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 117, 2, 2, 240, 46, 3, 2, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 122, 2, 2, 243, 244, 7, 114, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 116, 2, 2, 246, 247, 7, 118, 2, 2, 247, 48, 3, 2, 2, 2, 248, 249, 7, 47, 2, 2, 249, 250, 7, 64, 2, 2, 250, 50, 3, 2, 2, 2, 251, 252, 7, 63, 2, 2, 252, 253, 7, 64, 2, 2, 253, 52, 3, 2, 2, 2, 254, 255, 7, 93, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 95, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 85, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 7, 118, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 78, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 118, 2, 2, 371, 98, 3, 2, 2, 2, 372, 373, 7, 79, 2, 2, 373, 374, 7, 99, 2, 2, 374, 375, 7, 114, 2, 2, 375, 100, 3, 2, 2, 2, 376, 377, 7, 111, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 118, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 106, 2, 2, 381, 102, 3, 2, 2, 2, 382, 383, 7, 45, 2, 2, 383, 104, 3, 2, 2, 2, 384, 385, 7, 47, 2, 2, 385, 106, 3, 2, 2, 2, 386, 387, 7, 44, 2, 2, 387, 108, 3, 2, 2, 2, 388, 389, 7, 49, 2, 2, 389, 110, 3, 2, 2, 2, 390, 391, 7, 39, 2, 2, 391, 112, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 114, 3, 2, 2, 2, 394, 395, 7, 62, 2, 2, 395, 116, 3, 2, 2, 2, 396, 397, 7, 64, 2, 2, 397, 398, 7, 63, 2, 2, 398, 118, 3, 2, 2, 2, 399, 400, 7, 62, 2, 2, 400, 401, 7, 63, 2, 2, 401, 120, 3, 2, 2, 2, 402, 403, 7, 35, 2, 2, 403, 404, 7, 63, 2, 2, 404, 122, 3, 2, 2, 2, 405, 406, 7, 63, 2, 2, 406, 407, 7, 63, 2, 2, 407, 124, 3, 2, 2, 2, 408, 409, 7, 63, 2, 2, 409, 126, 3, 2, 2, 2, 410, 411, 7, 42, 2, 2, 411, 128, 3, 2, 2, 2, 412, 413, 7, 43, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 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 427758cd2..a3529881a 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -62,11 +62,12 @@ EQ=61 ASGN=62 LPAREN=63 RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index 96e3056d4..a2ccaf0ee 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -86,11 +86,12 @@ export class QuintLexer extends Lexer { public static readonly ASGN = 62; public static readonly LPAREN = 63; public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; // tslint:disable:no-trailing-whitespace public static readonly channelNames: string[] = [ @@ -110,8 +111,8 @@ export class QuintLexer extends Lexer { "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -133,8 +134,8 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -167,7 +168,7 @@ export class QuintLexer extends Lexer { public get modeNames(): string[] { return QuintLexer.modeNames; } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02G\u01D9\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02H\u01EA\b\x01" + "\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" + @@ -178,209 +179,219 @@ export class QuintLexer extends Lexer { "+\t+\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x04" + "4\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04" + "=\t=\x04>\t>\x04?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x04D\tD\x04E\tE\x04" + - "F\tF\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03" + - "\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\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" + - ".\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x030\x030\x031\x03" + - "1\x031\x031\x031\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x03" + - "4\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x03:\x03:\x03" + - ";\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03>\x03>\x03?\x03?\x03" + - "@\x03@\x03A\x03A\x03B\x03B\x07B\u019F\nB\fB\x0EB\u01A2\vB\x03B\x03B\x06" + - "B\u01A6\nB\rB\x0EB\u01A7\x05B\u01AA\nB\x03C\x03C\x03C\x03C\x03C\x07C\u01B1" + - "\nC\fC\x0EC\u01B4\vC\x03C\x03C\x03D\x03D\x03D\x03D\x07D\u01BC\nD\fD\x0E" + - "D\u01BF\vD\x03D\x03D\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01C9\nE\fE\x0E" + - "E\u01CC\vE\x03E\x03E\x03E\x03E\x03E\x03F\x06F\u01D4\nF\rF\x0EF\u01D5\x03" + - "F\x03F\x06\u012E\u01B2\u01BD\u01CA\x02\x02G\x03\x02\x03\x05\x02\x04\x07" + - "\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15" + - "\x02\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02" + - "\x12#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191" + - "\x02\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02" + - "\"C\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-" + - "Y\x02.[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x02" + - "9q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02" + - "C\x85\x02D\x87\x02E\x89\x02F\x8B\x02G\x03\x02\t\x03\x023;\x03\x022;\x05" + - "\x022;CHch\x04\x02C\\c|\x06\x022;C\\aac|\x03\x02aa\x05\x02\v\f\x0F\x0F" + - "\"\"\x02\u01E7\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07" + - "\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03" + - "\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03" + - "\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03" + - "\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03" + - "\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02" + - "\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02" + - "-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02" + - "\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02" + - "\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03" + - "\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02" + - "\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02" + - "O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02" + - "\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02" + - "\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03" + - "\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02" + - "\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02" + - "q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02" + - "\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02" + - "\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02" + - "\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02" + - "\x02\x8B\x03\x02\x02\x02\x03\x8D\x03\x02\x02\x02\x05\x94\x03\x02\x02\x02" + - "\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" + - "\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" + - "\x02\x02\x02S\u013C\x03\x02\x02\x02U\u0154\x03\x02\x02\x02W\u0156\x03" + - "\x02\x02\x02Y\u015A\x03\x02\x02\x02[\u015D\x03\x02\x02\x02]\u0161\x03" + - "\x02\x02\x02_\u0169\x03\x02\x02\x02a\u016D\x03\x02\x02\x02c\u0172\x03" + - "\x02\x02\x02e\u0176\x03\x02\x02\x02g\u017C\x03\x02\x02\x02i\u017E\x03" + - "\x02\x02\x02k\u0180\x03\x02\x02\x02m\u0182\x03\x02\x02\x02o\u0184\x03" + - "\x02\x02\x02q\u0186\x03\x02\x02\x02s\u0188\x03\x02\x02\x02u\u018A\x03" + - "\x02\x02\x02w\u018D\x03\x02\x02\x02y\u0190\x03\x02\x02\x02{\u0193\x03" + - "\x02\x02\x02}\u0196\x03\x02\x02\x02\x7F\u0198\x03\x02\x02\x02\x81\u019A" + - "\x03\x02\x02\x02\x83\u01A9\x03\x02\x02\x02\x85\u01AB\x03\x02\x02\x02\x87" + - "\u01B7\x03\x02\x02\x02\x89\u01C4\x03\x02\x02\x02\x8B\u01D3\x03\x02\x02" + - "\x02\x8D\x8E\x07o\x02\x02\x8E\x8F\x07q\x02\x02\x8F\x90\x07f\x02\x02\x90" + - "\x91\x07w\x02\x02\x91\x92\x07n\x02\x02\x92\x93\x07g\x02\x02\x93\x04\x03" + - "\x02\x02\x02\x94\x95\x07}\x02\x02\x95\x06\x03\x02\x02\x02\x96\x97\x07" + - "\x7F\x02\x02\x97\b\x03\x02\x02\x02\x98\x99\x07e\x02\x02\x99\x9A\x07q\x02" + - "\x02\x9A\x9B\x07p\x02\x02\x9B\x9C\x07u\x02\x02\x9C\x9D\x07v\x02\x02\x9D" + - "\n\x03\x02\x02\x02\x9E\x9F\x07<\x02\x02\x9F\f\x03\x02\x02\x02\xA0\xA1" + - "\x07x\x02\x02\xA1\xA2\x07c\x02\x02\xA2\xA3\x07t\x02\x02\xA3\x0E\x03\x02" + - "\x02\x02\xA4\xA5\x07c\x02\x02\xA5\xA6\x07u\x02\x02\xA6\xA7\x07u\x02\x02" + - "\xA7\xA8\x07w\x02\x02\xA8\xA9\x07o\x02\x02\xA9\xAA\x07g\x02\x02\xAA\x10" + - "\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\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" + - "\u0116\x07c\x02\x02\u0116\u0117\x07p\x02\x02\u0117\u0118\x07{\x02\x02" + - "\u0118F\x03\x02\x02\x02\u0119\u011A\x07k\x02\x02\u011A\u011B\x07h\x02" + - "\x02\u011BH\x03\x02\x02\x02\u011C\u011D\x07g\x02\x02\u011D\u011E\x07n" + - "\x02\x02\u011E\u011F\x07u\x02\x02\u011F\u0120\x07g\x02\x02\u0120J\x03" + - "\x02\x02\x02\u0121\u0122\x07a\x02\x02\u0122L\x03\x02\x02\x02\u0123\u0124" + - "\x070\x02\x02\u0124\u0125\x070\x02\x02\u0125\u0126\x070\x02\x02\u0126" + - "N\x03\x02\x02\x02\u0127\u0128\x07<\x02\x02\u0128\u0129\x07<\x02\x02\u0129" + - "P\x03\x02\x02\x02\u012A\u012E\x07$\x02\x02\u012B\u012D\v\x02\x02\x02\u012C" + - "\u012B\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012F\x03\x02" + - "\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130" + - "\u012E\x03\x02\x02\x02\u0131\u0132\x07$\x02\x02\u0132R\x03\x02\x02\x02" + - "\u0133\u0134\x07h\x02\x02\u0134\u0135\x07c\x02\x02\u0135\u0136\x07n\x02" + - "\x02\u0136\u0137\x07u\x02\x02\u0137\u013D\x07g\x02\x02\u0138\u0139\x07" + - "v\x02\x02\u0139\u013A\x07t\x02\x02\u013A\u013B\x07w\x02\x02\u013B\u013D" + - "\x07g\x02\x02\u013C\u0133\x03\x02\x02\x02\u013C\u0138\x03\x02\x02\x02" + - "\u013DT\x03\x02\x02\x02\u013E\u0155\x072\x02\x02\u013F\u0145\t\x02\x02" + - "\x02\u0140\u0144\t\x03\x02\x02\u0141\u0142\x07a\x02\x02\u0142\u0144\t" + - "\x03\x02\x02\u0143\u0140\x03\x02\x02\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\u0155\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0148" + - "\u0149\x072\x02\x02\u0149\u014A\x07z\x02\x02\u014A\u014B\x03\x02\x02\x02" + - "\u014B\u0151\t\x04\x02\x02\u014C\u0150\t\x04\x02\x02\u014D\u014E\x07a" + - "\x02\x02\u014E\u0150\t\x04\x02\x02\u014F\u014C\x03\x02\x02\x02\u014F\u014D" + - "\x03\x02\x02\x02\u0150\u0153\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02" + - "\u0151\u0152\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03" + - "\x02\x02\x02\u0154\u013E\x03\x02\x02\x02\u0154\u013F\x03\x02\x02\x02\u0154" + - "\u0148\x03\x02\x02\x02\u0155V\x03\x02\x02\x02\u0156\u0157\x07c\x02\x02" + - "\u0157\u0158\x07p\x02\x02\u0158\u0159\x07f\x02\x02\u0159X\x03\x02\x02" + - "\x02\u015A\u015B\x07q\x02\x02\u015B\u015C\x07t\x02\x02\u015CZ\x03\x02" + - "\x02\x02\u015D\u015E\x07k\x02\x02\u015E\u015F\x07h\x02\x02\u015F\u0160" + - "\x07h\x02\x02\u0160\\\x03\x02\x02\x02\u0161\u0162\x07k\x02\x02\u0162\u0163" + - "\x07o\x02\x02\u0163\u0164\x07r\x02\x02\u0164\u0165\x07n\x02\x02\u0165" + - "\u0166\x07k\x02\x02\u0166\u0167\x07g\x02\x02\u0167\u0168\x07u\x02\x02" + - "\u0168^\x03\x02\x02\x02\u0169\u016A\x07U\x02\x02\u016A\u016B\x07g\x02" + - "\x02\u016B\u016C\x07v\x02\x02\u016C`\x03\x02\x02\x02\u016D\u016E\x07N" + - "\x02\x02\u016E\u016F\x07k\x02\x02\u016F\u0170\x07u\x02\x02\u0170\u0171" + - "\x07v\x02\x02\u0171b\x03\x02\x02\x02\u0172\u0173\x07O\x02\x02\u0173\u0174" + - "\x07c\x02\x02\u0174\u0175\x07r\x02\x02\u0175d\x03\x02\x02\x02\u0176\u0177" + - "\x07o\x02\x02\u0177\u0178\x07c\x02\x02\u0178\u0179\x07v\x02\x02\u0179" + - "\u017A\x07e\x02\x02\u017A\u017B\x07j\x02\x02\u017Bf\x03\x02\x02\x02\u017C" + - "\u017D\x07-\x02\x02\u017Dh\x03\x02\x02\x02\u017E\u017F\x07/\x02\x02\u017F" + - "j\x03\x02\x02\x02\u0180\u0181\x07,\x02\x02\u0181l\x03\x02\x02\x02\u0182" + - "\u0183\x071\x02\x02\u0183n\x03\x02\x02\x02\u0184\u0185\x07\'\x02\x02\u0185" + - "p\x03\x02\x02\x02\u0186\u0187\x07@\x02\x02\u0187r\x03\x02\x02\x02\u0188" + - "\u0189\x07>\x02\x02\u0189t\x03\x02\x02\x02\u018A\u018B\x07@\x02\x02\u018B" + - "\u018C\x07?\x02\x02\u018Cv\x03\x02\x02\x02\u018D\u018E\x07>\x02\x02\u018E" + - "\u018F\x07?\x02\x02\u018Fx\x03\x02\x02\x02\u0190\u0191\x07#\x02\x02\u0191" + - "\u0192\x07?\x02\x02\u0192z\x03\x02\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "\u0195\x07?\x02\x02\u0195|\x03\x02\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "~\x03\x02\x02\x02\u0198\u0199\x07*\x02\x02\u0199\x80\x03\x02\x02\x02\u019A" + - "\u019B\x07+\x02\x02\u019B\x82\x03\x02\x02\x02\u019C\u01A0\t\x05\x02\x02" + - "\u019D\u019F\t\x06\x02\x02\u019E\u019D\x03\x02\x02\x02\u019F\u01A2\x03" + - "\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A0\u01A1\x03\x02\x02\x02\u01A1" + - "\u01AA\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A3\u01A5\t\x07\x02" + - "\x02\u01A4\u01A6\t\x06\x02\x02\u01A5\u01A4\x03\x02\x02\x02\u01A6\u01A7" + - "\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02" + - "\u01A8\u01AA\x03\x02\x02\x02\u01A9\u019C\x03\x02\x02\x02\u01A9\u01A3\x03" + - "\x02\x02\x02\u01AA\x84\x03\x02\x02\x02\u01AB\u01AC\x071\x02\x02\u01AC" + - "\u01AD\x071\x02\x02\u01AD\u01AE\x071\x02\x02\u01AE\u01B2\x03\x02\x02\x02" + - "\u01AF\u01B1\v\x02\x02\x02\u01B0\u01AF\x03\x02\x02\x02\u01B1\u01B4\x03" + - "\x02\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B2\u01B0\x03\x02\x02\x02\u01B3" + - "\u01B5\x03\x02\x02\x02\u01B4\u01B2\x03\x02\x02\x02\u01B5\u01B6\x07\f\x02" + - "\x02\u01B6\x86\x03\x02\x02\x02\u01B7\u01B8\x071\x02\x02\u01B8\u01B9\x07" + - "1\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA\u01BC\v\x02\x02\x02\u01BB" + - "\u01BA\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BE\x03\x02" + - "\x02\x02\u01BD\u01BB\x03\x02\x02\x02\u01BE\u01C0\x03\x02\x02\x02\u01BF" + - "\u01BD\x03\x02\x02\x02\u01C0\u01C1\x07\f\x02\x02\u01C1\u01C2\x03\x02\x02" + - "\x02\u01C2\u01C3\bD\x02\x02\u01C3\x88\x03\x02\x02\x02\u01C4\u01C5\x07" + - "1\x02\x02\u01C5\u01C6\x07,\x02\x02\u01C6\u01CA\x03\x02\x02\x02\u01C7\u01C9" + - "\v\x02\x02\x02\u01C8\u01C7\x03\x02\x02\x02\u01C9\u01CC\x03\x02\x02\x02" + - "\u01CA\u01CB\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB\u01CD\x03" + - "\x02\x02\x02\u01CC\u01CA\x03\x02\x02\x02\u01CD\u01CE\x07,\x02\x02\u01CE" + - "\u01CF\x071\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0\u01D1\bE\x02\x02" + - "\u01D1\x8A\x03\x02\x02\x02\u01D2\u01D4\t\b\x02\x02\u01D3\u01D2\x03\x02" + - "\x02\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D3\x03\x02\x02\x02\u01D5" + - "\u01D6\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\bF\x02" + - "\x02\u01D8\x8C\x03\x02\x02\x02\x11\x02\u012E\u013C\u0143\u0145\u014F\u0151" + - "\u0154\u01A0\u01A7\u01A9\u01B2\u01BD\u01CA\u01D5\x03\b\x02\x02"; + "F\tF\x04G\tG\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x03\x03\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\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)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03*\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03+\x03+\x07" + + "+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0152" + + "\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-" + + "\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x03" + + "0\x030\x030\x031\x031\x031\x031\x031\x032\x032\x032\x032\x033\x033\x03" + + "3\x033\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + + "9\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03" + + ">\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x07B\u01A1\nB\fB\x0EB\u01A4" + + "\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\nB\x03C\x03C\x07" + + "C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC\x0EC\u01B8\x05" + + "C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0ED\u01C5\vD\x03" + + "D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\vE\x03E\x03E\x03" + + "E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD\vF\x03F\x03F\x03" + + "F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03G\x06\u0130\u01C3" + + "\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v" + + "\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19" + + "\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14" + + "\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02\x1A3\x02\x1B5\x02" + + "\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C\x02#E\x02$G\x02%I" + + "\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02.[\x02/]\x020_\x02" + + "1a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02D\x87\x02E\x89\x02" + + "F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05\x022;CHch\x03\x02" + + "c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f\x0F\x0F\"\"\x02\u01FB" + + "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" + + "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" + + "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + + "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + + "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + + "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + + "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + + "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + + "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" + + "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" + + "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" + + "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" + + "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" + + "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" + + "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" + + "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" + + "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" + + "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" + + "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" + + "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" + + "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" + + "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02\x02\x02\x05\x96\x03" + + "\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02\x02\x02\v\xA0\x03\x02" + + "\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02\x02\x11\xAD\x03\x02" + + "\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02\x02\x17\xB6\x03\x02" + + "\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02" + + "\x02\x02\x1F\xC7\x03\x02\x02\x02!\xCC\x03\x02\x02\x02#\xD3\x03\x02\x02" + + "\x02%\xD7\x03\x02\x02\x02\'\xE0\x03\x02\x02\x02)\xE7\x03\x02\x02\x02+" + + "\xE9\x03\x02\x02\x02-\xEE\x03\x02\x02\x02/\xF1\x03\x02\x02\x021\xF8\x03" + + "\x02\x02\x023\xFB\x03\x02\x02\x025\xFE\x03\x02\x02\x027\u0100\x03\x02" + + "\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010A\x03\x02" + + "\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02C\u0113\x03\x02" + + "\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02I\u011E\x03\x02" + + "\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02O\u0129\x03\x02" + + "\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02U\u0156\x03\x02" + + "\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02[\u015F\x03\x02" + + "\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02a\u016F\x03\x02" + + "\x02\x02c\u0174\x03\x02\x02\x02e\u0178\x03\x02\x02\x02g\u017E\x03\x02" + + "\x02\x02i\u0180\x03\x02\x02\x02k\u0182\x03\x02\x02\x02m\u0184\x03\x02" + + "\x02\x02o\u0186\x03\x02\x02\x02q\u0188\x03\x02\x02\x02s\u018A\x03\x02" + + "\x02\x02u\u018C\x03\x02\x02\x02w\u018F\x03\x02\x02\x02y\u0192\x03\x02" + + "\x02\x02{\u0195\x03\x02\x02\x02}\u0198\x03\x02\x02\x02\x7F\u019A\x03\x02" + + "\x02\x02\x81\u019C\x03\x02\x02\x02\x83\u01AB\x03\x02\x02\x02\x85\u01BA" + + "\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8\x03\x02\x02\x02\x8B" + + "\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F\x90\x07o\x02\x02" + + "\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07w\x02\x02\x93\x94" + + "\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02\x02\x96\x97\x07" + + "}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02\x02\x99\b\x03\x02" + + "\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C\x9D\x07p\x02\x02" + + "\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03\x02\x02\x02\xA0\xA1" + + "\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02\x02\xA3\xA4\x07c" + + "\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02\xA6\xA7\x07c\x02" + + "\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA\x07w\x02\x02\xAA" + + "\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02\x02\x02\xAD\xAE" + + "\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02\x02\xB0\x14\x03" + + "\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02\xB3\xB4\x07r\x02" + + "\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6\xB7\x07~\x02\x02" + + "\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07q\x02\x02\xBA" + + "\xBB\x07p\x02\x02\xBB\xBC\x07f\x02\x02\xBC\xBD\x07g\x02\x02\xBD\xBE\x07" + + "v\x02\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07x\x02\x02\xC0\xC1\x07c\x02" + + "\x02\xC1\xC2\x07n\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07f\x02\x02" + + "\xC4\xC5\x07g\x02\x02\xC5\xC6\x07h\x02\x02\xC6\x1E\x03\x02\x02\x02\xC7" + + "\xC8\x07r\x02\x02\xC8\xC9\x07w\x02\x02\xC9\xCA\x07t\x02\x02\xCA\xCB\x07" + + "g\x02\x02\xCB \x03\x02\x02\x02\xCC\xCD\x07c\x02\x02\xCD\xCE\x07e\x02\x02" + + "\xCE\xCF\x07v\x02\x02\xCF\xD0\x07k\x02\x02\xD0\xD1\x07q\x02\x02\xD1\xD2" + + "\x07p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07t\x02\x02\xD4\xD5\x07w" + + "\x02\x02\xD5\xD6\x07p\x02\x02\xD6$\x03\x02\x02\x02\xD7\xD8\x07v\x02\x02" + + "\xD8\xD9\x07g\x02\x02\xD9\xDA\x07o\x02\x02\xDA\xDB\x07r\x02\x02\xDB\xDC" + + "\x07q\x02\x02\xDC\xDD\x07t\x02\x02\xDD\xDE\x07c\x02\x02\xDE\xDF\x07n\x02" + + "\x02\xDF&\x03\x02\x02\x02\xE0\xE1\x07k\x02\x02\xE1\xE2\x07o\x02\x02\xE2" + + "\xE3\x07r\x02\x02\xE3\xE4\x07q\x02\x02\xE4\xE5\x07t\x02\x02\xE5\xE6\x07" + + "v\x02\x02\xE6(\x03\x02\x02\x02\xE7\xE8\x070\x02\x02\xE8*\x03\x02\x02\x02" + + "\xE9\xEA\x07h\x02\x02\xEA\xEB\x07t\x02\x02\xEB\xEC\x07q\x02\x02\xEC\xED" + + "\x07o\x02\x02\xED,\x03\x02\x02\x02\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02" + + "\x02\xF0.\x03\x02\x02\x02\xF1\xF2\x07g\x02\x02\xF2\xF3\x07z\x02\x02\xF3" + + "\xF4\x07r\x02\x02\xF4\xF5\x07q\x02\x02\xF5\xF6\x07t\x02\x02\xF6\xF7\x07" + + "v\x02\x02\xF70\x03\x02\x02\x02\xF8\xF9\x07/\x02\x02\xF9\xFA\x07@\x02\x02" + + "\xFA2\x03\x02\x02\x02\xFB\xFC\x07?\x02\x02\xFC\xFD\x07@\x02\x02\xFD4\x03" + + "\x02\x02\x02\xFE\xFF\x07]\x02\x02\xFF6\x03\x02\x02\x02\u0100\u0101\x07" + + "_\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02\x02\u0103\u0104" + + "\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + + "\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109\x07t\x02\x02\u0109" + + "<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C\x07q\x02\x02\u010C" + + "\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E>\x03\x02\x02\x02\u010F" + + "\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + + "B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07n\x02\x02\u0115" + + "\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117\u0118\x07c\x02\x02\u0118" + + "\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02\u011AF\x03\x02\x02\x02\u011B" + + "\u011C\x07k\x02\x02\u011C\u011D\x07h\x02\x02\u011DH\x03\x02\x02\x02\u011E" + + "\u011F\x07g\x02\x02\u011F\u0120\x07n\x02\x02\u0120\u0121\x07u\x02\x02" + + "\u0121\u0122\x07g\x02\x02\u0122J\x03\x02\x02\x02\u0123\u0124\x07a\x02" + + "\x02\u0124L\x03\x02\x02\x02\u0125\u0126\x070\x02\x02\u0126\u0127\x070" + + "\x02\x02\u0127\u0128\x070\x02\x02\u0128N\x03\x02\x02\x02\u0129\u012A\x07" + + "<\x02\x02\u012A\u012B\x07<\x02\x02\u012BP\x03\x02\x02\x02\u012C\u0130" + + "\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E\u012D\x03\x02\x02\x02\u012F" + + "\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02\x02\x02\u0130\u012E\x03\x02" + + "\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132\u0130\x03\x02\x02\x02\u0133" + + "\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02\u0135\u0136\x07h\x02\x02\u0136" + + "\u0137\x07c\x02\x02\u0137\u0138\x07n\x02\x02\u0138\u0139\x07u\x02\x02" + + "\u0139\u013F\x07g\x02\x02\u013A\u013B\x07v\x02\x02\u013B\u013C\x07t\x02" + + "\x02\u013C\u013D\x07w\x02\x02\u013D\u013F\x07g\x02\x02\u013E\u0135\x03" + + "\x02\x02\x02\u013E\u013A\x03\x02\x02\x02\u013FT\x03\x02\x02\x02\u0140" + + "\u0157\x072\x02\x02\u0141\u0147\t\x02\x02\x02\u0142\u0146\t\x03\x02\x02" + + "\u0143\u0144\x07a\x02\x02\u0144\u0146\t\x03\x02\x02\u0145\u0142\x03\x02" + + "\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147" + + "\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0157\x03\x02" + + "\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A\u014B\x072\x02\x02\u014B\u014C" + + "\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u0153\t\x04\x02\x02\u014E" + + "\u0152\t\x04\x02\x02\u014F\u0150\x07a\x02\x02\u0150\u0152\t\x04\x02\x02" + + "\u0151\u014E\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02\u0152\u0155\x03" + + "\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02\x02\u0154" + + "\u0157\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02\u0156\u0140\x03\x02" + + "\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156\u014A\x03\x02\x02\x02\u0157" + + "V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02\u0159\u015A\x07p\x02\x02\u015A" + + "\u015B\x07f\x02\x02\u015BX\x03\x02\x02\x02\u015C\u015D\x07q\x02\x02\u015D" + + "\u015E\x07t\x02\x02\u015EZ\x03\x02\x02\x02\u015F\u0160\x07k\x02\x02\u0160" + + "\u0161\x07h\x02\x02\u0161\u0162\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163" + + "\u0164\x07k\x02\x02\u0164\u0165\x07o\x02\x02\u0165\u0166\x07r\x02\x02" + + "\u0166\u0167\x07n\x02\x02\u0167\u0168\x07k\x02\x02\u0168\u0169\x07g\x02" + + "\x02\u0169\u016A\x07u\x02\x02\u016A^\x03\x02\x02\x02\u016B\u016C\x07U" + + "\x02\x02\u016C\u016D\x07g\x02\x02\u016D\u016E\x07v\x02\x02\u016E`\x03" + + "\x02\x02\x02\u016F\u0170\x07N\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172" + + "\x07u\x02\x02\u0172\u0173\x07v\x02\x02\u0173b\x03\x02\x02\x02\u0174\u0175" + + "\x07O\x02\x02\u0175\u0176\x07c\x02\x02\u0176\u0177\x07r\x02\x02\u0177" + + "d\x03\x02\x02\x02\u0178\u0179\x07o\x02\x02\u0179\u017A\x07c\x02\x02\u017A" + + "\u017B\x07v\x02\x02\u017B\u017C\x07e\x02\x02\u017C\u017D\x07j\x02\x02" + + "\u017Df\x03\x02\x02\x02\u017E\u017F\x07-\x02\x02\u017Fh\x03\x02\x02\x02" + + "\u0180\u0181\x07/\x02\x02\u0181j\x03\x02\x02\x02\u0182\u0183\x07,\x02" + + "\x02\u0183l\x03\x02\x02\x02\u0184\u0185\x071\x02\x02\u0185n\x03\x02\x02" + + "\x02\u0186\u0187\x07\'\x02\x02\u0187p\x03\x02\x02\x02\u0188\u0189\x07" + + "@\x02\x02\u0189r\x03\x02\x02\x02\u018A\u018B\x07>\x02\x02\u018Bt\x03\x02" + + "\x02\x02\u018C\u018D\x07@\x02\x02\u018D\u018E\x07?\x02\x02\u018Ev\x03" + + "\x02\x02\x02\u018F\u0190\x07>\x02\x02\u0190\u0191\x07?\x02\x02\u0191x" + + "\x03\x02\x02\x02\u0192\u0193\x07#\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + + "z\x03\x02\x02\x02\u0195\u0196\x07?\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + + "|\x03\x02\x02\x02\u0198\u0199\x07?\x02\x02\u0199~\x03\x02\x02\x02\u019A" + + "\u019B\x07*\x02\x02\u019B\x80\x03\x02\x02\x02\u019C\u019D\x07+\x02\x02" + + "\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t\x05\x02\x02\u019F\u01A1\t\x06" + + "\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2" + + "\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01AC\x03\x02" + + "\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A7\t\x07\x02\x02\u01A6\u01A8" + + "\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02" + + "\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03" + + "\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02\u01AC" + + "\x84\x03\x02\x02\x02\u01AD\u01B1\t\b\x02\x02\u01AE\u01B0\t\x06\x02\x02" + + "\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03\x02\x02\x02\u01B1\u01AF\x03" + + "\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2\u01BB\x03\x02\x02\x02\u01B3" + + "\u01B1\x03\x02\x02\x02\u01B4\u01B6\t\x07\x02\x02\u01B5\u01B7\t\x06\x02" + + "\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02\u01B8\u01B6" + + "\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BB\x03\x02\x02\x02" + + "\u01BA\u01AD\x03\x02\x02\x02\u01BA\u01B4\x03\x02\x02\x02\u01BB\x86\x03" + + "\x02\x02\x02\u01BC\u01BD\x071\x02\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF" + + "\x071\x02\x02\u01BF\u01C3\x03\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1" + + "\u01C0\x03\x02\x02\x02\u01C2\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02" + + "\x02\x02\u01C3\u01C1\x03\x02\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5" + + "\u01C3\x03\x02\x02\x02\u01C6\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02" + + "\x02\u01C8\u01C9\x071\x02\x02\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03" + + "\x02\x02\x02\u01CB\u01CD\v\x02\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD" + + "\u01D0\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02" + + "\x02\x02\u01CF\u01D1\x03\x02\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1" + + "\u01D2\x07\f\x02\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02" + + "\u01D4\x8A\x03\x02\x02\x02\u01D5\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02" + + "\x02\u01D7\u01DB\x03\x02\x02\x02\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8" + + "\x03\x02\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02" + + "\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03" + + "\x02\x02\x02\u01DE\u01DF\x07,\x02\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1" + + "\x03\x02\x02\x02\u01E1\u01E2\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3" + + "\u01E5\t\t\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02" + + "\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8" + + "\x03\x02\x02\x02\u01E8\u01E9\bG\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14" + + "\x02\u0130\u013E\u0145\u0147\u0151\u0153\u0156\u01A2\u01A9\u01AB\u01B1" + + "\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index d8e439e57..b687aeefd 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -18,7 +18,8 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; @@ -99,6 +100,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -224,17 +226,30 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeConstOrVar` + * Enter a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + enterTypeVar?: (ctx: TypeVarContext) => void; /** - * Exit a parse tree produced by the `typeConstOrVar` + * Exit a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + exitTypeVar?: (ctx: TypeVarContext) => void; + + /** + * Enter a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeConst?: (ctx: TypeConstContext) => void; + /** + * Exit a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeConst?: (ctx: TypeConstContext) => void; /** * Enter a parse tree produced by the `typeParen` @@ -1199,5 +1214,16 @@ export interface QuintListener extends ParseTreeListener { * @param ctx the parse tree */ exitSimpleId?: (ctx: SimpleIdContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + enterIdentifier?: (ctx: IdentifierContext) => void; + /** + * Exit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + exitIdentifier?: (ctx: IdentifierContext) => void; } diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 9dc9dc78c..8a95eddc0 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -98,11 +98,12 @@ export class QuintParser extends Parser { public static readonly ASGN = 62; public static readonly LPAREN = 63; public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; public static readonly RULE_modules = 0; public static readonly RULE_module = 1; public static readonly RULE_documentedDeclaration = 2; @@ -141,6 +142,7 @@ export class QuintParser extends Parser { public static readonly RULE_literal = 35; public static readonly RULE_qualId = 36; public static readonly RULE_simpleId = 37; + public static readonly RULE_identifier = 38; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", @@ -149,7 +151,7 @@ export class QuintParser extends Parser { "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", + "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -171,8 +173,8 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -208,21 +210,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 77; + this.state = 79; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 76; + this.state = 78; this.module(); } } - this.state = 79; + this.state = 81; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 81; + this.state = 83; this.match(QuintParser.EOF); } } @@ -248,41 +250,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 86; + this.state = 88; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 83; + this.state = 85; this.match(QuintParser.DOCCOMMENT); } } - this.state = 88; + this.state = 90; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 89; + this.state = 91; this.match(QuintParser.T__0); - this.state = 90; + this.state = 92; this.qualId(); - this.state = 91; + this.state = 93; this.match(QuintParser.T__1); - this.state = 95; + this.state = 97; 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__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 = 92; + this.state = 94; this.documentedDeclaration(); } } - this.state = 97; + this.state = 99; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 98; + this.state = 100; this.match(QuintParser.T__2); } } @@ -308,21 +310,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 103; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 100; + this.state = 102; this.match(QuintParser.DOCCOMMENT); } } - this.state = 105; + this.state = 107; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 106; + this.state = 108; this.declaration(); } } @@ -345,20 +347,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 128; + this.state = 130; 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 = 108; + this.state = 110; this.match(QuintParser.T__3); - this.state = 109; + this.state = 111; this.qualId(); - this.state = 110; + this.state = 112; this.match(QuintParser.T__4); - this.state = 111; + this.state = 113; this.type(0); } break; @@ -367,13 +369,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 113; + this.state = 115; this.match(QuintParser.T__5); - this.state = 114; + this.state = 116; this.qualId(); - this.state = 115; + this.state = 117; this.match(QuintParser.T__4); - this.state = 116; + this.state = 118; this.type(0); } break; @@ -382,13 +384,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 118; + this.state = 120; this.match(QuintParser.T__6); - this.state = 119; + this.state = 121; this.identOrHole(); - this.state = 120; + this.state = 122; this.match(QuintParser.ASGN); - this.state = 121; + this.state = 123; this.expr(0); } break; @@ -397,7 +399,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 123; + this.state = 125; this.instanceMod(); } break; @@ -406,7 +408,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 124; + this.state = 126; this.operDef(); } break; @@ -415,7 +417,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 125; + this.state = 127; this.typeDef(); } break; @@ -424,7 +426,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 126; + this.state = 128; this.importMod(); } break; @@ -433,7 +435,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 127; + this.state = 129; this.exportMod(); } break; @@ -461,53 +463,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 130; + this.state = 132; this.qualifier(); - this.state = 131; + this.state = 133; this.normalCallName(); - this.state = 168; + this.state = 170; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 132; + this.state = 134; this.match(QuintParser.LPAREN); - this.state = 141; + this.state = 143; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__36 || _la === QuintParser.IDENTIFIER) { + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 133; + this.state = 135; this.parameter(); - this.state = 138; + this.state = 140; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 134; + this.state = 136; this.match(QuintParser.T__7); - this.state = 135; + this.state = 137; this.parameter(); } } - this.state = 140; + this.state = 142; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 143; + this.state = 145; this.match(QuintParser.RPAREN); - this.state = 146; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 144; + this.state = 146; this.match(QuintParser.T__4); - this.state = 145; + this.state = 147; this.type(0); } } @@ -517,72 +519,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 148; + this.state = 150; this.match(QuintParser.T__4); - this.state = 149; + this.state = 151; this.type(0); } break; case 3: { - this.state = 150; + this.state = 152; this.match(QuintParser.LPAREN); { - this.state = 151; + this.state = 153; this.parameter(); - this.state = 152; + this.state = 154; this.match(QuintParser.T__4); - this.state = 153; + this.state = 155; this.type(0); - this.state = 161; + this.state = 163; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 154; + this.state = 156; this.match(QuintParser.T__7); - this.state = 155; + this.state = 157; this.parameter(); - this.state = 156; + this.state = 158; this.match(QuintParser.T__4); - this.state = 157; + this.state = 159; this.type(0); } } - this.state = 163; + this.state = 165; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 164; + this.state = 166; this.match(QuintParser.RPAREN); - this.state = 165; + this.state = 167; this.match(QuintParser.T__4); - this.state = 166; + this.state = 168; this.type(0); } break; } - this.state = 172; + this.state = 174; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 170; + this.state = 172; this.match(QuintParser.ASGN); - this.state = 171; + this.state = 173; this.expr(0); } } - this.state = 175; + this.state = 177; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 174; + this.state = 176; this.match(QuintParser.T__8); } } @@ -609,16 +611,16 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); let _la: number; try { - this.state = 198; + this.state = 200; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 177; + this.state = 179; this.match(QuintParser.T__9); - this.state = 178; + this.state = 180; this.qualId(); } break; @@ -627,13 +629,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 179; + this.state = 181; this.match(QuintParser.T__9); - this.state = 180; + this.state = 182; this.qualId(); - this.state = 181; + this.state = 183; this.match(QuintParser.ASGN); - this.state = 182; + this.state = 184; this.type(0); } break; @@ -642,37 +644,37 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 184; + this.state = 186; this.match(QuintParser.T__9); - this.state = 185; + this.state = 187; (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 186; - this.match(QuintParser.ASGN); this.state = 188; + this.match(QuintParser.ASGN); + this.state = 190; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 187; + this.state = 189; this.match(QuintParser.T__10); } } - this.state = 190; + this.state = 192; this.typeSumVariant(); - this.state = 195; + this.state = 197; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__10) { { { - this.state = 191; + this.state = 193; this.match(QuintParser.T__10); - this.state = 192; + this.state = 194; this.typeSumVariant(); } } - this.state = 197; + this.state = 199; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -702,18 +704,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 200; + this.state = 202; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 205; + this.state = 207; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 201; + this.state = 203; this.match(QuintParser.LPAREN); - this.state = 202; + this.state = 204; this.type(0); - this.state = 203; + this.state = 205; this.match(QuintParser.RPAREN); } } @@ -742,32 +744,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 207; + this.state = 209; this.match(QuintParser.T__11); - this.state = 208; + this.state = 210; this.qualId(); - this.state = 211; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 209; + this.state = 211; this.match(QuintParser.T__4); - this.state = 210; + this.state = 212; this.type(0); } } - this.state = 213; + this.state = 215; this.match(QuintParser.ASGN); - this.state = 214; - this.expr(0); this.state = 216; + this.expr(0); + this.state = 218; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 215; + this.state = 217; this.match(QuintParser.T__8); } } @@ -793,13 +795,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); try { - this.state = 227; + this.state = 229; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 218; + this.state = 220; this.match(QuintParser.T__12); } break; @@ -807,7 +809,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 219; + this.state = 221; this.match(QuintParser.T__13); } break; @@ -815,9 +817,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 220; + this.state = 222; this.match(QuintParser.T__14); - this.state = 221; + this.state = 223; this.match(QuintParser.T__12); } break; @@ -825,9 +827,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 222; + this.state = 224; this.match(QuintParser.T__14); - this.state = 223; + this.state = 225; this.match(QuintParser.T__13); } break; @@ -835,7 +837,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 224; + this.state = 226; this.match(QuintParser.T__15); } break; @@ -843,7 +845,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 225; + this.state = 227; this.match(QuintParser.T__16); } break; @@ -851,7 +853,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 226; + this.state = 228; this.match(QuintParser.T__17); } break; @@ -877,28 +879,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 18, QuintParser.RULE_importMod); let _la: number; try { - this.state = 247; + this.state = 249; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 229; + this.state = 231; this.match(QuintParser.T__18); - this.state = 230; + this.state = 232; this.name(); - this.state = 231; + this.state = 233; this.match(QuintParser.T__19); - this.state = 232; + this.state = 234; this.identOrStar(); - this.state = 235; + this.state = 237; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 233; + this.state = 235; this.match(QuintParser.T__20); - this.state = 234; + this.state = 236; this.fromSource(); } } @@ -909,30 +911,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 237; + this.state = 239; this.match(QuintParser.T__18); - this.state = 238; + this.state = 240; this.name(); - this.state = 241; + this.state = 243; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 239; + this.state = 241; this.match(QuintParser.T__21); - this.state = 240; + this.state = 242; this.name(); } } - this.state = 245; + this.state = 247; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 243; + this.state = 245; this.match(QuintParser.T__20); - this.state = 244; + this.state = 246; this.fromSource(); } } @@ -961,19 +963,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 260; + this.state = 262; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 249; + this.state = 251; this.match(QuintParser.T__22); - this.state = 250; + this.state = 252; this.name(); - this.state = 251; + this.state = 253; this.match(QuintParser.T__19); - this.state = 252; + this.state = 254; this.identOrStar(); } break; @@ -981,18 +983,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 254; + this.state = 256; this.match(QuintParser.T__22); - this.state = 255; + this.state = 257; this.name(); - this.state = 258; + this.state = 260; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 256; + this.state = 258; this.match(QuintParser.T__21); - this.state = 257; + this.state = 259; this.name(); } } @@ -1021,60 +1023,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 308; + this.state = 310; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 262; + this.state = 264; this.match(QuintParser.T__18); - this.state = 263; + this.state = 265; this.moduleName(); - this.state = 264; + this.state = 266; this.match(QuintParser.LPAREN); { - this.state = 265; + this.state = 267; this.name(); - this.state = 266; + this.state = 268; this.match(QuintParser.ASGN); - this.state = 267; + this.state = 269; this.expr(0); - this.state = 275; + this.state = 277; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 268; + this.state = 270; this.match(QuintParser.T__7); - this.state = 269; + this.state = 271; this.name(); - this.state = 270; + this.state = 272; this.match(QuintParser.ASGN); - this.state = 271; + this.state = 273; this.expr(0); } } - this.state = 277; + this.state = 279; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 278; + this.state = 280; this.match(QuintParser.RPAREN); - this.state = 279; + this.state = 281; this.match(QuintParser.T__19); - this.state = 280; + this.state = 282; this.match(QuintParser.MUL); - this.state = 283; + this.state = 285; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 281; + this.state = 283; this.match(QuintParser.T__20); - this.state = 282; + this.state = 284; this.fromSource(); } } @@ -1085,54 +1087,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 285; + this.state = 287; this.match(QuintParser.T__18); - this.state = 286; + this.state = 288; this.moduleName(); - this.state = 287; + this.state = 289; this.match(QuintParser.LPAREN); { - this.state = 288; + this.state = 290; this.name(); - this.state = 289; + this.state = 291; this.match(QuintParser.ASGN); - this.state = 290; + this.state = 292; this.expr(0); - this.state = 298; + this.state = 300; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 291; + this.state = 293; this.match(QuintParser.T__7); - this.state = 292; + this.state = 294; this.name(); - this.state = 293; + this.state = 295; this.match(QuintParser.ASGN); - this.state = 294; + this.state = 296; this.expr(0); } } - this.state = 300; + this.state = 302; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 301; + this.state = 303; this.match(QuintParser.RPAREN); - this.state = 302; + this.state = 304; this.match(QuintParser.T__21); - this.state = 303; + this.state = 305; this.qualifiedName(); - this.state = 306; + this.state = 308; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 304; + this.state = 306; this.match(QuintParser.T__20); - this.state = 305; + this.state = 307; this.fromSource(); } } @@ -1162,7 +1164,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 310; + this.state = 312; this.qualId(); } } @@ -1187,7 +1189,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 314; this.qualId(); } } @@ -1212,7 +1214,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 316; this.qualId(); } } @@ -1237,7 +1239,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 318; this.match(QuintParser.STRING); } } @@ -1275,7 +1277,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 374; + this.state = 377; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { case 1: @@ -1284,52 +1286,52 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 319; + this.state = 321; this.match(QuintParser.LPAREN); - this.state = 328; + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__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.LOW_ID - 47)) | (1 << (QuintParser.CAP_ID - 47)))) !== 0)) { { - this.state = 320; + this.state = 322; this.type(0); - this.state = 325; + this.state = 327; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 321; + this.state = 323; this.match(QuintParser.T__7); - this.state = 322; + this.state = 324; this.type(0); } } } - this.state = 327; + this.state = 329; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); } } } - this.state = 331; + this.state = 333; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 330; + this.state = 332; this.match(QuintParser.T__7); } } - this.state = 333; + this.state = 335; this.match(QuintParser.RPAREN); - this.state = 334; + this.state = 336; this.match(QuintParser.T__24); - this.state = 335; - this.type(10); + this.state = 337; + this.type(11); } break; @@ -1338,13 +1340,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 336; + this.state = 338; this.match(QuintParser.SET); - this.state = 337; + this.state = 339; this.match(QuintParser.T__25); - this.state = 338; + this.state = 340; this.type(0); - this.state = 339; + this.state = 341; this.match(QuintParser.T__26); } break; @@ -1354,13 +1356,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 341; + this.state = 343; this.match(QuintParser.LIST); - this.state = 342; + this.state = 344; this.match(QuintParser.T__25); - this.state = 343; + this.state = 345; this.type(0); - this.state = 344; + this.state = 346; this.match(QuintParser.T__26); } break; @@ -1370,43 +1372,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 346; + this.state = 348; this.match(QuintParser.LPAREN); - this.state = 347; + this.state = 349; this.type(0); - this.state = 348; + this.state = 350; this.match(QuintParser.T__7); - this.state = 349; + this.state = 351; this.type(0); - this.state = 354; + this.state = 356; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 350; + this.state = 352; this.match(QuintParser.T__7); - this.state = 351; + this.state = 353; this.type(0); } } } - this.state = 356; + this.state = 358; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } - this.state = 358; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 357; + this.state = 359; this.match(QuintParser.T__7); } } - this.state = 360; + this.state = 362; this.match(QuintParser.RPAREN); } break; @@ -1416,11 +1418,11 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 362; + this.state = 364; this.match(QuintParser.T__1); - this.state = 363; + this.state = 365; this.row(); - this.state = 364; + this.state = 366; this.match(QuintParser.T__2); } break; @@ -1430,7 +1432,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 366; + this.state = 368; this.match(QuintParser.T__27); } break; @@ -1440,7 +1442,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 367; + this.state = 369; this.match(QuintParser.T__28); } break; @@ -1450,37 +1452,47 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 370; this.match(QuintParser.T__29); } break; case 9: { - _localctx = new TypeConstOrVarContext(_localctx); + _localctx = new TypeVarContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; - this.qualId(); + this.state = 371; + this.match(QuintParser.LOW_ID); } break; case 10: + { + _localctx = new TypeConstContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 372; + this.qualId(); + } + break; + + case 11: { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 373; this.match(QuintParser.LPAREN); - this.state = 371; + this.state = 374; this.type(0); - this.state = 372; + this.state = 375; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 384; + this.state = 387; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1490,21 +1502,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 382; + this.state = 385; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 376; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 379; + if (!(this.precpred(this._ctx, 13))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 377; + this.state = 380; this.match(QuintParser.T__23); - this.state = 378; - this.type(12); + this.state = 381; + this.type(13); } break; @@ -1512,20 +1524,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; - if (!(this.precpred(this._ctx, 11))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 11)"); + this.state = 382; + if (!(this.precpred(this._ctx, 12))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } - this.state = 380; + this.state = 383; this.match(QuintParser.T__24); - this.state = 381; - this.type(11); + this.state = 384; + this.type(12); } break; } } } - this.state = 386; + this.state = 389; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); } @@ -1552,64 +1564,65 @@ export class QuintParser extends Parser { let _la: number; try { let _alt: number; - this.state = 410; + this.state = 413; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__2: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 394; + this.state = 397; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 387; + this.state = 390; this.rowLabel(); - this.state = 388; + this.state = 391; this.match(QuintParser.T__4); - this.state = 389; + this.state = 392; this.type(0); - this.state = 390; + this.state = 393; this.match(QuintParser.T__7); } } } - this.state = 396; + this.state = 399; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 406; + this.state = 409; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.IDENTIFIER) { + if (_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { { - this.state = 397; + this.state = 400; this.rowLabel(); - this.state = 398; + this.state = 401; this.match(QuintParser.T__4); - this.state = 399; + this.state = 402; this.type(0); } - this.state = 404; + this.state = 407; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 401; + this.state = 404; this.match(QuintParser.T__7); } break; case QuintParser.T__10: { - this.state = 402; + this.state = 405; this.match(QuintParser.T__10); { - this.state = 403; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); + this.state = 406; + _localctx._rowVar = this.identifier(); } } break; @@ -1626,11 +1639,11 @@ export class QuintParser extends Parser { case QuintParser.T__10: this.enterOuterAlt(_localctx, 2); { - this.state = 408; + this.state = 411; this.match(QuintParser.T__10); { - this.state = 409; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); + this.state = 412; + _localctx._rowVar = this.identifier(); } } break; @@ -1659,7 +1672,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 412; + this.state = 415; this.simpleId("record"); } } @@ -1697,7 +1710,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 564; + this.state = 567; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { case 1: @@ -1706,7 +1719,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 415; + this.state = 418; this.lambda(); } break; @@ -1716,21 +1729,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 416; + this.state = 419; this.normalCallName(); - this.state = 417; + this.state = 420; this.match(QuintParser.LPAREN); - this.state = 419; + this.state = 422; 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__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.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 418; + this.state = 421; this.argList(); } } - this.state = 421; + this.state = 424; this.match(QuintParser.RPAREN); } break; @@ -1740,9 +1753,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 423; + this.state = 426; this.match(QuintParser.MINUS); - this.state = 424; + this.state = 427; this.expr(25); } break; @@ -1752,13 +1765,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 425; + this.state = 428; this.qualId(); - this.state = 426; + this.state = 429; this.match(QuintParser.T__31); - this.state = 427; + this.state = 430; this.match(QuintParser.ASGN); - this.state = 428; + this.state = 431; this.expr(21); } break; @@ -1768,41 +1781,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 430; + this.state = 433; this.match(QuintParser.AND); - this.state = 431; + this.state = 434; this.match(QuintParser.T__1); - this.state = 432; + this.state = 435; this.expr(0); - this.state = 437; + this.state = 440; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 433; + this.state = 436; this.match(QuintParser.T__7); - this.state = 434; + this.state = 437; this.expr(0); } } } - this.state = 439; + this.state = 442; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } - this.state = 441; + this.state = 444; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 440; + this.state = 443; this.match(QuintParser.T__7); } } - this.state = 443; + this.state = 446; this.match(QuintParser.T__2); } break; @@ -1812,41 +1825,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 445; + this.state = 448; this.match(QuintParser.OR); - this.state = 446; + this.state = 449; this.match(QuintParser.T__1); - this.state = 447; + this.state = 450; this.expr(0); - this.state = 452; + this.state = 455; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 448; + this.state = 451; this.match(QuintParser.T__7); - this.state = 449; + this.state = 452; this.expr(0); } } } - this.state = 454; + this.state = 457; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 456; + this.state = 459; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 455; + this.state = 458; this.match(QuintParser.T__7); } } - this.state = 458; + this.state = 461; this.match(QuintParser.T__2); } break; @@ -1856,7 +1869,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 460; + this.state = 463; this.matchSumExpr(); } break; @@ -1866,41 +1879,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 464; this.match(QuintParser.T__32); - this.state = 462; + this.state = 465; this.match(QuintParser.T__1); - this.state = 463; + this.state = 466; this.expr(0); - this.state = 468; + this.state = 471; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 464; + this.state = 467; this.match(QuintParser.T__7); - this.state = 465; + this.state = 468; this.expr(0); } } } - this.state = 470; + this.state = 473; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); } - this.state = 472; + this.state = 475; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 471; + this.state = 474; this.match(QuintParser.T__7); } } - this.state = 474; + this.state = 477; this.match(QuintParser.T__2); } break; @@ -1910,41 +1923,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 476; + this.state = 479; this.match(QuintParser.T__33); - this.state = 477; + this.state = 480; this.match(QuintParser.T__1); - this.state = 478; + this.state = 481; this.expr(0); - this.state = 483; + this.state = 486; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 479; + this.state = 482; this.match(QuintParser.T__7); - this.state = 480; + this.state = 483; this.expr(0); } } } - this.state = 485; + this.state = 488; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 487; + this.state = 490; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 486; + this.state = 489; this.match(QuintParser.T__7); } } - this.state = 489; + this.state = 492; this.match(QuintParser.T__2); } break; @@ -1954,30 +1967,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 495; + this.state = 498; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 491; + this.state = 494; this.qualId(); } break; case QuintParser.INT: { - this.state = 492; + this.state = 495; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 493; + this.state = 496; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 494; + this.state = 497; this.match(QuintParser.STRING); } break; @@ -1992,43 +2006,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 497; + this.state = 500; this.match(QuintParser.LPAREN); - this.state = 498; + this.state = 501; this.expr(0); - this.state = 499; + this.state = 502; this.match(QuintParser.T__7); - this.state = 500; + this.state = 503; this.expr(0); - this.state = 505; + this.state = 508; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 501; + this.state = 504; this.match(QuintParser.T__7); - this.state = 502; + this.state = 505; this.expr(0); } } } - this.state = 507; + this.state = 510; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 509; + this.state = 512; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 508; + this.state = 511; this.match(QuintParser.T__7); } } - this.state = 511; + this.state = 514; this.match(QuintParser.RPAREN); } break; @@ -2038,39 +2052,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 513; + this.state = 516; this.match(QuintParser.T__1); - this.state = 514; + this.state = 517; this.recElem(); - this.state = 519; + this.state = 522; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 515; + this.state = 518; this.match(QuintParser.T__7); - this.state = 516; + this.state = 519; this.recElem(); } } } - this.state = 521; + this.state = 524; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); } - this.state = 523; + this.state = 526; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 522; + this.state = 525; this.match(QuintParser.T__7); } } - this.state = 525; + this.state = 528; this.match(QuintParser.T__2); } break; @@ -2080,47 +2094,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 527; + this.state = 530; this.match(QuintParser.T__25); - this.state = 536; + this.state = 539; 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__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.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 528; + this.state = 531; this.expr(0); - this.state = 533; + this.state = 536; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 529; + this.state = 532; this.match(QuintParser.T__7); - this.state = 530; + this.state = 533; this.expr(0); } } } - this.state = 535; + this.state = 538; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); } } } - this.state = 539; + this.state = 542; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 538; + this.state = 541; this.match(QuintParser.T__7); } } - this.state = 541; + this.state = 544; this.match(QuintParser.T__26); } break; @@ -2130,19 +2144,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 542; + this.state = 545; this.match(QuintParser.T__34); - this.state = 543; + this.state = 546; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 547; this.expr(0); - this.state = 545; + this.state = 548; this.match(QuintParser.RPAREN); - this.state = 546; + this.state = 549; this.expr(0); - this.state = 547; + this.state = 550; this.match(QuintParser.T__35); - this.state = 548; + this.state = 551; this.expr(5); } break; @@ -2152,9 +2166,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 550; + this.state = 553; this.operDef(); - this.state = 551; + this.state = 554; this.expr(4); } break; @@ -2164,9 +2178,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; + this.state = 556; this.nondetOperDef(); - this.state = 554; + this.state = 557; this.expr(3); } break; @@ -2176,11 +2190,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 559; this.match(QuintParser.LPAREN); - this.state = 557; + this.state = 560; this.expr(0); - this.state = 558; + this.state = 561; this.match(QuintParser.RPAREN); } break; @@ -2190,17 +2204,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 560; + this.state = 563; this.match(QuintParser.T__1); - this.state = 561; + this.state = 564; this.expr(0); - this.state = 562; + this.state = 565; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 615; + this.state = 618; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2210,20 +2224,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 613; + this.state = 616; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 566; + this.state = 569; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 567; + this.state = 570; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 568; + this.state = 571; this.expr(26); } break; @@ -2232,11 +2246,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 572; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 570; + this.state = 573; (_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))) { @@ -2249,7 +2263,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 571; + this.state = 574; this.expr(25); } break; @@ -2258,11 +2272,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 575; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 573; + this.state = 576; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2275,7 +2289,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 577; this.expr(24); } break; @@ -2284,11 +2298,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 578; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 576; + this.state = 579; (_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))) { @@ -2301,7 +2315,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 580; this.expr(23); } break; @@ -2310,13 +2324,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 581; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 579; + this.state = 582; this.match(QuintParser.ASGN); - this.state = 580; + this.state = 583; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2329,13 +2343,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 583; + this.state = 586; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 584; + this.state = 587; this.match(QuintParser.AND); - this.state = 585; + this.state = 588; this.expr(19); } break; @@ -2344,13 +2358,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 589; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 587; + this.state = 590; this.match(QuintParser.OR); - this.state = 588; + this.state = 591; this.expr(17); } break; @@ -2359,13 +2373,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 592; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 590; + this.state = 593; this.match(QuintParser.IFF); - this.state = 591; + this.state = 594; this.expr(16); } break; @@ -2374,13 +2388,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 595; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 593; + this.state = 596; this.match(QuintParser.IMPLIES); - this.state = 594; + this.state = 597; this.expr(15); } break; @@ -2389,13 +2403,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 598; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 596; + this.state = 599; this.match(QuintParser.T__23); - this.state = 597; + this.state = 600; this.expr(9); } break; @@ -2404,32 +2418,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 601; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 599; + this.state = 602; this.match(QuintParser.T__19); - this.state = 600; + this.state = 603; this.nameAfterDot(); - this.state = 606; + this.state = 609; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { case 1: { - this.state = 601; + this.state = 604; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 606; 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__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.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 602; + this.state = 605; this.argList(); } } - this.state = 605; + this.state = 608; this.match(QuintParser.RPAREN); } break; @@ -2441,22 +2455,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; + this.state = 611; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 609; + this.state = 612; this.match(QuintParser.T__25); - this.state = 610; + this.state = 613; this.expr(0); - this.state = 611; + this.state = 614; this.match(QuintParser.T__26); } break; } } } - this.state = 617; + this.state = 620; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); } @@ -2484,43 +2498,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 618; + this.state = 621; this.match(QuintParser.MATCH); - this.state = 619; + this.state = 622; this.expr(0); - this.state = 620; + this.state = 623; this.match(QuintParser.T__1); - this.state = 622; + this.state = 625; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 621; + this.state = 624; this.match(QuintParser.T__10); } } - this.state = 624; + this.state = 627; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 629; + this.state = 632; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__10) { { { - this.state = 625; + this.state = 628; this.match(QuintParser.T__10); - this.state = 626; + this.state = 629; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 631; + this.state = 634; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 632; + this.state = 635; this.match(QuintParser.T__2); } } @@ -2545,27 +2559,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 636; + this.state = 639; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 634; + this.state = 637; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 635; + this.state = 638; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 638; + this.state = 641; this.match(QuintParser.T__24); - this.state = 639; + this.state = 642; this.expr(0); } } @@ -2592,35 +2607,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 641; + this.state = 644; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 648; + this.state = 651; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 642; - this.match(QuintParser.LPAREN); this.state = 645; + this.match(QuintParser.LPAREN); + this.state = 648; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 643; + this.state = 646; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 644; + this.state = 647; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 647; + this.state = 650; this.match(QuintParser.RPAREN); } } @@ -2646,15 +2662,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); try { - this.state = 659; + this.state = 662; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 650; + this.state = 653; this.declaration(); - this.state = 651; + this.state = 654; this.match(QuintParser.EOF); } break; @@ -2662,9 +2678,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 653; + this.state = 656; this.expr(0); - this.state = 654; + this.state = 657; this.match(QuintParser.EOF); } break; @@ -2672,9 +2688,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 656; + this.state = 659; this.match(QuintParser.DOCCOMMENT); - this.state = 657; + this.state = 660; this.match(QuintParser.EOF); } break; @@ -2682,7 +2698,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 658; + this.state = 661; this.match(QuintParser.EOF); } break; @@ -2707,13 +2723,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 48, QuintParser.RULE_lambda); try { - this.state = 663; + this.state = 666; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 661; + this.state = 664; this.lambdaUnsugared(); } break; @@ -2721,7 +2737,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 662; + this.state = 665; this.lambdaTupleSugar(); } break; @@ -2747,49 +2763,50 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 682; + this.state = 685; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 665; + this.state = 668; this.parameter(); - this.state = 666; + this.state = 669; this.match(QuintParser.T__24); - this.state = 667; + this.state = 670; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 669; + this.state = 672; this.match(QuintParser.LPAREN); - this.state = 670; + this.state = 673; this.parameter(); - this.state = 675; + this.state = 678; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 671; + this.state = 674; this.match(QuintParser.T__7); - this.state = 672; + this.state = 675; this.parameter(); } } - this.state = 677; + this.state = 680; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 681; this.match(QuintParser.RPAREN); - this.state = 679; + this.state = 682; this.match(QuintParser.T__24); - this.state = 680; + this.state = 683; this.expr(0); } break; @@ -2819,35 +2836,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 684; + this.state = 687; this.match(QuintParser.LPAREN); - this.state = 685; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 686; - this.parameter(); this.state = 689; + this.parameter(); + this.state = 692; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 687; + this.state = 690; this.match(QuintParser.T__7); - this.state = 688; + this.state = 691; this.parameter(); } } - this.state = 691; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 693; + this.state = 696; this.match(QuintParser.RPAREN); - this.state = 694; + this.state = 697; this.match(QuintParser.RPAREN); - this.state = 695; + this.state = 698; this.match(QuintParser.T__24); - this.state = 696; + this.state = 699; this.expr(0); } } @@ -2870,20 +2887,21 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); try { - this.state = 700; + this.state = 703; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 698; + this.state = 701; this.match(QuintParser.T__36); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 702; this.qualId(); } break; @@ -2912,7 +2930,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 702; + this.state = 705; this.identOrHole(); } } @@ -2935,20 +2953,21 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); try { - this.state = 706; + this.state = 709; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 704; + this.state = 707; this.match(QuintParser.MUL); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 705; + this.state = 708; this.qualId(); } break; @@ -2978,21 +2997,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 708; + this.state = 711; this.expr(0); - this.state = 713; + this.state = 716; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 709; + this.state = 712; this.match(QuintParser.T__7); - this.state = 710; + this.state = 713; this.expr(0); } } - this.state = 715; + this.state = 718; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3017,26 +3036,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 62, QuintParser.RULE_recElem); try { - this.state = 722; + this.state = 725; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 716; + this.state = 719; this.simpleId("record"); - this.state = 717; + this.state = 720; this.match(QuintParser.T__4); - this.state = 718; + this.state = 721; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 720; + this.state = 723; this.match(QuintParser.T__37); - this.state = 721; + this.state = 724; this.expr(0); } break; @@ -3064,13 +3084,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 726; + this.state = 729; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 724; + this.state = 727; this.qualId(); } break; @@ -3083,7 +3104,7 @@ export class QuintParser extends Parser { case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 725; + this.state = 728; _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))) { @@ -3122,13 +3143,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 730; + this.state = 733; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 728; + this.state = 731; this.qualId(); } break; @@ -3138,7 +3160,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 729; + this.state = 732; _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))) { @@ -3179,7 +3201,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 732; + this.state = 735; _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); @@ -3215,7 +3237,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 734; + this.state = 737; _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); @@ -3251,23 +3273,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 736; - this.match(QuintParser.IDENTIFIER); - this.state = 741; + this.state = 739; + this.identifier(); + this.state = 744; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 737; + this.state = 740; this.match(QuintParser.T__38); - this.state = 738; - this.match(QuintParser.IDENTIFIER); + this.state = 741; + this.identifier(); } } } - this.state = 743; + this.state = 746; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); } @@ -3292,21 +3314,21 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 74, QuintParser.RULE_simpleId); try { - this.state = 748; + this.state = 751; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 744; - this.match(QuintParser.IDENTIFIER); + this.state = 747; + this.identifier(); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 748; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3334,6 +3356,42 @@ export class QuintParser extends Parser { } return _localctx; } + // @RuleVersion(0) + public identifier(): IdentifierContext { + let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); + this.enterRule(_localctx, 76, QuintParser.RULE_identifier); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 753; + _la = this._input.LA(1); + if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { + this._errHandler.recoverInline(this); + } else { + if (this._input.LA(1) === Token.EOF) { + this.matchedEOF = true; + } + + this._errHandler.reportMatch(this); + this.consume(); + } + } + } + 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; + } public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { @@ -3348,10 +3406,10 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 13); case 1: - return this.precpred(this._ctx, 11); + return this.precpred(this._ctx, 12); } return true; } @@ -3398,403 +3456,405 @@ 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\u02F1\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u02F6\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\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x03\x02\x06\x02P\n\x02\r\x02\x0E" + - "\x02Q\x03\x02\x03\x02\x03\x03\x07\x03W\n\x03\f\x03\x0E\x03Z\v\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x07\x03`\n\x03\f\x03\x0E\x03c\v\x03\x03\x03" + - "\x03\x03\x03\x04\x07\x04h\n\x04\f\x04\x0E\x04k\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" + + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x03\x02\x06\x02R\n\x02\r" + + "\x02\x0E\x02S\x03\x02\x03\x02\x03\x03\x07\x03Y\n\x03\f\x03\x0E\x03\\\v" + + "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03b\n\x03\f\x03\x0E\x03e\v\x03" + + "\x03\x03\x03\x03\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\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\x05\x05\x83\n\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x07\x06\x8B\n\x06\f\x06\x0E\x06\x8E\v\x06\x05\x06\x90\n\x06\x03" + - "\x06\x03\x06\x03\x06\x05\x06\x95\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\xA2\n" + - "\x06\f\x06\x0E\x06\xA5\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xAB" + - "\n\x06\x03\x06\x03\x06\x05\x06\xAF\n\x06\x03\x06\x05\x06\xB2\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\xBF\n\x07\x03\x07\x03\x07\x03\x07\x07\x07\xC4\n\x07" + - "\f\x07\x0E\x07\xC7\v\x07\x05\x07\xC9\n\x07\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x05\b\xD0\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD6\n\t\x03\t\x03\t\x03" + - "\t\x05\t\xDB\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x05\n\xE6\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v" + - "\x03\v\x03\v\x03\v\x05\v\xF4\n\v\x03\v\x03\v\x05\v\xF8\n\v\x05\v\xFA\n" + - "\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0105\n" + - "\f\x05\f\u0107\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\u0114\n\r\f\r\x0E\r\u0117\v\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x05\r\u011E\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\u012B\n\r\f\r\x0E\r\u012E\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0135\n\r\x05\r\u0137\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\u0146\n\x12\f\x12\x0E\x12\u0149\v\x12\x05\x12\u014B\n" + - "\x12\x03\x12\x05\x12\u014E\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\u0163\n\x12\f\x12\x0E" + - "\x12\u0166\v\x12\x03\x12\x05\x12\u0169\n\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x05\x03\x05\x03\x05\x05\x05\x85\n\x05\x03\x06\x03\x06\x03\x06\x03\x06" + + "\x03\x06\x03\x06\x07\x06\x8D\n\x06\f\x06\x0E\x06\x90\v\x06\x05\x06\x92" + + "\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x97\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" + + "\xA4\n\x06\f\x06\x0E\x06\xA7\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05" + + "\x06\xAD\n\x06\x03\x06\x03\x06\x05\x06\xB1\n\x06\x03\x06\x05\x06\xB4\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\xC1\n\x07\x03\x07\x03\x07\x03\x07\x07\x07" + + "\xC6\n\x07\f\x07\x0E\x07\xC9\v\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b" + + "\x03\b\x03\b\x05\b\xD2\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD8\n\t\x03\t" + + "\x03\t\x03\t\x05\t\xDD\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + + "\n\x03\n\x05\n\xE8\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF0\n" + + "\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x05\v\xFA\n\v\x05" + + "\v\xFC\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f" + + "\u0107\n\f\x05\f\u0109\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\u0116\n\r\f\r\x0E\r\u0119\v\r\x03\r\x03\r\x03" + + "\r\x03\r\x03\r\x05\r\u0120\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\u012D\n\r\f\r\x0E\r\u0130\v\r\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x05\r\u0137\n\r\x05\r\u0139\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\u0148\n\x12\f\x12\x0E\x12\u014B\v\x12\x05\x12\u014D" + + "\n\x12\x03\x12\x05\x12\u0150\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\x05\x12\u0179\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x07\x12\u0181\n\x12\f\x12\x0E\x12\u0184\v\x12\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x07\x13\u018B\n\x13\f\x13\x0E\x13\u018E\v\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0197" + - "\n\x13\x05\x13\u0199\n\x13\x03\x13\x03\x13\x05\x13\u019D\n\x13\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A6\n\x15\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0165\n\x12\f\x12" + + "\x0E\x12\u0168\v\x12\x03\x12\x05\x12\u016B\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\x05\x12\u017C\n\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187\v\x12\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u018E\n\x13\f\x13\x0E\x13" + + "\u0191\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + + "\x13\u019A\n\x13\x05\x13\u019C\n\x13\x03\x13\x03\x13\x05\x13\u01A0\n\x13" + + "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A9" + + "\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\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\x03\x15\x07\x15\u01D8\n\x15\f\x15\x0E\x15\u01DB" + + "\v\x15\x03\x15\x05\x15\u01DE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x07\x15\u01E7\n\x15\f\x15\x0E\x15\u01EA\v\x15\x03" + + "\x15\x05\x15\u01ED\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x05\x15\u01F5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07" + + "\x15\u01FD\n\x15\f\x15\x0E\x15\u0200\v\x15\x03\x15\x05\x15\u0203\n\x15" + + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u020B\n\x15\f" + + "\x15\x0E\x15\u020E\v\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0219\n\x15\f\x15\x0E\x15\u021C\v" + + "\x15\x05\x15\u021E\n\x15\x03\x15\x05\x15\u0221\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\x07\x15\u01B6\n\x15\f\x15\x0E\x15" + - "\u01B9\v\x15\x03\x15\x05\x15\u01BC\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x07\x15\u01C5\n\x15\f\x15\x0E\x15\u01C8\v\x15" + - "\x03\x15\x05\x15\u01CB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01D5\n\x15\f\x15\x0E\x15\u01D8\v\x15\x03" + - "\x15\x05\x15\u01DB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x07\x15\u01E4\n\x15\f\x15\x0E\x15\u01E7\v\x15\x03\x15\x05\x15" + - "\u01EA\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01F2" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01FA\n" + - "\x15\f\x15\x0E\x15\u01FD\v\x15\x03\x15\x05\x15\u0200\n\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0208\n\x15\f\x15\x0E\x15" + - "\u020B\v\x15\x03\x15\x05\x15\u020E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x07\x15\u0216\n\x15\f\x15\x0E\x15\u0219\v\x15\x05\x15" + - "\u021B\n\x15\x03\x15\x05\x15\u021E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\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\u023A\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\u0237\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\u025E\n\x15\x03\x15\x05\x15" + - "\u0261\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0268\n\x15" + - "\f\x15\x0E\x15\u026B\v\x15\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0271" + - "\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0276\n\x16\f\x16\x0E\x16\u0279" + - "\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u027F\n\x17\x03\x17\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0288\n\x18\x03\x18" + - "\x05\x18\u028B\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x05\x19\u0296\n\x19\x03\x1A\x03\x1A\x05\x1A\u029A" + - "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x07\x1B\u02A4\n\x1B\f\x1B\x0E\x1B\u02A7\v\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x03\x1B\x05\x1B\u02AD\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x06" + - "\x1C\u02B4\n\x1C\r\x1C\x0E\x1C\u02B5\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1D\x03\x1D\x05\x1D\u02BF\n\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F" + - "\x05\x1F\u02C5\n\x1F\x03 \x03 \x03 \x07 \u02CA\n \f \x0E \u02CD\v \x03" + - "!\x03!\x03!\x03!\x03!\x03!\x05!\u02D5\n!\x03\"\x03\"\x05\"\u02D9\n\"\x03" + - "#\x03#\x05#\u02DD\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03&\x07&\u02E6\n&" + - "\f&\x0E&\u02E9\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02EF\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\x02F\x02H\x02J\x02L\x02\x02\t\x03\x0279\x03\x0256\x03\x02:?\x03" + - "\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*,\x02\u0351\x02O\x03\x02\x02\x02" + - "\x04X\x03\x02\x02\x02\x06i\x03\x02\x02\x02\b\x82\x03\x02\x02\x02\n\x84" + - "\x03\x02\x02\x02\f\xC8\x03\x02\x02\x02\x0E\xCA\x03\x02\x02\x02\x10\xD1" + - "\x03\x02\x02\x02\x12\xE5\x03\x02\x02\x02\x14\xF9\x03\x02\x02\x02\x16\u0106" + - "\x03\x02\x02\x02\x18\u0136\x03\x02\x02\x02\x1A\u0138\x03\x02\x02\x02\x1C" + - "\u013A\x03\x02\x02\x02\x1E\u013C\x03\x02\x02\x02 \u013E\x03\x02\x02\x02" + - "\"\u0178\x03\x02\x02\x02$\u019C\x03\x02\x02\x02&\u019E\x03\x02\x02\x02" + - "(\u0236\x03\x02\x02\x02*\u026C\x03\x02\x02\x02,\u027E\x03\x02\x02\x02" + - ".\u0283\x03\x02\x02\x020\u0295\x03\x02\x02\x022\u0299\x03\x02\x02\x02" + - "4\u02AC\x03\x02\x02\x026\u02AE\x03\x02\x02\x028\u02BE\x03\x02\x02\x02" + - ":\u02C0\x03\x02\x02\x02<\u02C4\x03\x02\x02\x02>\u02C6\x03\x02\x02\x02" + - "@\u02D4\x03\x02\x02\x02B\u02D8\x03\x02\x02\x02D\u02DC\x03\x02\x02\x02" + - "F\u02DE\x03\x02\x02\x02H\u02E0\x03\x02\x02\x02J\u02E2\x03\x02\x02\x02" + - "L\u02EE\x03\x02\x02\x02NP\x05\x04\x03\x02ON\x03\x02\x02\x02PQ\x03\x02" + - "\x02\x02QO\x03\x02\x02\x02QR\x03\x02\x02\x02RS\x03\x02\x02\x02ST\x07\x02" + - "\x02\x03T\x03\x03\x02\x02\x02UW\x07D\x02\x02VU\x03\x02\x02\x02WZ\x03\x02" + - "\x02\x02XV\x03\x02\x02\x02XY\x03\x02\x02\x02Y[\x03\x02\x02\x02ZX\x03\x02" + - "\x02\x02[\\\x07\x03\x02\x02\\]\x05J&\x02]a\x07\x04\x02\x02^`\x05\x06\x04" + - "\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\x07\x05\x02\x02e\x05\x03\x02" + - "\x02\x02fh\x07D\x02\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02" + - "\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x05\b" + - "\x05\x02m\x07\x03\x02\x02\x02no\x07\x06\x02\x02op\x05J&\x02pq\x07\x07" + - "\x02\x02qr\x05\"\x12\x02r\x83\x03\x02\x02\x02st\x07\b\x02\x02tu\x05J&" + - "\x02uv\x07\x07\x02\x02vw\x05\"\x12\x02w\x83\x03\x02\x02\x02xy\x07\t\x02" + - "\x02yz\x058\x1D\x02z{\x07@\x02\x02{|\x05(\x15\x02|\x83\x03\x02\x02\x02" + - "}\x83\x05\x18\r\x02~\x83\x05\n\x06\x02\x7F\x83\x05\f\x07\x02\x80\x83\x05" + - "\x14\v\x02\x81\x83\x05\x16\f\x02\x82n\x03\x02\x02\x02\x82s\x03\x02\x02" + - "\x02\x82x\x03\x02\x02\x02\x82}\x03\x02\x02\x02\x82~\x03\x02\x02\x02\x82" + - "\x7F\x03\x02\x02\x02\x82\x80\x03\x02\x02\x02\x82\x81\x03\x02\x02\x02\x83" + - "\t\x03\x02\x02\x02\x84\x85\x05\x12\n\x02\x85\xAA\x05B\"\x02\x86\x8F\x07" + - "A\x02\x02\x87\x8C\x05:\x1E\x02\x88\x89\x07\n\x02\x02\x89\x8B\x05:\x1E" + - "\x02\x8A\x88\x03\x02\x02\x02\x8B\x8E\x03\x02\x02\x02\x8C\x8A\x03\x02\x02" + - "\x02\x8C\x8D\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02\x8E\x8C\x03\x02\x02" + - "\x02\x8F\x87\x03\x02\x02\x02\x8F\x90\x03\x02\x02\x02\x90\x91\x03\x02\x02" + - "\x02\x91\x94\x07B\x02\x02\x92\x93\x07\x07\x02\x02\x93\x95\x05\"\x12\x02" + - "\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02\x02\x02\x95\xAB\x03\x02\x02\x02" + - "\x96\x97\x07\x07\x02\x02\x97\xAB\x05\"\x12\x02\x98\x99\x07A\x02\x02\x99" + - "\x9A\x05:\x1E\x02\x9A\x9B\x07\x07\x02\x02\x9B\xA3\x05\"\x12\x02\x9C\x9D" + - "\x07\n\x02\x02\x9D\x9E\x05:\x1E\x02\x9E\x9F\x07\x07\x02\x02\x9F\xA0\x05" + - "\"\x12\x02\xA0\xA2\x03\x02\x02\x02\xA1\x9C\x03\x02\x02\x02\xA2\xA5\x03" + - "\x02\x02\x02\xA3\xA1\x03\x02\x02\x02\xA3\xA4\x03\x02\x02\x02\xA4\xA6\x03" + - "\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA6\xA7\x07B\x02\x02\xA7\xA8\x07" + - "\x07\x02\x02\xA8\xA9\x05\"\x12\x02\xA9\xAB\x03\x02\x02\x02\xAA\x86\x03" + - "\x02\x02\x02\xAA\x96\x03\x02\x02\x02\xAA\x98\x03\x02\x02\x02\xAA\xAB\x03" + - "\x02\x02\x02\xAB\xAE\x03\x02\x02\x02\xAC\xAD\x07@\x02\x02\xAD\xAF\x05" + - "(\x15\x02\xAE\xAC\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB1\x03" + - "\x02\x02\x02\xB0\xB2\x07\v\x02\x02\xB1\xB0\x03\x02\x02\x02\xB1\xB2\x03" + - "\x02\x02\x02\xB2\v\x03\x02\x02\x02\xB3\xB4\x07\f\x02\x02\xB4\xC9\x05J" + - "&\x02\xB5\xB6\x07\f\x02\x02\xB6\xB7\x05J&\x02\xB7\xB8\x07@\x02\x02\xB8" + - "\xB9\x05\"\x12\x02\xB9\xC9\x03\x02\x02\x02\xBA\xBB\x07\f\x02\x02\xBB\xBC" + - "\x05J&\x02\xBC\xBE\x07@\x02\x02\xBD\xBF\x07\r\x02\x02\xBE\xBD\x03\x02" + - "\x02\x02\xBE\xBF\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC5\x05\x0E" + - "\b\x02\xC1\xC2\x07\r\x02\x02\xC2\xC4\x05\x0E\b\x02\xC3\xC1\x03\x02\x02" + - "\x02\xC4\xC7\x03\x02\x02\x02\xC5\xC3\x03\x02\x02\x02\xC5\xC6\x03\x02\x02" + - "\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC8\xB3\x03\x02\x02" + - "\x02\xC8\xB5\x03\x02\x02\x02\xC8\xBA\x03\x02\x02\x02\xC9\r\x03\x02\x02" + - "\x02\xCA\xCF\x05L\'\x02\xCB\xCC\x07A\x02\x02\xCC\xCD\x05\"\x12\x02\xCD" + - "\xCE\x07B\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCB\x03\x02\x02\x02\xCF" + - "\xD0\x03\x02\x02\x02\xD0\x0F\x03\x02\x02\x02\xD1\xD2\x07\x0E\x02\x02\xD2" + - "\xD5\x05J&\x02\xD3\xD4\x07\x07\x02\x02\xD4\xD6\x05\"\x12\x02\xD5\xD3\x03" + - "\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD7\x03\x02\x02\x02\xD7\xD8\x07" + - "@\x02\x02\xD8\xDA\x05(\x15\x02\xD9\xDB\x07\v\x02\x02\xDA\xD9\x03\x02\x02" + - "\x02\xDA\xDB\x03\x02\x02\x02\xDB\x11\x03\x02\x02\x02\xDC\xE6\x07\x0F\x02" + - "\x02\xDD\xE6\x07\x10\x02\x02\xDE\xDF\x07\x11\x02\x02\xDF\xE6\x07\x0F\x02" + - "\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE6\x07\x10\x02\x02\xE2\xE6\x07\x12\x02" + - "\x02\xE3\xE6\x07\x13\x02\x02\xE4\xE6\x07\x14\x02\x02\xE5\xDC\x03\x02\x02" + - "\x02\xE5\xDD\x03\x02\x02\x02\xE5\xDE\x03\x02\x02\x02\xE5\xE0\x03\x02\x02" + - "\x02\xE5\xE2\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE5\xE4\x03\x02\x02" + - "\x02\xE6\x13\x03\x02\x02\x02\xE7\xE8\x07\x15\x02\x02\xE8\xE9\x05\x1C\x0F" + - "\x02\xE9\xEA\x07\x16\x02\x02\xEA\xED\x05<\x1F\x02\xEB\xEC\x07\x17\x02" + - "\x02\xEC\xEE\x05 \x11\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03\x02\x02" + - "\x02\xEE\xFA\x03\x02\x02\x02\xEF\xF0\x07\x15\x02\x02\xF0\xF3\x05\x1C\x0F" + - "\x02\xF1\xF2\x07\x18\x02\x02\xF2\xF4\x05\x1C\x0F\x02\xF3\xF1\x03\x02\x02" + - "\x02\xF3\xF4\x03\x02\x02\x02\xF4\xF7\x03\x02\x02\x02\xF5\xF6\x07\x17\x02" + - "\x02\xF6\xF8\x05 \x11\x02\xF7\xF5\x03\x02\x02\x02\xF7\xF8\x03\x02\x02" + - "\x02\xF8\xFA\x03\x02\x02\x02\xF9\xE7\x03\x02\x02\x02\xF9\xEF\x03\x02\x02" + - "\x02\xFA\x15\x03\x02\x02\x02\xFB\xFC\x07\x19\x02\x02\xFC\xFD\x05\x1C\x0F" + - "\x02\xFD\xFE\x07\x16\x02\x02\xFE\xFF\x05<\x1F\x02\xFF\u0107\x03\x02\x02" + - "\x02\u0100\u0101\x07\x19\x02\x02\u0101\u0104\x05\x1C\x0F\x02\u0102\u0103" + - "\x07\x18\x02\x02\u0103\u0105\x05\x1C\x0F\x02\u0104\u0102\x03\x02\x02\x02" + - "\u0104\u0105\x03\x02\x02\x02\u0105\u0107\x03\x02\x02\x02\u0106\xFB\x03" + - "\x02\x02\x02\u0106\u0100\x03\x02\x02\x02\u0107\x17\x03\x02\x02\x02\u0108" + - "\u0109\x07\x15\x02\x02\u0109\u010A\x05\x1A\x0E\x02\u010A\u010B\x07A\x02" + - "\x02\u010B\u010C\x05\x1C\x0F\x02\u010C\u010D\x07@\x02\x02\u010D\u0115" + - "\x05(\x15\x02\u010E\u010F\x07\n\x02\x02\u010F\u0110\x05\x1C\x0F\x02\u0110" + - "\u0111\x07@\x02\x02\u0111\u0112\x05(\x15\x02\u0112\u0114\x03\x02\x02\x02" + - "\u0113\u010E\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115\u0113\x03" + - "\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u0118\x03\x02\x02\x02\u0117" + - "\u0115\x03\x02\x02\x02\u0118\u0119\x07B\x02\x02\u0119\u011A\x07\x16\x02" + - "\x02\u011A\u011D\x077\x02\x02\u011B\u011C\x07\x17\x02\x02\u011C\u011E" + - "\x05 \x11\x02\u011D\u011B\x03\x02\x02\x02\u011D\u011E\x03\x02\x02\x02" + - "\u011E\u0137\x03\x02\x02\x02\u011F\u0120\x07\x15\x02\x02\u0120\u0121\x05" + - "\x1A\x0E\x02\u0121\u0122\x07A\x02\x02\u0122\u0123\x05\x1C\x0F\x02\u0123" + - "\u0124\x07@\x02\x02\u0124\u012C\x05(\x15\x02\u0125\u0126\x07\n\x02\x02" + - "\u0126\u0127\x05\x1C\x0F\x02\u0127\u0128\x07@\x02\x02\u0128\u0129\x05" + - "(\x15\x02\u0129\u012B\x03\x02\x02\x02\u012A\u0125\x03\x02\x02\x02\u012B" + - "\u012E\x03\x02\x02\x02\u012C\u012A\x03\x02\x02\x02\u012C\u012D\x03\x02" + - "\x02\x02\u012D\u012F\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F" + - "\u0130\x07B\x02\x02\u0130\u0131\x07\x18\x02\x02\u0131\u0134\x05\x1E\x10" + - "\x02\u0132\u0133\x07\x17\x02\x02\u0133\u0135\x05 \x11\x02\u0134\u0132" + - "\x03\x02\x02\x02\u0134\u0135\x03\x02\x02\x02\u0135\u0137\x03\x02\x02\x02" + - "\u0136\u0108\x03\x02\x02\x02\u0136\u011F\x03\x02\x02\x02\u0137\x19\x03" + - "\x02\x02\x02\u0138\u0139\x05J&\x02\u0139\x1B\x03\x02\x02\x02\u013A\u013B" + - "\x05J&\x02\u013B\x1D\x03\x02\x02\x02\u013C\u013D\x05J&\x02\u013D\x1F\x03" + - "\x02\x02\x02\u013E\u013F\x07*\x02\x02\u013F!\x03\x02\x02\x02\u0140\u0141" + - "\b\x12\x01\x02\u0141\u014A\x07A\x02\x02\u0142\u0147\x05\"\x12\x02\u0143" + - "\u0144\x07\n\x02\x02\u0144\u0146\x05\"\x12\x02\u0145\u0143\x03\x02\x02" + - "\x02\u0146\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148" + - "\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02" + - "\u014A\u0142\x03\x02\x02\x02\u014A\u014B\x03\x02\x02\x02\u014B\u014D\x03" + - "\x02\x02\x02\u014C\u014E\x07\n\x02\x02\u014D\u014C\x03\x02\x02\x02\u014D" + - "\u014E\x03\x02\x02\x02\u014E\u014F\x03\x02\x02\x02\u014F\u0150\x07B\x02" + - "\x02\u0150\u0151\x07\x1B\x02\x02\u0151\u0179\x05\"\x12\f\u0152\u0153\x07" + - "1\x02\x02\u0153\u0154\x07\x1C\x02\x02\u0154\u0155\x05\"\x12\x02\u0155" + - "\u0156\x07\x1D\x02\x02\u0156\u0179\x03\x02\x02\x02\u0157\u0158\x072\x02" + - "\x02\u0158\u0159\x07\x1C\x02\x02\u0159\u015A\x05\"\x12\x02\u015A\u015B" + - "\x07\x1D\x02\x02\u015B\u0179\x03\x02\x02\x02\u015C\u015D\x07A\x02\x02" + - "\u015D\u015E\x05\"\x12\x02\u015E\u015F\x07\n\x02\x02\u015F\u0164\x05\"" + - "\x12\x02\u0160\u0161\x07\n\x02\x02\u0161\u0163\x05\"\x12\x02\u0162\u0160" + - "\x03\x02\x02\x02\u0163\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02" + - "\u0164\u0165\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03" + - "\x02\x02\x02\u0167\u0169\x07\n\x02\x02\u0168\u0167\x03\x02\x02\x02\u0168" + - "\u0169\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x07B\x02" + - "\x02\u016B\u0179\x03\x02\x02\x02\u016C\u016D\x07\x04\x02\x02\u016D\u016E" + - "\x05$\x13\x02\u016E\u016F\x07\x05\x02\x02\u016F\u0179\x03\x02\x02\x02" + - "\u0170\u0179\x07\x1E\x02\x02\u0171\u0179\x07\x1F\x02\x02\u0172\u0179\x07" + - " \x02\x02\u0173\u0179\x05J&\x02\u0174\u0175\x07A\x02\x02\u0175\u0176\x05" + - "\"\x12\x02\u0176\u0177\x07B\x02\x02\u0177\u0179\x03\x02\x02\x02\u0178" + - "\u0140\x03\x02\x02\x02\u0178\u0152\x03\x02\x02\x02\u0178\u0157\x03\x02" + - "\x02\x02\u0178\u015C\x03\x02\x02\x02\u0178\u016C\x03\x02\x02\x02\u0178" + - "\u0170\x03\x02\x02\x02\u0178\u0171\x03\x02\x02\x02\u0178\u0172\x03\x02" + - "\x02\x02\u0178\u0173\x03\x02\x02\x02\u0178\u0174\x03\x02\x02\x02\u0179" + - "\u0182\x03\x02\x02\x02\u017A\u017B\f\x0E\x02\x02\u017B\u017C\x07\x1A\x02" + - "\x02\u017C\u0181\x05\"\x12\x0E\u017D\u017E\f\r\x02\x02\u017E\u017F\x07" + - "\x1B\x02\x02\u017F\u0181\x05\"\x12\r\u0180\u017A\x03\x02\x02\x02\u0180" + - "\u017D\x03\x02\x02\x02\u0181\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02" + - "\x02\x02\u0182\u0183\x03\x02\x02\x02\u0183#\x03\x02\x02\x02\u0184\u0182" + - "\x03\x02\x02\x02\u0185\u0186\x05&\x14\x02\u0186\u0187\x07\x07\x02\x02" + - "\u0187\u0188\x05\"\x12\x02\u0188\u0189\x07\n\x02\x02\u0189\u018B\x03\x02" + - "\x02\x02\u018A\u0185\x03\x02\x02\x02\u018B\u018E\x03\x02\x02\x02\u018C" + - "\u018A\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u0198\x03\x02" + - "\x02\x02\u018E\u018C\x03\x02\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191" + - "\x07\x07\x02\x02\u0191\u0192\x05\"\x12\x02\u0192\u0196\x03\x02\x02\x02" + - "\u0193\u0197\x07\n\x02\x02\u0194\u0195\x07\r\x02\x02\u0195\u0197\x07C" + - "\x02\x02\u0196\u0193\x03\x02\x02\x02\u0196\u0194\x03\x02\x02\x02\u0196" + - "\u0197\x03\x02\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u018F\x03\x02" + - "\x02\x02\u0198\u0199\x03\x02\x02\x02\u0199\u019D\x03\x02\x02\x02\u019A" + - "\u019B\x07\r\x02\x02\u019B\u019D\x07C\x02\x02\u019C\u018C\x03\x02\x02" + - "\x02\u019C\u019A\x03\x02\x02\x02\u019D%\x03\x02\x02\x02\u019E\u019F\x05" + - "L\'\x02\u019F\'\x03\x02\x02\x02\u01A0\u01A1\b\x15\x01\x02\u01A1\u0237" + - "\x052\x1A\x02\u01A2\u01A3\x05B\"\x02\u01A3\u01A5\x07A\x02\x02\u01A4\u01A6" + - "\x05> \x02\u01A5\u01A4\x03\x02\x02\x02\u01A5\u01A6\x03\x02\x02\x02\u01A6" + - "\u01A7\x03\x02\x02\x02\u01A7\u01A8\x07B\x02\x02\u01A8\u0237\x03\x02\x02" + - "\x02\u01A9\u01AA\x076\x02\x02\u01AA\u0237\x05(\x15\x1B\u01AB\u01AC\x05" + - "J&\x02\u01AC\u01AD\x07\"\x02\x02\u01AD\u01AE\x07@\x02\x02\u01AE\u01AF" + - "\x05(\x15\x17\u01AF\u0237\x03\x02\x02\x02\u01B0\u01B1\x07-\x02\x02\u01B1" + - "\u01B2\x07\x04\x02\x02\u01B2\u01B7\x05(\x15\x02\u01B3\u01B4\x07\n\x02" + - "\x02\u01B4\u01B6\x05(\x15\x02\u01B5\u01B3\x03\x02\x02\x02\u01B6\u01B9" + - "\x03\x02\x02\x02\u01B7\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02" + - "\u01B8\u01BB\x03\x02\x02\x02\u01B9\u01B7\x03\x02\x02\x02\u01BA\u01BC\x07" + - "\n\x02\x02\u01BB\u01BA\x03\x02\x02\x02\u01BB\u01BC\x03\x02\x02\x02\u01BC" + - "\u01BD\x03\x02\x02\x02\u01BD\u01BE\x07\x05\x02\x02\u01BE\u0237\x03\x02" + - "\x02\x02\u01BF\u01C0\x07.\x02\x02\u01C0\u01C1\x07\x04\x02\x02\u01C1\u01C6" + - "\x05(\x15\x02\u01C2\u01C3\x07\n\x02\x02\u01C3\u01C5\x05(\x15\x02\u01C4" + - "\u01C2\x03\x02\x02\x02\u01C5\u01C8\x03\x02\x02\x02\u01C6\u01C4\x03\x02" + - "\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CA\x03\x02\x02\x02\u01C8" + - "\u01C6\x03\x02\x02\x02\u01C9\u01CB\x07\n\x02\x02\u01CA\u01C9\x03\x02\x02" + - "\x02\u01CA\u01CB\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02\u01CC\u01CD" + - "\x07\x05\x02\x02\u01CD\u0237\x03\x02\x02\x02\u01CE\u0237\x05*\x16\x02" + - "\u01CF\u01D0\x07#\x02\x02\u01D0\u01D1\x07\x04\x02\x02\u01D1\u01D6\x05" + - "(\x15\x02\u01D2\u01D3\x07\n\x02\x02\u01D3\u01D5\x05(\x15\x02\u01D4\u01D2" + - "\x03\x02\x02\x02\u01D5\u01D8\x03\x02\x02\x02\u01D6\u01D4\x03\x02\x02\x02" + - "\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01DA\x03\x02\x02\x02\u01D8\u01D6\x03" + - "\x02\x02\x02\u01D9\u01DB\x07\n\x02\x02\u01DA\u01D9\x03\x02\x02\x02\u01DA" + - "\u01DB\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x07\x05" + - "\x02\x02\u01DD\u0237\x03\x02\x02\x02\u01DE\u01DF\x07$\x02\x02\u01DF\u01E0" + - "\x07\x04\x02\x02\u01E0\u01E5\x05(\x15\x02\u01E1\u01E2\x07\n\x02\x02\u01E2" + - "\u01E4\x05(\x15\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7\x03\x02\x02" + - "\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E9" + - "\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07\n\x02\x02" + - "\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA\u01EB\x03" + - "\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0237\x03\x02\x02\x02\u01ED" + - "\u01F2\x05J&\x02\u01EE\u01F2\x07,\x02\x02\u01EF\u01F2\x07+\x02\x02\u01F0" + - "\u01F2\x07*\x02\x02\u01F1\u01ED\x03\x02\x02\x02\u01F1\u01EE\x03\x02\x02" + - "\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F0\x03\x02\x02\x02\u01F2\u0237" + - "\x03\x02\x02\x02\u01F3\u01F4\x07A\x02\x02\u01F4\u01F5\x05(\x15\x02\u01F5" + - "\u01F6\x07\n\x02\x02\u01F6\u01FB\x05(\x15\x02\u01F7\u01F8\x07\n\x02\x02" + - "\u01F8\u01FA\x05(\x15\x02\u01F9\u01F7\x03\x02\x02\x02\u01FA\u01FD\x03" + - "\x02"; + "\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\u0261\n\x15\x03" + + "\x15\x05\x15\u0264\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15" + + "\u026B\n\x15\f\x15\x0E\x15\u026E\v\x15\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x05\x16\u0274\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0279\n\x16\f\x16" + + "\x0E\x16\u027C\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u0282\n\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028B" + + "\n\x18\x03\x18\x05\x18\u028E\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + + "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0299\n\x19\x03\x1A\x03\x1A" + + "\x05\x1A\u029D\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x07\x1B\u02A7\n\x1B\f\x1B\x0E\x1B\u02AA\v\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x03\x1B\x05\x1B\u02B0\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + + "\x03\x1C\x06\x1C\u02B7\n\x1C\r\x1C\x0E\x1C\u02B8\x03\x1C\x03\x1C\x03\x1C" + + "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x05\x1D\u02C2\n\x1D\x03\x1E\x03\x1E\x03" + + "\x1F\x03\x1F\x05\x1F\u02C8\n\x1F\x03 \x03 \x03 \x07 \u02CD\n \f \x0E " + + "\u02D0\v \x03!\x03!\x03!\x03!\x03!\x03!\x05!\u02D8\n!\x03\"\x03\"\x05" + + "\"\u02DC\n\"\x03#\x03#\x05#\u02E0\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03" + + "&\x07&\u02E9\n&\f&\x0E&\u02EC\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02F2\n" + + "\'\x03(\x03(\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\x02" + + "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02\x02\n\x03" + + "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + + ",\x03\x02CD\x02\u0356\x02Q\x03\x02\x02\x02\x04Z\x03\x02\x02\x02\x06k\x03" + + "\x02\x02\x02\b\x84\x03\x02\x02\x02\n\x86\x03\x02\x02\x02\f\xCA\x03\x02" + + "\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xD3\x03\x02\x02\x02\x12\xE7\x03\x02" + + "\x02\x02\x14\xFB\x03\x02\x02\x02\x16\u0108\x03\x02\x02\x02\x18\u0138\x03" + + "\x02\x02\x02\x1A\u013A\x03\x02\x02\x02\x1C\u013C\x03\x02\x02\x02\x1E\u013E" + + "\x03\x02\x02\x02 \u0140\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u019F" + + "\x03\x02\x02\x02&\u01A1\x03\x02\x02\x02(\u0239\x03\x02\x02\x02*\u026F" + + "\x03\x02\x02\x02,\u0281\x03\x02\x02\x02.\u0286\x03\x02\x02\x020\u0298" + + "\x03\x02\x02\x022\u029C\x03\x02\x02\x024\u02AF\x03\x02\x02\x026\u02B1" + + "\x03\x02\x02\x028\u02C1\x03\x02\x02\x02:\u02C3\x03\x02\x02\x02<\u02C7" + + "\x03\x02\x02\x02>\u02C9\x03\x02\x02\x02@\u02D7\x03\x02\x02\x02B\u02DB" + + "\x03\x02\x02\x02D\u02DF\x03\x02\x02\x02F\u02E1\x03\x02\x02\x02H\u02E3" + + "\x03\x02\x02\x02J\u02E5\x03\x02\x02\x02L\u02F1\x03\x02\x02\x02N\u02F3" + + "\x03\x02\x02\x02PR\x05\x04\x03\x02QP\x03\x02\x02\x02RS\x03\x02\x02\x02" + + "SQ\x03\x02\x02\x02ST\x03\x02\x02\x02TU\x03\x02\x02\x02UV\x07\x02\x02\x03" + + "V\x03\x03\x02\x02\x02WY\x07E\x02\x02XW\x03\x02\x02\x02Y\\\x03\x02\x02" + + "\x02ZX\x03\x02\x02\x02Z[\x03\x02\x02\x02[]\x03\x02\x02\x02\\Z\x03\x02" + + "\x02\x02]^\x07\x03\x02\x02^_\x05J&\x02_c\x07\x04\x02\x02`b\x05\x06\x04" + + "\x02a`\x03\x02\x02\x02be\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + + "\x02df\x03\x02\x02\x02ec\x03\x02\x02\x02fg\x07\x05\x02\x02g\x05\x03\x02" + + "\x02\x02hj\x07E\x02\x02ih\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02" + + "\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03\x02\x02\x02no\x05\b" + + "\x05\x02o\x07\x03\x02\x02\x02pq\x07\x06\x02\x02qr\x05J&\x02rs\x07\x07" + + "\x02\x02st\x05\"\x12\x02t\x85\x03\x02\x02\x02uv\x07\b\x02\x02vw\x05J&" + + "\x02wx\x07\x07\x02\x02xy\x05\"\x12\x02y\x85\x03\x02\x02\x02z{\x07\t\x02" + + "\x02{|\x058\x1D\x02|}\x07@\x02\x02}~\x05(\x15\x02~\x85\x03\x02\x02\x02" + + "\x7F\x85\x05\x18\r\x02\x80\x85\x05\n\x06\x02\x81\x85\x05\f\x07\x02\x82" + + "\x85\x05\x14\v\x02\x83\x85\x05\x16\f\x02\x84p\x03\x02\x02\x02\x84u\x03" + + "\x02\x02\x02\x84z\x03\x02\x02\x02\x84\x7F\x03\x02\x02\x02\x84\x80\x03" + + "\x02\x02\x02\x84\x81\x03\x02\x02\x02\x84\x82\x03\x02\x02\x02\x84\x83\x03" + + "\x02\x02\x02\x85\t\x03\x02\x02\x02\x86\x87\x05\x12\n\x02\x87\xAC\x05B" + + "\"\x02\x88\x91\x07A\x02\x02\x89\x8E\x05:\x1E\x02\x8A\x8B\x07\n\x02\x02" + + "\x8B\x8D\x05:\x1E\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02" + + "\x8E\x8C\x03\x02\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x92\x03\x02\x02\x02" + + "\x90\x8E\x03\x02\x02\x02\x91\x89\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02" + + "\x92\x93\x03\x02\x02\x02\x93\x96\x07B\x02\x02\x94\x95\x07\x07\x02\x02" + + "\x95\x97\x05\"\x12\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02" + + "\x97\xAD\x03\x02\x02\x02\x98\x99\x07\x07\x02\x02\x99\xAD\x05\"\x12\x02" + + "\x9A\x9B\x07A\x02\x02\x9B\x9C\x05:\x1E\x02\x9C\x9D\x07\x07\x02\x02\x9D" + + "\xA5\x05\"\x12\x02\x9E\x9F\x07\n\x02\x02\x9F\xA0\x05:\x1E\x02\xA0\xA1" + + "\x07\x07\x02\x02\xA1\xA2\x05\"\x12\x02\xA2\xA4\x03\x02\x02\x02\xA3\x9E" + + "\x03\x02\x02\x02\xA4\xA7\x03\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA5\xA6" + + "\x03\x02\x02\x02\xA6\xA8\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA8\xA9" + + "\x07B\x02\x02\xA9\xAA\x07\x07\x02\x02\xAA\xAB\x05\"\x12\x02\xAB\xAD\x03" + + "\x02\x02\x02\xAC\x88\x03\x02\x02\x02\xAC\x98\x03\x02\x02\x02\xAC\x9A\x03" + + "\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xB0\x03\x02\x02\x02\xAE\xAF\x07" + + "@\x02\x02\xAF\xB1\x05(\x15\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1\x03\x02" + + "\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB4\x07\v\x02\x02\xB3\xB2\x03\x02" + + "\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\v\x03\x02\x02\x02\xB5\xB6\x07\f\x02" + + "\x02\xB6\xCB\x05J&\x02\xB7\xB8\x07\f\x02\x02\xB8\xB9\x05J&\x02\xB9\xBA" + + "\x07@\x02\x02\xBA\xBB\x05\"\x12\x02\xBB\xCB\x03\x02\x02\x02\xBC\xBD\x07" + + "\f\x02\x02\xBD\xBE\x05J&\x02\xBE\xC0\x07@\x02\x02\xBF\xC1\x07\r\x02\x02" + + "\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02" + + "\xC2\xC7\x05\x0E\b\x02\xC3\xC4\x07\r\x02\x02\xC4\xC6\x05\x0E\b\x02\xC5" + + "\xC3\x03\x02\x02\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7" + + "\xC8\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA" + + "\xB5\x03\x02\x02\x02\xCA\xB7\x03\x02\x02\x02\xCA\xBC\x03\x02\x02\x02\xCB" + + "\r\x03\x02\x02\x02\xCC\xD1\x05L\'\x02\xCD\xCE\x07A\x02\x02\xCE\xCF\x05" + + "\"\x12\x02\xCF\xD0\x07B\x02\x02\xD0\xD2\x03\x02\x02\x02\xD1\xCD\x03\x02" + + "\x02\x02\xD1\xD2\x03\x02\x02\x02\xD2\x0F\x03\x02\x02\x02\xD3\xD4\x07\x0E" + + "\x02\x02\xD4\xD7\x05J&\x02\xD5\xD6\x07\x07\x02\x02\xD6\xD8\x05\"\x12\x02" + + "\xD7\xD5\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + + "\xD9\xDA\x07@\x02\x02\xDA\xDC\x05(\x15\x02\xDB\xDD\x07\v\x02\x02\xDC\xDB" + + "\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\x11\x03\x02\x02\x02\xDE\xE8" + + "\x07\x0F\x02\x02\xDF\xE8\x07\x10\x02\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE8" + + "\x07\x0F\x02\x02\xE2\xE3\x07\x11\x02\x02\xE3\xE8\x07\x10\x02\x02\xE4\xE8" + + "\x07\x12\x02\x02\xE5\xE8\x07\x13\x02\x02\xE6\xE8\x07\x14\x02\x02\xE7\xDE" + + "\x03\x02\x02\x02\xE7\xDF\x03\x02\x02\x02\xE7\xE0\x03\x02\x02\x02\xE7\xE2" + + "\x03\x02\x02\x02\xE7\xE4\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE6" + + "\x03\x02\x02\x02\xE8\x13\x03\x02\x02\x02\xE9\xEA\x07\x15\x02\x02\xEA\xEB" + + "\x05\x1C\x0F\x02\xEB\xEC\x07\x16\x02\x02\xEC\xEF\x05<\x1F\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\xFC\x03\x02\x02\x02\xF1\xF2\x07\x15\x02\x02\xF2\xF5" + + "\x05\x1C\x0F\x02\xF3\xF4\x07\x18\x02\x02\xF4\xF6\x05\x1C\x0F\x02\xF5\xF3" + + "\x03\x02\x02\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF9\x03\x02\x02\x02\xF7\xF8" + + "\x07\x17\x02\x02\xF8\xFA\x05 \x11\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA" + + "\x03\x02\x02\x02\xFA\xFC\x03\x02\x02\x02\xFB\xE9\x03\x02\x02\x02\xFB\xF1" + + "\x03\x02\x02\x02\xFC\x15\x03\x02\x02\x02\xFD\xFE\x07\x19\x02\x02\xFE\xFF" + + "\x05\x1C\x0F\x02\xFF\u0100\x07\x16\x02\x02\u0100\u0101\x05<\x1F\x02\u0101" + + "\u0109\x03\x02\x02\x02\u0102\u0103\x07\x19\x02\x02\u0103\u0106\x05\x1C" + + "\x0F\x02\u0104\u0105\x07\x18\x02\x02\u0105\u0107\x05\x1C\x0F\x02\u0106" + + "\u0104\x03\x02\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x03\x02" + + "\x02\x02\u0108\xFD\x03\x02\x02\x02\u0108\u0102\x03\x02\x02\x02\u0109\x17" + + "\x03\x02\x02\x02\u010A\u010B\x07\x15\x02\x02\u010B\u010C\x05\x1A\x0E\x02" + + "\u010C\u010D\x07A\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + + "@\x02\x02\u010F\u0117\x05(\x15\x02\u0110\u0111\x07\n\x02\x02\u0111\u0112" + + "\x05\x1C\x0F\x02\u0112\u0113\x07@\x02\x02\u0113\u0114\x05(\x15\x02\u0114" + + "\u0116\x03\x02\x02\x02\u0115\u0110\x03\x02\x02\x02\u0116\u0119\x03\x02" + + "\x02\x02\u0117\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118" + + "\u011A\x03\x02\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u011B\x07B\x02" + + "\x02\u011B\u011C\x07\x16\x02\x02\u011C\u011F\x077\x02\x02\u011D\u011E" + + "\x07\x17\x02\x02\u011E\u0120\x05 \x11\x02\u011F\u011D\x03\x02\x02\x02" + + "\u011F\u0120\x03\x02\x02\x02\u0120\u0139\x03\x02\x02\x02\u0121\u0122\x07" + + "\x15\x02\x02\u0122\u0123\x05\x1A\x0E\x02\u0123\u0124\x07A\x02\x02\u0124" + + "\u0125\x05\x1C\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u012E\x05(\x15\x02" + + "\u0127\u0128\x07\n\x02\x02\u0128\u0129\x05\x1C\x0F\x02\u0129\u012A\x07" + + "@\x02\x02\u012A\u012B\x05(\x15\x02\u012B\u012D\x03\x02\x02\x02\u012C\u0127" + + "\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02" + + "\u012E\u012F\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130\u012E\x03" + + "\x02\x02\x02\u0131\u0132\x07B\x02\x02\u0132\u0133\x07\x18\x02\x02\u0133" + + "\u0136\x05\x1E\x10\x02\u0134\u0135\x07\x17\x02\x02\u0135\u0137\x05 \x11" + + "\x02\u0136\u0134\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137\u0139" + + "\x03\x02\x02\x02\u0138\u010A\x03\x02\x02\x02\u0138\u0121\x03\x02\x02\x02" + + "\u0139\x19\x03\x02\x02\x02\u013A\u013B\x05J&\x02\u013B\x1B\x03\x02\x02" + + "\x02\u013C\u013D\x05J&\x02\u013D\x1D\x03\x02\x02\x02\u013E\u013F\x05J" + + "&\x02\u013F\x1F\x03\x02\x02\x02\u0140\u0141\x07*\x02\x02\u0141!\x03\x02" + + "\x02\x02\u0142\u0143\b\x12\x01\x02\u0143\u014C\x07A\x02\x02\u0144\u0149" + + "\x05\"\x12\x02\u0145\u0146\x07\n\x02\x02\u0146\u0148\x05\"\x12\x02\u0147" + + "\u0145\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02" + + "\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014D\x03\x02\x02\x02\u014B" + + "\u0149\x03\x02\x02\x02\u014C\u0144\x03\x02\x02\x02\u014C\u014D\x03\x02" + + "\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0150\x07\n\x02\x02\u014F\u014E" + + "\x03\x02\x02\x02\u014F\u0150\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02" + + "\u0151\u0152\x07B\x02\x02\u0152\u0153\x07\x1B\x02\x02\u0153\u017C\x05" + + "\"\x12\r\u0154\u0155\x071\x02\x02\u0155\u0156\x07\x1C\x02\x02\u0156\u0157" + + "\x05\"\x12\x02\u0157\u0158\x07\x1D\x02\x02\u0158\u017C\x03\x02\x02\x02" + + "\u0159\u015A\x072\x02\x02\u015A\u015B\x07\x1C\x02\x02\u015B\u015C\x05" + + "\"\x12\x02\u015C\u015D\x07\x1D\x02\x02\u015D\u017C\x03\x02\x02\x02\u015E" + + "\u015F\x07A\x02\x02\u015F\u0160\x05\"\x12\x02\u0160\u0161\x07\n\x02\x02" + + "\u0161\u0166\x05\"\x12\x02\u0162\u0163\x07\n\x02\x02\u0163\u0165\x05\"" + + "\x12\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166" + + "\u0164\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u016A\x03\x02" + + "\x02\x02\u0168\u0166\x03\x02\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169" + + "\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02" + + "\u016C\u016D\x07B\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u016F\x07" + + "\x04\x02\x02\u016F\u0170\x05$\x13\x02\u0170\u0171\x07\x05\x02\x02\u0171" + + "\u017C\x03\x02\x02\x02\u0172\u017C\x07\x1E\x02\x02\u0173\u017C\x07\x1F" + + "\x02\x02\u0174\u017C\x07 \x02\x02\u0175\u017C\x07C\x02\x02\u0176\u017C" + + "\x05J&\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"\x12\x02\u0179\u017A" + + "\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u0142\x03\x02\x02\x02" + + "\u017B\u0154\x03\x02\x02\x02\u017B\u0159\x03\x02\x02\x02\u017B\u015E\x03" + + "\x02\x02\x02\u017B\u016E\x03\x02\x02\x02\u017B\u0172\x03\x02\x02\x02\u017B" + + "\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B\u0175\x03\x02" + + "\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02\x02\x02\u017C" + + "\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F\x07\x1A\x02" + + "\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181\u0182\x07" + + "\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02\x02\u0183" + + "\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183\x03\x02" + + "\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187\u0185" + + "\x03\x02\x02\x02\u0188\u0189\x05&\x14\x02\u0189\u018A\x07\x07\x02\x02" + + "\u018A\u018B\x05\"\x12\x02\u018B\u018C\x07\n\x02\x02\u018C\u018E\x03\x02" + + "\x02\x02\u018D\u0188\x03\x02\x02\x02\u018E\u0191\x03\x02\x02\x02\u018F" + + "\u018D\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x03\x02" + + "\x02\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0193\x05&\x14\x02\u0193\u0194" + + "\x07\x07\x02\x02\u0194\u0195\x05\"\x12\x02\u0195\u0199\x03\x02\x02\x02" + + "\u0196\u019A\x07\n\x02\x02\u0197\u0198\x07\r\x02\x02\u0198\u019A\x05N" + + "(\x02\u0199\u0196\x03\x02\x02\x02\u0199\u0197\x03\x02\x02\x02\u0199\u019A" + + "\x03\x02\x02\x02\u019A\u019C\x03\x02\x02\x02\u019B\u0192\x03\x02\x02\x02" + + "\u019B\u019C\x03\x02\x02\x02\u019C\u01A0\x03\x02\x02\x02\u019D\u019E\x07" + + "\r\x02\x02\u019E\u01A0\x05N(\x02\u019F\u018F\x03\x02\x02\x02\u019F\u019D" + + "\x03\x02\x02\x02\u01A0%\x03\x02\x02\x02\u01A1\u01A2\x05L\'\x02\u01A2\'" + + "\x03\x02\x02\x02\u01A3\u01A4\b\x15\x01\x02\u01A4\u023A\x052\x1A\x02\u01A5" + + "\u01A6\x05B\"\x02\u01A6\u01A8\x07A\x02\x02\u01A7\u01A9\x05> \x02\u01A8" + + "\u01A7\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01AA\x03\x02" + + "\x02\x02\u01AA\u01AB\x07B\x02\x02\u01AB\u023A\x03\x02\x02\x02\u01AC\u01AD" + + "\x076\x02\x02\u01AD\u023A\x05(\x15\x1B\u01AE\u01AF\x05J&\x02\u01AF\u01B0" + + "\x07\"\x02\x02\u01B0\u01B1\x07@\x02\x02\u01B1\u01B2\x05(\x15\x17\u01B2" + + "\u023A\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\u023A\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\u023A" + + "\x03\x02\x02\x02\u01D1\u023A\x05*\x16\x02\u01D2\u01D3\x07#\x02\x02\u01D3" + + "\u01D4\x07\x04\x02\x02\u01D4\u01D9\x05(\x15\x02\u01D5\u01D6\x07\n\x02" + + "\x02\u01D6\u01D8\x05(\x15\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8\u01DB" + + "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02" + + "\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x07" + + "\n\x02\x02\u01DD\u01DC\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE" + + "\u01DF\x03\x02\x02\x02\u01DF\u01E0\x07\x05\x02\x02\u01E0\u023A\x03\x02" + + "\x02\x02\u01E1\u01E2\x07$\x02\x02\u01E2\u01E3\x07\x04\x02\x02\u01E3\u01E8" + + "\x05(\x15\x02\u01E4\u01E5\x07\n\x02\x02\u01E5\u01E7\x05(\x15\x02\u01E6" + + "\u01E4\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + + "\x02\x02\u01E8\u01E9\x03\x02\x02\x02\u01E9\u01EC\x03\x02\x02\x02\u01EA" + + "\u01E8\x03\x02\x02\x02\u01EB\u01ED\x07\n\x02\x02\u01EC\u01EB\x03\x02\x02" + + "\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + + "\x07\x05\x02\x02\u01EF\u023A\x03\x02\x02\x02\u01F0\u01F5\x05J&\x02\u01F1" + + "\u01F5\x07,\x02\x02\u01F2\u01F5\x07+\x02\x02\u01F3\u01F5\x07*\x02\x02" + + "\u01F4\u01F0\x03\x02\x02\x02\u01F4\u01F1\x03\x02\x02\x02\u01F4\u01F2\x03" + + "\x02\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F5\u023A\x03\x02\x02\x02\u01F6" + + "\u01F7\x07A\x02\x02\u01F7\u01F8\x05(\x15\x02"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC" + - "\u01FF\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE\u0200\x07\n\x02" + - "\x02\u01FF\u01FE\x03\x02\x02\x02\u01FF\u0200\x03\x02\x02\x02\u0200\u0201" + - "\x03\x02\x02\x02\u0201\u0202\x07B\x02\x02\u0202\u0237\x03\x02\x02\x02" + - "\u0203\u0204\x07\x04\x02\x02\u0204\u0209\x05@!\x02\u0205\u0206\x07\n\x02" + - "\x02\u0206\u0208\x05@!\x02\u0207\u0205\x03\x02\x02\x02\u0208\u020B\x03" + - "\x02\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u020A\x03\x02\x02\x02\u020A" + - "\u020D\x03\x02\x02\x02\u020B\u0209\x03\x02\x02\x02\u020C\u020E\x07\n\x02" + - "\x02\u020D\u020C\x03\x02\x02\x02\u020D\u020E\x03\x02\x02\x02\u020E\u020F" + - "\x03\x02\x02\x02\u020F\u0210\x07\x05\x02\x02\u0210\u0237\x03\x02\x02\x02" + - "\u0211\u021A\x07\x1C\x02\x02\u0212\u0217\x05(\x15\x02\u0213\u0214\x07" + - "\n\x02\x02\u0214\u0216\x05(\x15\x02\u0215\u0213\x03\x02\x02\x02\u0216" + - "\u0219\x03\x02\x02\x02\u0217\u0215\x03\x02\x02\x02\u0217\u0218\x03\x02" + - "\x02\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02\x02\x02\u021A" + - "\u0212\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02" + - "\x02\x02\u021C\u021E\x07\n\x02\x02\u021D\u021C\x03\x02\x02\x02\u021D\u021E" + - "\x03\x02\x02\x02\u021E\u021F\x03\x02\x02\x02\u021F\u0237\x07\x1D\x02\x02" + - "\u0220\u0221\x07%\x02\x02\u0221\u0222\x07A\x02\x02\u0222\u0223\x05(\x15" + - "\x02\u0223\u0224\x07B\x02\x02\u0224\u0225\x05(\x15\x02\u0225\u0226\x07" + - "&\x02\x02\u0226\u0227\x05(\x15\x07\u0227\u0237\x03\x02\x02\x02\u0228\u0229" + - "\x05\n\x06\x02\u0229\u022A\x05(\x15\x06\u022A\u0237\x03\x02\x02\x02\u022B" + - "\u022C\x05\x10\t\x02\u022C\u022D\x05(\x15\x05\u022D\u0237\x03\x02\x02" + - "\x02\u022E\u022F\x07A\x02\x02\u022F\u0230\x05(\x15\x02\u0230\u0231\x07" + - "B\x02\x02\u0231\u0237\x03\x02\x02\x02\u0232\u0233\x07\x04\x02\x02\u0233" + - "\u0234\x05(\x15\x02\u0234\u0235\x07\x05\x02\x02\u0235\u0237\x03\x02\x02" + - "\x02\u0236\u01A0\x03\x02\x02\x02\u0236\u01A2\x03\x02\x02\x02\u0236\u01A9" + - "\x03\x02\x02\x02\u0236\u01AB\x03\x02\x02\x02\u0236\u01B0\x03\x02\x02\x02" + - "\u0236\u01BF\x03\x02\x02\x02\u0236\u01CE\x03\x02\x02\x02\u0236\u01CF\x03" + - "\x02\x02\x02\u0236\u01DE\x03\x02\x02\x02\u0236\u01F1\x03\x02\x02\x02\u0236" + - "\u01F3\x03\x02\x02\x02\u0236\u0203\x03\x02\x02\x02\u0236\u0211\x03\x02" + - "\x02\x02\u0236\u0220\x03\x02\x02\x02\u0236\u0228\x03\x02\x02\x02\u0236" + - "\u022B\x03\x02\x02\x02\u0236\u022E\x03\x02\x02\x02\u0236\u0232\x03\x02" + - "\x02\x02\u0237\u0269\x03\x02\x02\x02\u0238\u0239\f\x1C\x02\x02\u0239\u023A" + - "\x07!\x02\x02\u023A\u0268\x05(\x15\x1C\u023B\u023C\f\x1A\x02\x02\u023C" + - "\u023D\t\x02\x02\x02\u023D\u0268\x05(\x15\x1B\u023E\u023F\f\x19\x02\x02" + - "\u023F\u0240\t\x03\x02\x02\u0240\u0268\x05(\x15\x1A\u0241\u0242\f\x18" + - "\x02\x02\u0242\u0243\t\x04\x02\x02\u0243\u0268\x05(\x15\x19\u0244\u0245" + - "\f\x16\x02\x02\u0245\u0246\x07@\x02\x02\u0246\u0247\x05(\x15\x17\u0247" + - "\u0248\b\x15\x01\x02\u0248\u0268\x03\x02\x02\x02\u0249\u024A\f\x14\x02" + - "\x02\u024A\u024B\x07-\x02\x02\u024B\u0268\x05(\x15\x15\u024C\u024D\f\x12" + - "\x02\x02\u024D\u024E\x07.\x02\x02\u024E\u0268\x05(\x15\x13\u024F\u0250" + - "\f\x11\x02\x02\u0250\u0251\x07/\x02\x02\u0251\u0268\x05(\x15\x12\u0252" + - "\u0253\f\x10\x02\x02\u0253\u0254\x070\x02\x02\u0254\u0268\x05(\x15\x11" + - "\u0255\u0256\f\n\x02\x02\u0256\u0257\x07\x1A\x02\x02\u0257\u0268\x05(" + - "\x15\v\u0258\u0259\f \x02\x02\u0259\u025A\x07\x16\x02\x02\u025A\u0260" + - "\x05D#\x02\u025B\u025D\x07A\x02\x02\u025C\u025E\x05> \x02\u025D\u025C" + - "\x03\x02\x02\x02\u025D\u025E\x03\x02\x02\x02\u025E\u025F\x03\x02\x02\x02" + - "\u025F\u0261\x07B\x02\x02\u0260\u025B\x03\x02\x02\x02\u0260\u0261\x03" + - "\x02\x02\x02\u0261\u0268\x03\x02\x02\x02\u0262\u0263\f\x1D\x02\x02\u0263" + - "\u0264\x07\x1C\x02\x02\u0264\u0265\x05(\x15\x02\u0265\u0266\x07\x1D\x02" + - "\x02\u0266\u0268\x03\x02\x02\x02\u0267\u0238\x03\x02\x02\x02\u0267\u023B" + - "\x03\x02\x02\x02\u0267\u023E\x03\x02\x02\x02\u0267\u0241\x03\x02\x02\x02" + - "\u0267\u0244\x03\x02\x02\x02\u0267\u0249\x03\x02\x02\x02\u0267\u024C\x03" + - "\x02\x02\x02\u0267\u024F\x03\x02\x02\x02\u0267\u0252\x03\x02\x02\x02\u0267" + - "\u0255\x03\x02\x02\x02\u0267\u0258\x03\x02\x02\x02\u0267\u0262\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\x074\x02\x02\u026D\u026E\x05(\x15\x02\u026E\u0270\x07" + - "\x04\x02\x02\u026F\u0271\x07\r\x02\x02\u0270\u026F\x03\x02\x02\x02\u0270" + - "\u0271\x03\x02\x02\x02\u0271\u0272\x03\x02\x02\x02\u0272\u0277\x05,\x17" + - "\x02\u0273\u0274\x07\r\x02\x02\u0274\u0276\x05,\x17\x02\u0275\u0273\x03" + - "\x02\x02\x02\u0276\u0279\x03\x02\x02\x02\u0277\u0275\x03\x02\x02\x02\u0277" + - "\u0278\x03\x02\x02\x02\u0278\u027A\x03\x02\x02\x02\u0279\u0277\x03\x02" + - "\x02\x02\u027A\u027B\x07\x05\x02\x02\u027B+\x03\x02\x02\x02\u027C\u027F" + - "\x05.\x18\x02\u027D\u027F\x07\'\x02\x02\u027E\u027C\x03\x02\x02\x02\u027E" + - "\u027D\x03\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0281\x07\x1B" + - "\x02\x02\u0281\u0282\x05(\x15\x02\u0282-\x03\x02\x02\x02\u0283\u028A\x05" + - "L\'\x02\u0284\u0287\x07A\x02\x02\u0285\u0288\x05L\'\x02\u0286\u0288\x07" + - "\'\x02\x02\u0287\u0285\x03\x02\x02\x02\u0287\u0286\x03\x02\x02\x02\u0288" + - "\u0289\x03\x02\x02\x02\u0289\u028B\x07B\x02\x02\u028A\u0284\x03\x02\x02" + - "\x02\u028A\u028B\x03\x02\x02\x02\u028B/\x03\x02\x02\x02\u028C\u028D\x05" + - "\b\x05\x02\u028D\u028E\x07\x02\x02\x03\u028E\u0296\x03\x02\x02\x02\u028F" + - "\u0290\x05(\x15\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0296\x03\x02\x02" + - "\x02\u0292\u0293\x07D\x02\x02\u0293\u0296\x07\x02\x02\x03\u0294\u0296" + - "\x07\x02\x02\x03\u0295\u028C\x03\x02\x02\x02\u0295\u028F\x03\x02\x02\x02" + - "\u0295\u0292\x03\x02\x02\x02\u0295\u0294\x03\x02\x02\x02\u02961\x03\x02" + - "\x02\x02\u0297\u029A\x054\x1B\x02\u0298\u029A\x056\x1C\x02\u0299\u0297" + - "\x03\x02\x02\x02\u0299\u0298\x03\x02\x02\x02\u029A3\x03\x02\x02\x02\u029B" + - "\u029C\x05:\x1E\x02\u029C\u029D\x07\x1B\x02\x02\u029D\u029E\x05(\x15\x02" + - "\u029E\u02AD\x03\x02\x02\x02\u029F\u02A0\x07A\x02\x02\u02A0\u02A5\x05" + - ":\x1E\x02\u02A1\u02A2\x07\n\x02\x02\u02A2\u02A4\x05:\x1E\x02\u02A3\u02A1" + - "\x03\x02\x02\x02\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02" + - "\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03" + - "\x02\x02\x02\u02A8\u02A9\x07B\x02\x02\u02A9\u02AA\x07\x1B\x02\x02\u02AA" + - "\u02AB\x05(\x15\x02\u02AB\u02AD\x03\x02\x02\x02\u02AC\u029B\x03\x02\x02" + - "\x02\u02AC\u029F\x03\x02\x02\x02\u02AD5\x03\x02\x02\x02\u02AE\u02AF\x07" + - "A\x02\x02\u02AF\u02B0\x07A\x02\x02\u02B0\u02B3\x05:\x1E\x02\u02B1\u02B2" + - "\x07\n\x02\x02\u02B2\u02B4\x05:\x1E\x02\u02B3\u02B1\x03\x02\x02\x02\u02B4" + - "\u02B5\x03\x02\x02\x02\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02" + - "\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B7\u02B8\x07B\x02\x02\u02B8\u02B9" + - "\x07B\x02\x02\u02B9\u02BA\x07\x1B\x02\x02\u02BA\u02BB\x05(\x15\x02\u02BB" + - "7\x03\x02\x02\x02\u02BC\u02BF\x07\'\x02\x02\u02BD\u02BF\x05J&\x02\u02BE" + - "\u02BC\x03\x02\x02\x02\u02BE\u02BD\x03\x02\x02\x02\u02BF9\x03\x02\x02" + - "\x02\u02C0\u02C1\x058\x1D\x02\u02C1;\x03\x02\x02\x02\u02C2\u02C5\x077" + - "\x02\x02\u02C3\u02C5\x05J&\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3" + - "\x03\x02\x02\x02\u02C5=\x03\x02\x02\x02\u02C6\u02CB\x05(\x15\x02\u02C7" + - "\u02C8\x07\n\x02\x02\u02C8\u02CA\x05(\x15\x02\u02C9\u02C7\x03\x02\x02" + - "\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02\u02CB\u02CC" + - "\x03\x02\x02\x02\u02CC?\x03\x02\x02\x02\u02CD\u02CB\x03\x02\x02\x02\u02CE" + - "\u02CF\x05L\'\x02\u02CF\u02D0\x07\x07\x02\x02\u02D0\u02D1\x05(\x15\x02" + - "\u02D1\u02D5\x03\x02\x02\x02\u02D2\u02D3\x07(\x02\x02\u02D3\u02D5\x05" + - "(\x15\x02\u02D4\u02CE\x03\x02\x02\x02\u02D4\u02D2\x03\x02\x02\x02\u02D5" + - "A\x03\x02\x02\x02\u02D6\u02D9\x05J&\x02\u02D7\u02D9\t\x05\x02\x02\u02D8" + - "\u02D6\x03\x02\x02\x02\u02D8\u02D7\x03\x02\x02\x02\u02D9C\x03\x02\x02" + - "\x02\u02DA\u02DD\x05J&\x02\u02DB\u02DD\t\x06\x02\x02\u02DC\u02DA\x03\x02" + - "\x02\x02\u02DC\u02DB\x03\x02\x02\x02\u02DDE\x03\x02\x02\x02\u02DE\u02DF" + - "\t\x07\x02\x02\u02DFG\x03\x02\x02\x02\u02E0\u02E1\t\b\x02\x02\u02E1I\x03" + - "\x02\x02\x02\u02E2\u02E7\x07C\x02\x02\u02E3\u02E4\x07)\x02\x02\u02E4\u02E6" + - "\x07C\x02\x02\u02E5\u02E3\x03\x02\x02\x02\u02E6\u02E9\x03\x02\x02\x02" + - "\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E8\x03\x02\x02\x02\u02E8K\x03\x02" + - "\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EA\u02EF\x07C\x02\x02\u02EB\u02EC" + - "\x05J&\x02\u02EC\u02ED\b\'\x01\x02\u02ED\u02EF\x03\x02\x02\x02\u02EE\u02EA" + - "\x03\x02\x02\x02\u02EE\u02EB\x03\x02\x02\x02\u02EFM\x03\x02\x02\x02TQ" + - "Xai\x82\x8C\x8F\x94\xA3\xAA\xAE\xB1\xBE\xC5\xC8\xCF\xD5\xDA\xE5\xED\xF3" + - "\xF7\xF9\u0104\u0106\u0115\u011D\u012C\u0134\u0136\u0147\u014A\u014D\u0164" + - "\u0168\u0178\u0180\u0182\u018C\u0196\u0198\u019C\u01A5\u01B7\u01BB\u01C6" + - "\u01CA\u01D6\u01DA\u01E5\u01E9\u01F1\u01FB\u01FF\u0209\u020D\u0217\u021A" + - "\u021D\u0236\u025D\u0260\u0267\u0269\u0270\u0277\u027E\u0287\u028A\u0295" + - "\u0299\u02A5\u02AC\u02B5\u02BE\u02C4\u02CB\u02D4\u02D8\u02DC\u02E7\u02EE"; + "\u01F8\u01F9\x07\n\x02\x02\u01F9\u01FE\x05(\x15\x02\u01FA\u01FB\x07\n" + + "\x02\x02\u01FB\u01FD\x05(\x15\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u0200" + + "\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FE\u01FF\x03\x02\x02\x02" + + "\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0203\x07" + + "\n\x02\x02\u0202\u0201\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + + "\u0204\x03\x02\x02\x02\u0204\u0205\x07B\x02\x02\u0205\u023A\x03\x02\x02" + + "\x02\u0206\u0207\x07\x04\x02\x02\u0207\u020C\x05@!\x02\u0208\u0209\x07" + + "\n\x02\x02\u0209\u020B\x05@!\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E" + + "\x03\x02\x02\x02\u020C\u020A\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02" + + "\u020D\u0210\x03\x02\x02\x02\u020E\u020C\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\u0213\x07\x05\x02\x02\u0213\u023A\x03\x02" + + "\x02\x02\u0214\u021D\x07\x1C\x02\x02\u0215\u021A\x05(\x15\x02\u0216\u0217" + + "\x07\n\x02\x02\u0217\u0219\x05(\x15\x02\u0218\u0216\x03\x02\x02\x02\u0219" + + "\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A\u021B\x03\x02" + + "\x02\x02\u021B\u021E\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021D" + + "\u0215\x03\x02\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E\u0220\x03\x02" + + "\x02\x02\u021F\u0221\x07\n\x02\x02\u0220\u021F\x03\x02\x02\x02\u0220\u0221" + + "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u023A\x07\x1D\x02\x02" + + "\u0223\u0224\x07%\x02\x02\u0224\u0225\x07A\x02\x02\u0225\u0226\x05(\x15" + + "\x02\u0226\u0227\x07B\x02\x02\u0227\u0228\x05(\x15\x02\u0228\u0229\x07" + + "&\x02\x02\u0229\u022A\x05(\x15\x07\u022A\u023A\x03\x02\x02\x02\u022B\u022C" + + "\x05\n\x06\x02\u022C\u022D\x05(\x15\x06\u022D\u023A\x03\x02\x02\x02\u022E" + + "\u022F\x05\x10\t\x02\u022F\u0230\x05(\x15\x05\u0230\u023A\x03\x02\x02" + + "\x02\u0231\u0232\x07A\x02\x02\u0232\u0233\x05(\x15\x02\u0233\u0234\x07" + + "B\x02\x02\u0234\u023A\x03\x02\x02\x02\u0235\u0236\x07\x04\x02\x02\u0236" + + "\u0237\x05(\x15\x02\u0237\u0238\x07\x05\x02\x02\u0238\u023A\x03\x02\x02" + + "\x02\u0239\u01A3\x03\x02\x02\x02\u0239\u01A5\x03\x02\x02\x02\u0239\u01AC" + + "\x03\x02\x02\x02\u0239\u01AE\x03\x02\x02\x02\u0239\u01B3\x03\x02\x02\x02" + + "\u0239\u01C2\x03\x02\x02\x02\u0239\u01D1\x03\x02\x02\x02\u0239\u01D2\x03" + + "\x02\x02\x02\u0239\u01E1\x03\x02\x02\x02\u0239\u01F4\x03\x02\x02\x02\u0239" + + "\u01F6\x03\x02\x02\x02\u0239\u0206\x03\x02\x02\x02\u0239\u0214\x03\x02" + + "\x02\x02\u0239\u0223\x03\x02\x02\x02\u0239\u022B\x03\x02\x02\x02\u0239" + + "\u022E\x03\x02\x02\x02\u0239\u0231\x03\x02\x02\x02\u0239\u0235\x03\x02" + + "\x02\x02\u023A\u026C\x03\x02\x02\x02\u023B\u023C\f\x1C\x02\x02\u023C\u023D" + + "\x07!\x02\x02\u023D\u026B\x05(\x15\x1C\u023E\u023F\f\x1A\x02\x02\u023F" + + "\u0240\t\x02\x02\x02\u0240\u026B\x05(\x15\x1B\u0241\u0242\f\x19\x02\x02" + + "\u0242\u0243\t\x03\x02\x02\u0243\u026B\x05(\x15\x1A\u0244\u0245\f\x18" + + "\x02\x02\u0245\u0246\t\x04\x02\x02\u0246\u026B\x05(\x15\x19\u0247\u0248" + + "\f\x16\x02\x02\u0248\u0249\x07@\x02\x02\u0249\u024A\x05(\x15\x17\u024A" + + "\u024B\b\x15\x01\x02\u024B\u026B\x03\x02\x02\x02\u024C\u024D\f\x14\x02" + + "\x02\u024D\u024E\x07-\x02\x02\u024E\u026B\x05(\x15\x15\u024F\u0250\f\x12" + + "\x02\x02\u0250\u0251\x07.\x02\x02\u0251\u026B\x05(\x15\x13\u0252\u0253" + + "\f\x11\x02\x02\u0253\u0254\x07/\x02\x02\u0254\u026B\x05(\x15\x12\u0255" + + "\u0256\f\x10\x02\x02\u0256\u0257\x070\x02\x02\u0257\u026B\x05(\x15\x11" + + "\u0258\u0259\f\n\x02\x02\u0259\u025A\x07\x1A\x02\x02\u025A\u026B\x05(" + + "\x15\v\u025B\u025C\f \x02\x02\u025C\u025D\x07\x16\x02\x02\u025D\u0263" + + "\x05D#\x02\u025E\u0260\x07A\x02\x02\u025F\u0261\x05> \x02\u0260\u025F" + + "\x03\x02\x02\x02\u0260\u0261\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02" + + "\u0262\u0264\x07B\x02\x02\u0263\u025E\x03\x02\x02\x02\u0263\u0264\x03" + + "\x02\x02\x02\u0264\u026B\x03\x02\x02\x02\u0265\u0266\f\x1D\x02\x02\u0266" + + "\u0267\x07\x1C\x02\x02\u0267\u0268\x05(\x15\x02\u0268\u0269\x07\x1D\x02" + + "\x02\u0269\u026B\x03\x02\x02\x02\u026A\u023B\x03\x02\x02\x02\u026A\u023E" + + "\x03\x02\x02\x02\u026A\u0241\x03\x02\x02\x02\u026A\u0244\x03\x02\x02\x02" + + "\u026A\u0247\x03\x02\x02\x02\u026A\u024C\x03\x02\x02\x02\u026A\u024F\x03" + + "\x02\x02\x02\u026A\u0252\x03\x02\x02\x02\u026A\u0255\x03\x02\x02\x02\u026A" + + "\u0258\x03\x02\x02\x02\u026A\u025B\x03\x02\x02\x02\u026A\u0265\x03\x02" + + "\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C\u026A\x03\x02\x02\x02\u026C" + + "\u026D\x03\x02\x02\x02\u026D)\x03\x02\x02\x02\u026E\u026C\x03\x02\x02" + + "\x02\u026F\u0270\x074\x02\x02\u0270\u0271\x05(\x15\x02\u0271\u0273\x07" + + "\x04\x02\x02\u0272\u0274\x07\r\x02\x02\u0273\u0272\x03\x02\x02\x02\u0273" + + "\u0274\x03\x02\x02\x02\u0274\u0275\x03\x02\x02\x02\u0275\u027A\x05,\x17" + + "\x02\u0276\u0277\x07\r\x02\x02\u0277\u0279\x05,\x17\x02\u0278\u0276\x03" + + "\x02\x02\x02\u0279\u027C\x03\x02\x02\x02\u027A\u0278\x03\x02\x02\x02\u027A" + + "\u027B\x03\x02\x02\x02\u027B\u027D\x03\x02\x02\x02\u027C\u027A\x03\x02" + + "\x02\x02\u027D\u027E\x07\x05\x02\x02\u027E+\x03\x02\x02\x02\u027F\u0282" + + "\x05.\x18\x02\u0280\u0282\x07\'\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281" + + "\u0280\x03\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0284\x07\x1B" + + "\x02\x02\u0284\u0285\x05(\x15\x02\u0285-\x03\x02\x02\x02\u0286\u028D\x05" + + "L\'\x02\u0287\u028A\x07A\x02\x02\u0288\u028B\x05L\'\x02\u0289\u028B\x07" + + "\'\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + + "\u028C\x03\x02\x02\x02\u028C\u028E\x07B\x02\x02\u028D\u0287\x03\x02\x02" + + "\x02\u028D\u028E\x03\x02\x02\x02\u028E/\x03\x02\x02\x02\u028F\u0290\x05" + + "\b\x05\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0299\x03\x02\x02\x02\u0292" + + "\u0293\x05(\x15\x02\u0293\u0294\x07\x02\x02\x03\u0294\u0299\x03\x02\x02" + + "\x02\u0295\u0296\x07E\x02\x02\u0296\u0299\x07\x02\x02\x03\u0297\u0299" + + "\x07\x02\x02\x03\u0298\u028F\x03\x02\x02\x02\u0298\u0292\x03\x02\x02\x02" + + "\u0298\u0295\x03\x02\x02\x02\u0298\u0297\x03\x02\x02\x02\u02991\x03\x02" + + "\x02\x02\u029A\u029D\x054\x1B\x02\u029B\u029D\x056\x1C\x02\u029C\u029A" + + "\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02\u029D3\x03\x02\x02\x02\u029E" + + "\u029F\x05:\x1E\x02\u029F\u02A0\x07\x1B\x02\x02\u02A0\u02A1\x05(\x15\x02" + + "\u02A1\u02B0\x03\x02\x02\x02\u02A2\u02A3\x07A\x02\x02\u02A3\u02A8\x05" + + ":\x1E\x02\u02A4\u02A5\x07\n\x02\x02\u02A5\u02A7\x05:\x1E\x02\u02A6\u02A4" + + "\x03\x02\x02\x02\u02A7\u02AA\x03\x02\x02\x02\u02A8\u02A6\x03\x02\x02\x02" + + "\u02A8\u02A9\x03\x02\x02\x02\u02A9\u02AB\x03\x02\x02\x02\u02AA\u02A8\x03" + + "\x02\x02\x02\u02AB\u02AC\x07B\x02\x02\u02AC\u02AD\x07\x1B\x02\x02\u02AD" + + "\u02AE\x05(\x15\x02\u02AE\u02B0\x03\x02\x02\x02\u02AF\u029E\x03\x02\x02" + + "\x02\u02AF\u02A2\x03\x02\x02\x02\u02B05\x03\x02\x02\x02\u02B1\u02B2\x07" + + "A\x02\x02\u02B2\u02B3\x07A\x02\x02\u02B3\u02B6\x05:\x1E\x02\u02B4\u02B5" + + "\x07\n\x02\x02\u02B5\u02B7\x05:\x1E\x02\u02B6\u02B4\x03\x02\x02\x02\u02B7" + + "\u02B8\x03\x02\x02\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02" + + "\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x07B\x02\x02\u02BB\u02BC" + + "\x07B\x02\x02\u02BC\u02BD\x07\x1B\x02\x02\u02BD\u02BE\x05(\x15\x02\u02BE" + + "7\x03\x02\x02\x02\u02BF\u02C2\x07\'\x02\x02\u02C0\u02C2\x05J&\x02\u02C1" + + "\u02BF\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C29\x03\x02\x02" + + "\x02\u02C3\u02C4\x058\x1D\x02\u02C4;\x03\x02\x02\x02\u02C5\u02C8\x077" + + "\x02\x02\u02C6\u02C8\x05J&\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7\u02C6" + + "\x03\x02\x02\x02\u02C8=\x03\x02\x02\x02\u02C9\u02CE\x05(\x15\x02\u02CA" + + "\u02CB\x07\n\x02\x02\u02CB\u02CD\x05(\x15\x02\u02CC\u02CA\x03\x02\x02" + + "\x02\u02CD\u02D0\x03\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CE\u02CF" + + "\x03\x02\x02\x02\u02CF?\x03\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D1" + + "\u02D2\x05L\'\x02\u02D2\u02D3\x07\x07\x02\x02\u02D3\u02D4\x05(\x15\x02" + + "\u02D4\u02D8\x03\x02\x02\x02\u02D5\u02D6\x07(\x02\x02\u02D6\u02D8\x05" + + "(\x15\x02\u02D7\u02D1\x03\x02\x02\x02\u02D7\u02D5\x03\x02\x02\x02\u02D8" + + "A\x03\x02\x02\x02\u02D9\u02DC\x05J&\x02\u02DA\u02DC\t\x05\x02\x02\u02DB" + + "\u02D9\x03\x02\x02\x02\u02DB\u02DA\x03\x02\x02\x02\u02DCC\x03\x02\x02" + + "\x02\u02DD\u02E0\x05J&\x02\u02DE\u02E0\t\x06\x02\x02\u02DF\u02DD\x03\x02" + + "\x02\x02\u02DF\u02DE\x03\x02\x02\x02\u02E0E\x03\x02\x02\x02\u02E1\u02E2" + + "\t\x07\x02\x02\u02E2G\x03\x02\x02\x02\u02E3\u02E4\t\b\x02\x02\u02E4I\x03" + + "\x02\x02\x02\u02E5\u02EA\x05N(\x02\u02E6\u02E7\x07)\x02\x02\u02E7\u02E9" + + "\x05N(\x02\u02E8\u02E6\x03\x02\x02\x02\u02E9\u02EC\x03\x02\x02\x02\u02EA" + + "\u02E8\x03\x02\x02\x02\u02EA\u02EB\x03\x02\x02\x02\u02EBK\x03\x02\x02" + + "\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED\u02F2\x05N(\x02\u02EE\u02EF\x05" + + "J&\x02\u02EF\u02F0\b\'\x01\x02\u02F0\u02F2\x03\x02\x02\x02\u02F1\u02ED" + + "\x03\x02\x02\x02\u02F1\u02EE\x03\x02\x02\x02\u02F2M\x03\x02\x02\x02\u02F3" + + "\u02F4\t\t\x02\x02\u02F4O\x03\x02\x02\x02TSZck\x84\x8E\x91\x96\xA5\xAC" + + "\xB0\xB3\xC0\xC7\xCA\xD1\xD7\xDC\xE7\xEF\xF5\xF9\xFB\u0106\u0108\u0117" + + "\u011F\u012E\u0136\u0138\u0149\u014C\u014F\u0166\u016A\u017B\u0183\u0185" + + "\u018F\u0199\u019B\u019F\u01A8\u01BA\u01BE\u01C9\u01CD\u01D9\u01DD\u01E8" + + "\u01EC\u01F4\u01FE\u0202\u020C\u0210\u021A\u021D\u0220\u0239\u0260\u0263" + + "\u026A\u026C\u0273\u027A\u0281\u028A\u028D\u0298\u029C\u02A8\u02AF\u02B8" + + "\u02C1\u02C7\u02CE\u02D7\u02DB\u02DF\u02EA\u02F1"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -5041,7 +5101,34 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeConstOrVarContext extends TypeContext { +export class TypeVarContext extends TypeContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class TypeConstContext extends TypeContext { public qualId(): QualIdContext { return this.getRuleContext(0, QualIdContext); } @@ -5051,20 +5138,20 @@ export class TypeConstOrVarContext extends TypeContext { } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeConstOrVar) { - listener.enterTypeConstOrVar(this); + if (listener.enterTypeConst) { + listener.enterTypeConst(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeConstOrVar) { - listener.exitTypeConstOrVar(this); + if (listener.exitTypeConst) { + listener.exitTypeConst(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeConstOrVar) { - return visitor.visitTypeConstOrVar(this); + if (visitor.visitTypeConst) { + return visitor.visitTypeConst(this); } else { return visitor.visitChildren(this); } @@ -5104,7 +5191,7 @@ export class TypeParenContext extends TypeContext { export class RowContext extends ParserRuleContext { - public _rowVar!: Token; + public _rowVar!: IdentifierContext; public rowLabel(): RowLabelContext[]; public rowLabel(i: number): RowLabelContext; public rowLabel(i?: number): RowLabelContext | RowLabelContext[] { @@ -5123,7 +5210,9 @@ export class RowContext extends ParserRuleContext { return this.getRuleContext(i, TypeContext); } } - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); } @@ -6856,13 +6945,13 @@ export class LiteralContext extends ParserRuleContext { export class QualIdContext extends ParserRuleContext { - public IDENTIFIER(): TerminalNode[]; - public IDENTIFIER(i: number): TerminalNode; - public IDENTIFIER(i?: number): TerminalNode | TerminalNode[] { + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext; + public identifier(i?: number): IdentifierContext | IdentifierContext[] { if (i === undefined) { - return this.getTokens(QuintParser.IDENTIFIER); + return this.getRuleContexts(IdentifierContext); } else { - return this.getToken(QuintParser.IDENTIFIER, i); + return this.getRuleContext(i, IdentifierContext); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { @@ -6896,7 +6985,9 @@ export class QualIdContext extends ParserRuleContext { export class SimpleIdContext extends ParserRuleContext { public context: string; public _qualId!: QualIdContext; - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } public qualId(): QualIdContext | undefined { return this.tryGetRuleContext(0, QualIdContext); } @@ -6929,3 +7020,34 @@ export class SimpleIdContext extends ParserRuleContext { } +export class IdentifierContext extends ParserRuleContext { + public LOW_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LOW_ID, 0); } + public CAP_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.CAP_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_identifier; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterIdentifier) { + listener.enterIdentifier(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitIdentifier) { + listener.exitIdentifier(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitIdentifier) { + return visitor.visitIdentifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + + diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 2c31cc191..19a707994 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -18,7 +18,8 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; @@ -99,6 +100,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -182,12 +184,20 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeConstOrVar` + * Visit a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => Result; + visitTypeVar?: (ctx: TypeVarContext) => Result; + + /** + * Visit a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeConst?: (ctx: TypeConstContext) => Result; /** * Visit a parse tree produced by the `typeParen` @@ -790,5 +800,12 @@ export interface QuintVisitor extends ParseTreeVisitor { * @return the visitor result */ visitSimpleId?: (ctx: SimpleIdContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIdentifier?: (ctx: IdentifierContext) => Result; } diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index a182ffb1d..32b335531 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From 739c0efbb69aa1ca14c241068167c7872176f128 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:54:53 -0500 Subject: [PATCH 180/428] Add regression test for #1336 --- quint/test/types/parser.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 7454f8991..762a55f53 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -46,6 +46,17 @@ describe('parseType', () => { ) }) + // Regression test for https://github.com/informalsystems/quint/issues/1336 + it('parses qualified type constants', () => { + const type = parseType('modname::TypeConstructor') + + assert.isTrue(type.isRight()) + type.map(value => { + assert(value.kind === 'const') + assert.deepEqual(value.name, 'modname::TypeConstructor') + }) + }) + it('parses function of const types', () => { const type = parseType('T1 -> (T2 -> T1)') From 92b09dd91d1dde9bf913c17bc06c2b5b697c7b48 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:02:01 -0500 Subject: [PATCH 181/428] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a935176..e8b1aefa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed parsing of qualified type constructors, which were being misinterpreted + as type variables when the name of the qualifying module started with a + lowercase letter (#1337). + ### Security ## v0.18.0 -- 2024-01-03 From d246e0b038b518c55ead75965f22d86f479978bf Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:22:33 -0500 Subject: [PATCH 182/428] Update examples/spells/BoundedUInt.qnt Co-authored-by: Gabriela Moreira --- examples/spells/BoundedUInt.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index 6c8d28531..4a8d35b8a 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -38,7 +38,7 @@ module BoundedUInt { def bind(u: UIntT, f: (int => UIntT)): UIntT = match u { | Ok(i) => f(i) | Err(_) => u - } + } /// `f.app(u, v, msg)` is `UInt(f(x,y))` if `u` is `Ok(x)` and `v` is `Ok(y)`. /// If `UInt(f(x,y))` is out of range, it is `Err(msg)`. From 11ab08bc400c64bd9eefb74cc9a71d4757e78c51 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:22:43 -0500 Subject: [PATCH 183/428] Update examples/spells/BoundedUInt.qnt Co-authored-by: Gabriela Moreira --- examples/spells/BoundedUInt.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index 4a8d35b8a..c67217c69 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -15,7 +15,7 @@ module BoundedUInt { /// /// NOTE: values of this type must only be constructed using `UInt`, /// and never via `Ok` or `Err` directly. - // TODO: Replacce with polymorphic result type, once that is avainable + // TODO: Replace with polymorphic result type, once that is available // See https://github.com/informalsystems/quint/issues/1073 type UIntT = Ok(int) | Err(str) From 21f2129bee3270b10b6d8263f00364d3a56833a4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:25:10 -0500 Subject: [PATCH 184/428] Explain eta-expansion --- examples/spells/BoundedUInt.qnt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index c67217c69..5203b194c 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -60,6 +60,10 @@ module BoundedUInt { // CHECKED OPERATIONS // //////////////////////// + // TODO: In the following we have to eta-expand calls to `ifoo` builtins + // due to https://github.com/informalsystems/quint/issues/1332 + // We should simplify those once this issue with the simulator is fixed. + /// Checked integer addition. /// Errors with "overflow" pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => iadd(x,y)).app(lhs, rhs, "overflow") From 4924302c48bbb465d879132e66c4804327b034ea Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:35:28 -0500 Subject: [PATCH 185/428] Fix failing integration test There is no need to have this test output require updates any time we change the grammar. --- quint/io-cli-tests.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 232a4653b..830f2f659 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -271,18 +271,12 @@ echo -e "init\nMyF::ExportedBasics::double(2)" | quint -r ../examples/language-f ``` -echo -e "1 +" | quint | tail -n +3 +echo -e "1 +" | quint | grep -o 'syntax error: error: \[QNT000\]' ``` ``` ->>> [DEBUG] generating undefined expr to fill hole in: 1+ -syntax error: error: [QNT000] mismatched input '' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER} - - - - ->>> +syntax error: error: [QNT000] ``` From cc500192b6a2e03be5941ba04782f4e70a951e44 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:40:01 -0500 Subject: [PATCH 186/428] Remove outdated comment --- quint/src/generated/Quint.g4 | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index f57968779..6cb27d16f 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -288,7 +288,6 @@ ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; -// other TLA+ identifiers // An identifier starting with lowercase LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; // An identifier starting with uppercase From ce3e0453b90b7689001be9875bc517f5221d1857 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:55:05 -0500 Subject: [PATCH 187/428] Run CI in the merge queue --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 55a7720c5..f98f79531 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,6 +3,9 @@ on: # Every pull request pull_request: + # When part of a merge queue + # See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions + merge_group: # Pushes into the trunk # This is important to ensure the trunk is not broken and # to populate the cache for future PRs. From 9ae46b09805b6916db2185e748ee6df7010cc826 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 15:37:18 -0300 Subject: [PATCH 188/428] Ensure runtime errors are reported in simulation --- quint/io-cli-tests.md | 2 +- quint/src/cliCommands.ts | 38 +++++++++++++++++--------------------- quint/src/simulation.ts | 7 ++++++- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 232a4653b..00ffa4df7 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -966,7 +966,7 @@ HOME/_1041compileConst.qnt:5:24 - error: [QNT502] Name N not found 5: action init = { x' = N } ^ -error: run failed +error: Runtime error ``` ### Repl keeps right track of variables from instances diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 06ab55abf..4c8e254e6 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -66,7 +66,7 @@ interface OutputStage { failed?: string[] ignored?: string[] // Test names output produced by 'run' - status?: 'ok' | 'violation' | 'failure' + status?: 'ok' | 'violation' | 'failure' | 'error' trace?: QuintEx[] /* Docstrings by definition name by module name */ documentation?: Map> @@ -530,11 +530,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise 0) { + status = 'error' + } + return { status: status, vars: evaluationState.vars.map(v => v.name), states: topFrame.args.map(e => e.toQuintEx(idGen)), frames: topFrame.subframes, - errors: ctx.getRuntimeErrors(), + errors: errors, seed: recorder.getBestTraceSeed(), } } From dcda6c71cae458023283e6afbee1bf7b5efa0dd3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 15:46:28 -0300 Subject: [PATCH 189/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a935176..b4fc3159c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -305,6 +305,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed an issue where, sometimes, runtime errors were not reported in + simulation (#1339) + ### Security ## v0.11.1 -- 2023-06-01 From 521f300ba4b96363928cfba35188a8578765cb51 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 16:40:49 -0300 Subject: [PATCH 190/428] Update comment for status attribute --- quint/src/cliCommands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 4c8e254e6..600f61f3f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -65,7 +65,7 @@ interface OutputStage { passed?: string[] failed?: string[] ignored?: string[] - // Test names output produced by 'run' + // Possible results from 'run' status?: 'ok' | 'violation' | 'failure' | 'error' trace?: QuintEx[] /* Docstrings by definition name by module name */ From f64242f18eed276419a3bddd34d0e497012c285d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Jan 2024 18:25:37 -0300 Subject: [PATCH 191/428] Release v0.18.1 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70f33d21..91c1f0fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.1 -- 2024-01-16 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 096e6597a..b86cf5d2e 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7fc8c4a72..a1e268ae5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 1aff2dbe7..9e6c4eefb 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.0' +export const version = '0.18.1' From 19006a08204a92805a57a6ac6ddf07cb442ef66d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Jan 2024 18:25:37 -0300 Subject: [PATCH 192/428] Release v0.18.1 --- CHANGELOG.md | 14 +++++++++++--- quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70f33d21..55600156c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.1 -- 2024-01-16 + ### Added ### Changed ### Deprecated @@ -16,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed parsing of qualified type constructors, which were being misinterpreted as type variables when the name of the qualifying module started with a lowercase letter (#1337). +- Fixed an issue where, sometimes, runtime errors were not reported in + simulation (#1339) ### Security @@ -311,9 +322,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- Fixed an issue where, sometimes, runtime errors were not reported in - simulation (#1339) - ### Security ## v0.11.1 -- 2023-06-01 diff --git a/quint/package-lock.json b/quint/package-lock.json index 096e6597a..b86cf5d2e 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7fc8c4a72..a1e268ae5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 1aff2dbe7..9e6c4eefb 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.0' +export const version = '0.18.1' From c2379e2345133d5f599bdb54179d62c2739fe017 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 16 Jan 2024 19:49:08 -0500 Subject: [PATCH 193/428] VSCode Release v0.13.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 609132a83..38cfc2d55 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.1 -- 2024-01-16 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.0 -- 2024-01-03 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 40be843ee..9aa7ebee9 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.0", + "version": "0.13.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.0", + "version": "0.13.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index f6c62ac88..b4b0221bb 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.0", + "version": "0.13.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 79b1dcba0..c7a4a6808 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.0", + "version": "0.13.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.0", + "version": "0.13.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.0", + "@informalsystems/quint": "^0.18.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", - "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", + "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", - "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", + "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 2289fc60f..ae36975f3 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.0", + "version": "0.13.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.0", + "@informalsystems/quint": "^0.18.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 334d1e2d03a2215a7e6ca882f95b1c2965d4ecc8 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 17:24:09 -0300 Subject: [PATCH 194/428] Manipulate runtime error messages in the simulator so they include the location (in a temporary hacky way) --- quint/src/simulation.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 90a117597..8203b8f93 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -18,6 +18,9 @@ import { IdGenerator } from './idGenerator' import { Rng } from './rng' import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' +import { mkErrorMessage } from './cliCommands' +import { createFinders, formatError } from './errorReporter' +import { uniqBy } from 'lodash' /** * Various settings that have to be passed to the simulator to run. @@ -129,8 +132,17 @@ export function compileAndRun( console.error('No trace recorded') } - const errors = ctx.getRuntimeErrors() + let errors = ctx.getRuntimeErrors() if (errors.length > 0) { + const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) + const finders = createFinders(code) + errors = errors.map(error => ({ + code: error.code, + message: formatError(code, finders, { + ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + explanation: error.message, + }), + })) status = 'error' } From 3648c3e54d8423cd5b4211a1255351c570475eef Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 17:25:53 -0300 Subject: [PATCH 195/428] Add FIXME comment --- quint/src/simulation.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 8203b8f93..2f1f6955d 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -134,6 +134,7 @@ export function compileAndRun( let errors = ctx.getRuntimeErrors() if (errors.length > 0) { + // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) const finders = createFinders(code) errors = errors.map(error => ({ @@ -143,6 +144,7 @@ export function compileAndRun( explanation: error.message, }), })) + status = 'error' } From c52fdd65a133e7a08c0e7264bb934d626ae414eb Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 19:18:48 -0300 Subject: [PATCH 196/428] Remove unused import --- quint/src/simulation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 2f1f6955d..32215d871 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -20,7 +20,6 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' -import { uniqBy } from 'lodash' /** * Various settings that have to be passed to the simulator to run. From cf19c5d1a5076f783a65aa7e90b72740a59e13ee Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 19:26:34 -0300 Subject: [PATCH 197/428] Add explanatory comments --- quint/src/simulation.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 32215d871..a2061b9bc 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -134,16 +134,26 @@ export function compileAndRun( let errors = ctx.getRuntimeErrors() if (errors.length > 0) { // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` + // The evaluated code source is not included in the context, so we crete a version with it for the error reporter const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) const finders = createFinders(code) + errors = errors.map(error => ({ code: error.code, + // Include the location information (locs) in the error message - this + // is the hacky part, as it should only be included at the CLI level message: formatError(code, finders, { + // This will create the `locs` attribute and an explanation ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + // We override the explanation to keep the original one to avoid + // duplication, since `mkErrorMessage` will be called again at the CLI + // level. `locs` won't be touched then because this error doesn't + // include a `reference` field explanation: error.message, }), })) + // This should be kept after the hack is removed status = 'error' } From dbd3db685869dc4fa1415db015f3de203303e29c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 17:59:54 -0500 Subject: [PATCH 198/428] Organize run and test setup consistently To help make it clear the limit of the duplicate logic --- quint/src/cliCommands.ts | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 600f61f3f..29e2ed511 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -301,14 +301,10 @@ export async function runRepl(_argv: any) { * @param typedStage the procedure stage produced by `typecheck` */ export async function runTests(prev: TypecheckedStage): Promise> { + // TODO: Logic should be consistent with runSimulator? const verbosityLevel = !prev.args.out ? prev.args.verbosity : 0 - const out = console.log - const columns = !prev.args.out ? terminalWidth() : 80 - - const testing = { ...prev, stage: 'testing' as stage } const mainName = guessMainModule(prev) - - const outputTemplate = testing.args.output + const testing = { ...prev, stage: 'testing' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -346,6 +342,22 @@ export async function runTests(prev: TypecheckedStage): Promise> { - const simulator = { ...prev, stage: 'running' as stage } - const mainName = guessMainModule(prev) const verbosityLevel = !prev.args.out && !prev.args.outItf ? prev.args.verbosity : 0 + const mainName = guessMainModule(prev) + const simulator = { ...prev, stage: 'running' as stage } + const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { return cliErr(rngOrError.value, { ...simulator, errors: [] }) } const rng = rngOrError.unwrap() + const options: SimulatorOptions = { init: prev.args.init, step: prev.args.step, From add5cf59633b59cb24e36d3eb4a1ab00740484c3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 19:08:47 -0500 Subject: [PATCH 199/428] Identify compilation errors during testing Also remove an unneeded mutable variable and improve code organization --- quint/io-cli-tests.md | 4 +- quint/src/cliCommands.ts | 158 +++++++++++++++++------------------ quint/src/runtime/testing.ts | 20 +++-- 3 files changed, 89 insertions(+), 93 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 612078bf1..915fa5ae4 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -935,7 +935,7 @@ exit $exit_code 5: assert(n > 0) ^ -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Fail on run with uninitialized constants @@ -1046,7 +1046,7 @@ quint test --main=invalid ./testFixture/_1050diffName.qnt ``` error: [QNT405] Main module invalid not found -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Multiple tests output different json diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 29e2ed511..39ecb1b74 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -1,5 +1,5 @@ /** - * Define the commands for QuintC + * The commands for the quint CLI * * See the description at: * https://github.com/informalsystems/quint/blob/main/doc/quint.md @@ -312,16 +312,6 @@ export async function runTests(prev: TypecheckedStage): Promise isMatchingTest(testing.args.match, n) const options: TestOptions = { testMatch: matchFun, @@ -348,9 +338,9 @@ export async function runTests(prev: TypecheckedStage): Promise { - if (res.status === 'passed') { - out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) - } - if (res.status === 'failed') { - const errNo = chalk.red(namedErrors.length + 1) - out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) - - res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) - } - }) - } - - passed = results.filter(r => r.status === 'passed').map(r => r.name) - failed = results.filter(r => r.status === 'failed').map(r => r.name) - ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + return cliErr('Tests could not be run due to an error during compilation', { + ...testing, + errors: testOut.value.map(mkErrorMessage(testing.sourceMap)), + }) + } + const results = testOut.unwrap() - // output the statistics banner - if (verbosity.hasResults(verbosityLevel)) { - out('') - if (passed.length > 0) { - out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) - } - if (failed.length > 0) { - out(chalk.red(` ${failed.length} failed`)) + // output the status for every test + if (verbosity.hasResults(verbosityLevel)) { + results.forEach(res => { + if (res.status === 'passed') { + out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) } - if (ignored.length > 0) { - out(chalk.gray(` ${ignored.length} ignored`)) + if (res.status === 'failed') { + const errNo = chalk.red(namedErrors.length + 1) + out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) + + res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) } + }) + } + + const passed: string[] = results.filter(r => r.status === 'passed').map(r => r.name) + failed = results.filter(r => r.status === 'failed').map(r => r.name) + ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + + // output the statistics banner + if (verbosity.hasResults(verbosityLevel)) { + out('') + if (passed.length > 0) { + out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) + } + if (failed.length > 0) { + out(chalk.red(` ${failed.length} failed`)) + } + if (ignored.length > 0) { + out(chalk.gray(` ${ignored.length} ignored`)) } + } - // output errors, if there are any - if (verbosity.hasTestDetails(verbosityLevel) && namedErrors.length > 0) { - const code = prev.sourceCode! - const finders = createFinders(code) - out('') - namedErrors.forEach(([name, err, testResult], index) => { - const details = formatError(code, finders, err) - // output the header - out(` ${index + 1}) ${name}:`) - const lines = details.split('\n') - // output the first two lines in red - lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) - - if (verbosity.hasActionTracking(verbosityLevel)) { - out('') - testResult.frames.forEach((f, index) => { - out(`[${chalk.bold('Frame ' + index)}]`) - const console = { - width: columns, - out: (s: string) => process.stdout.write(s), - } - printExecutionFrameRec(console, f, []) - out('') - }) - - if (testResult.frames.length == 0) { - out(' [No execution]') + // output errors, if there are any + if (verbosity.hasTestDetails(verbosityLevel) && namedErrors.length > 0) { + const code = prev.sourceCode! + const finders = createFinders(code) + out('') + namedErrors.forEach(([name, err, testResult], index) => { + const details = formatError(code, finders, err) + // output the header + out(` ${index + 1}) ${name}:`) + const lines = details.split('\n') + // output the first two lines in red + lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) + + if (verbosity.hasActionTracking(verbosityLevel)) { + out('') + testResult.frames.forEach((f, index) => { + out(`[${chalk.bold('Frame ' + index)}]`) + const console = { + width: columns, + out: (s: string) => process.stdout.write(s), } + printExecutionFrameRec(console, f, []) + out('') + }) + + if (testResult.frames.length == 0) { + out(' [No execution]') } - // output the seed - out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) - }) - out('') - } + } + // output the seed + out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) + }) + out('') + } - if (failed.length > 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { - out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) - out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) - } + if (failed.length > 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { + out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) + out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) } const errors = namedErrors.map(([_, e]) => e) @@ -531,6 +524,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise { - const recorder = newTraceRecorder(options.verbosity, options.rng) const main = compilationState.modules.find(m => m.name === mainName) if (!main) { return left([{ code: 'QNT405', message: `Main module ${mainName} not found` }]) } + const recorder = newTraceRecorder(options.verbosity, options.rng) const ctx = compile(compilationState, newEvaluationState(recorder), lookupTable, options.rng.next, main.declarations) + const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors, ctx.analysisErrors) + if (ctxErrors.length > 0) { + // In principle, these errors should have been caught earlier. + // But if they did not, return immediately. + return left(ctxErrors) + } + const saveTrace = (index: number, name: string, status: string) => { // Save the best traces that are reported by the recorder: // If a test failed, it is the first failing trace. @@ -104,13 +113,6 @@ export function compileAndTest( ) } - const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors).concat(ctx.analysisErrors) - if (ctxErrors.length > 0) { - // In principle, these errors should have been caught earlier. - // But if they did not, return immediately. - return left(ctxErrors) - } - const testDefs = main.declarations.filter(d => d.kind === 'def' && options.testMatch(d.name)) as QuintOpDef[] return mergeInMany( From a7b6507bcfcec93c5e23717dbb74dd47763d7ab3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 21:20:32 -0500 Subject: [PATCH 200/428] Remove unneeded mutable vars --- quint/src/cliCommands.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 39ecb1b74..9009da9d2 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -337,9 +337,6 @@ export async function runTests(prev: TypecheckedStage): Promise d.kind === 'def' && options.testMatch(d.name) ) - // Define name expressions referencing each test that is not referenced elsewhere, adding the references to the lookup // table const args: QuintEx[] = unusedTests.map(defToAdd => { @@ -364,7 +364,6 @@ export async function runTests(prev: TypecheckedStage): Promise m.name === mainName) main?.declarations.push(testDeclaration) + // TODO The following block should all be moved into compileAndTest const analysisOutput = { types: testing.types, effects: testing.effects, modes: testing.modes } const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( testing.modules, @@ -394,6 +393,7 @@ export async function runTests(prev: TypecheckedStage): Promise r.status === 'passed').map(r => r.name) - failed = results.filter(r => r.status === 'failed').map(r => r.name) - ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + const passed = results.filter(r => r.status === 'passed').map(r => r.name) + const failed = results.filter(r => r.status === 'failed').map(r => r.name) + const ignored = results.filter(r => r.status === 'ignored').map(r => r.name) // output the statistics banner if (verbosity.hasResults(verbosityLevel)) { From 87306a5e40a504cecb9e018ef8278114b9e2e96c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 22:34:24 -0500 Subject: [PATCH 201/428] Clean up error reporting --- quint/src/cliCommands.ts | 67 ++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 9009da9d2..a581bffe6 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -333,12 +333,10 @@ export async function runTests(prev: TypecheckedStage): Promise { if (res.status === 'passed') { out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) } if (res.status === 'failed') { - const errNo = chalk.red(namedErrors.length + 1) + const errNo = chalk.red(nFailures) out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) - - res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) + nFailures++ } }) } - const passed = results.filter(r => r.status === 'passed').map(r => r.name) - const failed = results.filter(r => r.status === 'failed').map(r => r.name) - const ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + const passed = results.filter(r => r.status === 'passed') + const failed = results.filter(r => r.status === 'failed') + const ignored = results.filter(r => r.status === 'ignored') + const namedErrors: [TestResult, ErrorMessage][] = failed.reduce( + (acc: [TestResult, ErrorMessage][], failure) => + acc.concat(failure.errors.map(e => [failure, mkErrorMessage(testing.sourceMap)(e)])), + [] + ) // output the statistics banner if (verbosity.hasResults(verbosityLevel)) { @@ -438,15 +445,29 @@ export async function runTests(prev: TypecheckedStage): Promise 0) { + const stage = { + ...testing, + passed: passed.map(r => r.name), + failed: failed.map(r => r.name), + ignored: ignored.map(r => r.name), + errors: namedErrors.map(([_, e]) => e), + } + + // Nothing failed, so we are OK, and can exit early + if (failed.length === 0) { + return right(stage) + } + + // We know that there are errors, so report as required by the verbosity configuration + if (verbosity.hasTestDetails(verbosityLevel)) { const code = prev.sourceCode! const finders = createFinders(code) + const columns = !prev.args.out ? terminalWidth() : 80 out('') - namedErrors.forEach(([name, err, testResult], index) => { + namedErrors.forEach(([testResult, err], index) => { const details = formatError(code, finders, err) // output the header - out(` ${index + 1}) ${name}:`) + out(` ${index + 1}) ${testResult.name}:`) const lines = details.split('\n') // output the first two lines in red lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) @@ -473,18 +494,12 @@ export async function runTests(prev: TypecheckedStage): Promise 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { + if (verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) } - const errors = namedErrors.map(([_, e]) => e) - const stage = { ...testing, passed, failed, ignored, errors } - if (errors.length == 0 && failed.length == 0) { - return right(stage) - } else { - return cliErr('Tests failed', stage) - } + return cliErr('Tests failed', stage) } // Print a counterexample if the appropriate verbosity is set From 3ac3b6b4779ac3a194be872ab2fdfc44bd1d5e74 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 10:16:52 -0500 Subject: [PATCH 202/428] Standardize verbosity derivation --- quint/src/cliCommands.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index a581bffe6..968dd04d5 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -302,7 +302,7 @@ export async function runRepl(_argv: any) { */ export async function runTests(prev: TypecheckedStage): Promise> { // TODO: Logic should be consistent with runSimulator? - const verbosityLevel = !prev.args.out ? prev.args.verbosity : 0 + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) const testing = { ...prev, stage: 'testing' as stage } @@ -520,7 +520,7 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * @param prev the procedure stage produced by `typecheck` */ export async function runSimulator(prev: TypecheckedStage): Promise> { - const verbosityLevel = !prev.args.out && !prev.args.outItf ? prev.args.verbosity : 0 + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) const simulator = { ...prev, stage: 'running' as stage } @@ -611,6 +611,8 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args + const verbosityLevel = deriveVerbosity(args) + let loadedConfig: any = {} try { if (args.apalacheConfig) { @@ -696,7 +698,6 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const elapsedMs = Date.now() - startMs return res @@ -881,3 +882,8 @@ function isMatchingTest(match: string | undefined, name: string) { return name.endsWith('Test') } } + +// Derive the verbosity for simulation and verification routines +function deriveVerbosity(args: { out: string | undefined; outItf: string | undefined; verbosity: number }): number { + return !args.out && !args.outItf ? args.verbosity : 0 +} From a6971b558dbdfd4fe08972778b13d6a1bab38d83 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 11:16:37 -0500 Subject: [PATCH 203/428] Remove unnecessary `failure` status --- quint/src/simulation.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index a2061b9bc..a3ff3723a 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -20,6 +20,7 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' +import { fail } from 'assert' /** * Various settings that have to be passed to the simulator to run. @@ -34,7 +35,7 @@ export interface SimulatorOptions { verbosity: number } -export type SimulatorResultStatus = 'ok' | 'violation' | 'failure' | 'error' +export type SimulatorResultStatus = 'ok' | 'violation' | 'error' /** * A result returned by the simulator. @@ -116,19 +117,20 @@ export function compileAndRun( const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] return errSimulationResult('error', errors) } else { - const _ = res.value.eval() + res.value.eval() } const topFrame = recorder.getBestTrace() - let status: SimulatorResultStatus = 'failure' + let status: SimulatorResultStatus if (topFrame.result.isJust()) { const ex = topFrame.result.unwrap().toQuintEx(idGen) if (ex.kind === 'bool') { status = ex.value ? 'ok' : 'violation' + } else { + fail('invalid value derived from simulation') } } else { - // This should not happen. But if it does, give a debugging hint. - console.error('No trace recorded') + fail('simulation failed to produce any trace') } let errors = ctx.getRuntimeErrors() From 4b21c5f681101d0be1cf22d787def196c24fa3b4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 11:17:15 -0500 Subject: [PATCH 204/428] Clean up branching logic in runSimulator --- quint/src/cliCommands.ts | 73 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 968dd04d5..33713d85b 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -301,10 +301,9 @@ export async function runRepl(_argv: any) { * @param typedStage the procedure stage produced by `typecheck` */ export async function runTests(prev: TypecheckedStage): Promise> { - // TODO: Logic should be consistent with runSimulator? + const testing = { ...prev, stage: 'testing' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const testing = { ...prev, stage: 'testing' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -520,9 +519,9 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * @param prev the procedure stage produced by `typecheck` */ export async function runSimulator(prev: TypecheckedStage): Promise> { + const simulator = { ...prev, stage: 'running' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const simulator = { ...prev, stage: 'running' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -553,53 +552,59 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Mon, 22 Jan 2024 12:19:53 -0500 Subject: [PATCH 205/428] Make it impossible to error without errors Fix the representation of simulation results so that of there are errors, we return an outcome with an error status and errors, and not otherwise. Also remove some redundant declarations. --- quint/src/cliCommands.ts | 34 +++++----- quint/src/simulation.ts | 140 +++++++++++++++++++++------------------ 2 files changed, 90 insertions(+), 84 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 33713d85b..1742eebab 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -145,13 +145,8 @@ interface TestedStage extends LoadedStage { ignored: string[] } -interface SimulatorStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' - trace?: QuintEx[] -} - -interface VerifiedStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' +// Data resulting from stages that can produce a trace +interface TracingStage extends LoadedStage { trace?: QuintEx[] } @@ -518,7 +513,7 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * * @param prev the procedure stage produced by `typecheck` */ -export async function runSimulator(prev: TypecheckedStage): Promise> { +export async function runSimulator(prev: TypecheckedStage): Promise> { const simulator = { ...prev, stage: 'running' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) @@ -554,14 +549,15 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { +export async function verifySpec(prev: TypecheckedStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args const verbosityLevel = deriveVerbosity(args) @@ -714,7 +710,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const trace: QuintEx[] | undefined = err.traces ? ofItf(err.traces[0]) : undefined diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index a3ff3723a..211677062 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -12,7 +12,7 @@ import { Either } from '@sweet-monads/either' import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' import { QuintEx } from './ir/quintIr' -import { Computable } from './runtime/runtime' +import { Computable, EvalResult } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' import { IdGenerator } from './idGenerator' import { Rng } from './rng' @@ -20,7 +20,7 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' -import { fail } from 'assert' +import assert from 'assert' /** * Various settings that have to be passed to the simulator to run. @@ -35,27 +35,30 @@ export interface SimulatorOptions { verbosity: number } -export type SimulatorResultStatus = 'ok' | 'violation' | 'error' +/** The outcome of a simulation + */ +export type Outcome = + | { status: 'ok' } /** Simulation succeeded */ + | { status: 'violation' } /** Simulation found an invariant violation */ + | { status: 'error'; errors: QuintError[] } /** An error occurred during simulation */ /** * A result returned by the simulator. */ export interface SimulatorResult { - status: SimulatorResultStatus + outcome: Outcome vars: string[] states: QuintEx[] frames: ExecutionFrame[] - errors: QuintError[] seed: bigint } -function errSimulationResult(status: SimulatorResultStatus, errors: QuintError[]): SimulatorResult { +function errSimulationResult(errors: QuintError[]): SimulatorResult { return { - status, + outcome: { status: 'error', errors }, vars: [], states: [], frames: [], - errors: errors, seed: 0n, } } @@ -106,66 +109,73 @@ export function compileAndRun( const recorder = newTraceRecorder(options.verbosity, options.rng) const ctx = compileFromCode(idGen, codeWithExtraDefs, mainName, mainPath, recorder, options.rng.next) - if (ctx.compileErrors.length > 0 || ctx.syntaxErrors.length > 0 || ctx.analysisErrors.length > 0) { - const errors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) - return errSimulationResult('error', errors) - } else { - // evaluate q::runResult, which triggers the simulator - const evaluationState = ctx.evaluationState - const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') - if (res.isLeft()) { - const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] - return errSimulationResult('error', errors) - } else { - res.value.eval() - } - - const topFrame = recorder.getBestTrace() - let status: SimulatorResultStatus - if (topFrame.result.isJust()) { - const ex = topFrame.result.unwrap().toQuintEx(idGen) - if (ex.kind === 'bool') { - status = ex.value ? 'ok' : 'violation' - } else { - fail('invalid value derived from simulation') - } - } else { - fail('simulation failed to produce any trace') - } + const compilationErrors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) + if (compilationErrors.length > 0) { + return errSimulationResult(compilationErrors) + } - let errors = ctx.getRuntimeErrors() - if (errors.length > 0) { - // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` - // The evaluated code source is not included in the context, so we crete a version with it for the error reporter - const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) - const finders = createFinders(code) - - errors = errors.map(error => ({ - code: error.code, - // Include the location information (locs) in the error message - this - // is the hacky part, as it should only be included at the CLI level - message: formatError(code, finders, { - // This will create the `locs` attribute and an explanation - ...mkErrorMessage(ctx.compilationState.sourceMap)(error), - // We override the explanation to keep the original one to avoid - // duplication, since `mkErrorMessage` will be called again at the CLI - // level. `locs` won't be touched then because this error doesn't - // include a `reference` field - explanation: error.message, - }), - })) - - // This should be kept after the hack is removed - status = 'error' - } + // evaluate q::runResult, which triggers the simulator + const evaluationState = ctx.evaluationState + const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') + if (res.isLeft()) { + const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] + return errSimulationResult(errors) + } else { + res.value.eval() + } + const topFrame: ExecutionFrame = recorder.getBestTrace() + + // Validate required outcome of correct simulation + const maybeEvalResult = topFrame.result + assert(maybeEvalResult.isJust(), 'invalid simulation failed to produce a result') + const quintExResult = maybeEvalResult.value.toQuintEx(idGen) + assert(quintExResult.kind === 'bool', 'invalid simulation produced non-boolean value ') + const simulationSucceeded = quintExResult.value + + const vars = evaluationState.vars.map(v => v.name) + const states = topFrame.args.map(e => e.toQuintEx(idGen)) + const frames = topFrame.subframes + const seed = recorder.getBestTraceSeed() + + const runtimeErrors = ctx.getRuntimeErrors() + if (runtimeErrors.length > 0) { + // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` + // The evaluated code source is not included in the context, so we crete a version with it for the error reporter + const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) + const finders = createFinders(code) + + const locatedErrors = runtimeErrors.map(error => ({ + code: error.code, + // Include the location information (locs) in the error message - this + // is the hacky part, as it should only be included at the CLI level + message: formatError(code, finders, { + // This will create the `locs` attribute and an explanation + ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + // We override the explanation to keep the original one to avoid + // duplication, since `mkErrorMessage` will be called again at the CLI + // level. `locs` won't be touched then because this error doesn't + // include a `reference` field + explanation: error.message, + }), + })) + + // This should be kept after the hack is removed return { - status: status, - vars: evaluationState.vars.map(v => v.name), - states: topFrame.args.map(e => e.toQuintEx(idGen)), - frames: topFrame.subframes, - errors: errors, - seed: recorder.getBestTraceSeed(), + vars, + states, + frames, + seed, + outcome: { status: 'error', errors: locatedErrors }, } } + + const status = simulationSucceeded ? 'ok' : 'violation' + return { + vars, + states, + frames, + seed, + outcome: { status }, + } } From 934335d024ad0edab444280ec0e55d1d6be2f935 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 12:25:15 -0500 Subject: [PATCH 206/428] Fix lint --- quint/src/simulation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 211677062..49ab3374e 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -12,7 +12,7 @@ import { Either } from '@sweet-monads/either' import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' import { QuintEx } from './ir/quintIr' -import { Computable, EvalResult } from './runtime/runtime' +import { Computable } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' import { IdGenerator } from './idGenerator' import { Rng } from './rng' From 59e97e2da25df6da84ff9d5bb93d483602c0f88b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 8 Dec 2023 14:28:12 -0500 Subject: [PATCH 207/428] Add IR nodes for type abstraction and application Closes #1296 --- quint/src/ir/quintTypes.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index a572d52a7..af87b4408 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,6 +98,19 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } +/// Type abstraction: Λτ.Τ +export interface QuintAbsType extends WithOptionalId { + kind: 'abs' + vars: QuintVarType +} + +/// Type application: (Λτ.Τ)υ +export interface QuintAppType extends WithOptionalId { + kind: 'app' + abs: QuintAbsType + arg: QuintType +} + /** * A type in Type System 1.2. */ @@ -114,6 +127,8 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType + | QuintAbsType + | QuintAppType /** * Row types, used to express tuples and records. From f924eadb787b78df74be8389796222346e45e6e0 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 23 Jan 2024 16:42:01 -0500 Subject: [PATCH 208/428] Add build scripts --- quint/package.json | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/quint/package.json b/quint/package.json index a1e268ae5..dc71566b5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -2,13 +2,7 @@ "name": "@informalsystems/quint", "version": "0.18.1", "description": "Core tool for the Quint specification language", - "keywords": [ - "temporal", - "logic", - "formal", - "specification", - "verification" - ], + "keywords": ["temporal", "logic", "formal", "specification", "verification"], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -35,11 +29,7 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": [ - "README.md", - "dist/**/*", - "test/**/*.ts" - ], + "files": ["README.md", "dist/**/*", "test/**/*.ts"], "engines": { "node": ">=18" }, @@ -72,6 +62,8 @@ "compile": "genversion -e src/version.ts && tsc && copyfiles -u 1 ./src/reflection.proto ./src/builtin.qnt ./dist/src/", "prepare": "rm -rf ./dist && npm run compile && chmod +x ./dist/src/cli.js", "test": "mocha --reporter-option maxDiffSize=0 -r ts-node/register test/*.test.ts test/**/*.test.ts", + "test-w": "while inotifywait -r -e close_write ./ ; do npm run test; done", + "test-f": "mocha --reporter-option maxDiffSize=0 -r ts-node/register", "coverage": "nyc npm run test", "integration": "txm cli-tests.md && txm io-cli-tests.md", "apalache-integration": "txm apalache-tests.md", From 1ad2419e4e8fbfd6a58bf7f8b0d82c559b234a88 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 11:45:20 -0500 Subject: [PATCH 209/428] Add parsing for polymorphic type declarations --- quint/src/generated/Quint.g4 | 50 +- quint/src/generated/Quint.interp | 17 +- quint/src/generated/Quint.tokens | 106 +- quint/src/generated/QuintLexer.interp | 18 +- quint/src/generated/QuintLexer.tokens | 106 +- quint/src/generated/QuintLexer.ts | 481 +-- quint/src/generated/QuintListener.ts | 60 +- quint/src/generated/QuintParser.ts | 2676 +++++++++-------- quint/src/generated/QuintVisitor.ts | 39 +- quint/src/graphics.ts | 3 + quint/src/ir/IRTransformer.ts | 35 + quint/src/ir/IRVisitor.ts | 18 + quint/src/ir/IRprinting.ts | 10 + quint/src/ir/quintTypes.ts | 20 +- quint/src/parsing/ToIrListener.ts | 90 +- quint/src/quintError.ts | 2 + quint/src/types/base.ts | 1 + quint/src/types/constraintGenerator.ts | 2 + quint/src/types/substitutions.ts | 7 +- quint/test/ir/IRVisitor.test.ts | 47 + quint/test/ir/IRprinting.test.ts | 6 + .../test/parsing/quintParserFrontend.test.ts | 6 +- quint/test/types/parser.test.ts | 33 +- quint/testFixture/_1025importeeWithError.json | 2 +- 24 files changed, 2228 insertions(+), 1607 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 6cb27d16f..95154347f 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -52,11 +52,15 @@ operDef : qualifier normalCallName ; typeDef - : 'type' qualId # typeAbstractDef - | 'type' qualId '=' type # typeAliasDef - | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef + : 'type' qualId # typeAbstractDef + | 'type' typeDefHead '=' type # typeAliasDef + | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; +typeDefHead : typeName=qualId ('[' typeVars+=typeVar(',' typeVars+=typeVar)* ']')?; + +sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; + // A single variant case in a sum type definition or match statement. // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; @@ -96,28 +100,32 @@ qualifiedName : qualId; fromSource: STRING; // Types in Type System 1.2 of Apalache -type : type '->' type # typeFun - | type '=>' type # typeOper - | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper - | SET '[' type ']' # typeSet - | LIST '[' type ']' # typeList - | '(' type ',' type (',' type)* ','? ')' # typeTuple - | '{' row '}' # typeRec - | 'int' # typeInt - | 'str' # typeStr - | 'bool' # typeBool - | LOW_ID # typeVar - | qualId # typeConst - | '(' type ')' # typeParen - ; +type + : type '->' type # typeFun + | type '=>' type # typeOper + | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper + // TODO: replace Set with general type application + | SET '[' type ']' # typeSet + // TODO: replace List with general type application + | LIST '[' type ']' # typeList + | '(' type ',' type (',' type)* ','? ')' # typeTuple + | '{' row? '}' # typeRec + | 'int' # typeInt + | 'str' # typeStr + | 'bool' # typeBool + | typeVar # typeVarCase + | qualId # typeConst + | '(' type ')' # typeParen + | typeCtor=type ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=identifier))?)? +typeVar: LOW_ID; +row : (rowLabel ':' type) (',' rowLabel ':' type)* (',' | '|' (rowVar=identifier))? | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; - // A Quint expression. The order matters, it defines the priority. // Wherever possible, we keep the same order of operators as in TLA+. // We are also trying to be consistent with mainstream languages, e.g., @@ -269,8 +277,6 @@ AND : 'and' ; OR : 'or' ; IFF : 'iff' ; IMPLIES : 'implies' ; -SET : 'Set' ; -LIST : 'List' ; MAP : 'Map' ; MATCH : 'match' ; PLUS : '+' ; @@ -287,6 +293,8 @@ EQ : '==' ; ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; +SET : 'Set'; +LIST : 'List'; // An identifier starting with lowercase LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 966bb4ab8..781eec423 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -151,6 +151,8 @@ documentedDeclaration declaration operDef typeDef +typeDefHead +sumTypeDefinition typeSumVariant nondetOperDef qualifier @@ -162,6 +164,7 @@ name qualifiedName fromSource type +typeVar row rowLabel expr @@ -187,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 758, 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, 3, 2, 6, 2, 82, 10, 2, 13, 2, 14, 2, 83, 3, 2, 3, 2, 3, 3, 7, 3, 89, 10, 3, 12, 3, 14, 3, 92, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 98, 10, 3, 12, 3, 14, 3, 101, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 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, 133, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 141, 10, 6, 12, 6, 14, 6, 144, 11, 6, 5, 6, 146, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 151, 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, 164, 10, 6, 12, 6, 14, 6, 167, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 3, 6, 5, 6, 177, 10, 6, 3, 6, 5, 6, 180, 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, 193, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 198, 10, 7, 12, 7, 14, 7, 201, 11, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 210, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 216, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 221, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 5, 11, 252, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 263, 10, 12, 5, 12, 265, 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, 278, 10, 13, 12, 13, 14, 13, 281, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 288, 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, 301, 10, 13, 12, 13, 14, 13, 304, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 311, 10, 13, 5, 13, 313, 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, 328, 10, 18, 12, 18, 14, 18, 331, 11, 18, 5, 18, 333, 10, 18, 3, 18, 5, 18, 336, 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, 357, 10, 18, 12, 18, 14, 18, 360, 11, 18, 3, 18, 5, 18, 363, 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, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 398, 10, 19, 12, 19, 14, 19, 401, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 410, 10, 19, 5, 19, 412, 10, 19, 3, 19, 3, 19, 5, 19, 416, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 425, 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, 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, 3, 21, 7, 21, 472, 10, 21, 12, 21, 14, 21, 475, 11, 21, 3, 21, 5, 21, 478, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 487, 10, 21, 12, 21, 14, 21, 490, 11, 21, 3, 21, 5, 21, 493, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 501, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 509, 10, 21, 12, 21, 14, 21, 512, 11, 21, 3, 21, 5, 21, 515, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 523, 10, 21, 12, 21, 14, 21, 526, 11, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 537, 10, 21, 12, 21, 14, 21, 540, 11, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 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, 570, 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, 609, 10, 21, 3, 21, 5, 21, 612, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 619, 10, 21, 12, 21, 14, 21, 622, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 633, 10, 22, 12, 22, 14, 22, 636, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 642, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 5, 24, 654, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 665, 10, 25, 3, 26, 3, 26, 5, 26, 669, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 679, 10, 27, 12, 27, 14, 27, 682, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 688, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 695, 10, 28, 13, 28, 14, 28, 696, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 706, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 712, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 717, 10, 32, 12, 32, 14, 32, 720, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 728, 10, 33, 3, 34, 3, 34, 5, 34, 732, 10, 34, 3, 35, 3, 35, 5, 35, 736, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 745, 10, 38, 12, 38, 14, 38, 748, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 754, 10, 39, 3, 40, 3, 40, 3, 40, 2, 2, 4, 34, 40, 41, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 2, 10, 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, 3, 2, 67, 68, 2, 854, 2, 81, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 132, 3, 2, 2, 2, 10, 134, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 211, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 251, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 312, 3, 2, 2, 2, 26, 314, 3, 2, 2, 2, 28, 316, 3, 2, 2, 2, 30, 318, 3, 2, 2, 2, 32, 320, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 415, 3, 2, 2, 2, 38, 417, 3, 2, 2, 2, 40, 569, 3, 2, 2, 2, 42, 623, 3, 2, 2, 2, 44, 641, 3, 2, 2, 2, 46, 646, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 668, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 689, 3, 2, 2, 2, 56, 705, 3, 2, 2, 2, 58, 707, 3, 2, 2, 2, 60, 711, 3, 2, 2, 2, 62, 713, 3, 2, 2, 2, 64, 727, 3, 2, 2, 2, 66, 731, 3, 2, 2, 2, 68, 735, 3, 2, 2, 2, 70, 737, 3, 2, 2, 2, 72, 739, 3, 2, 2, 2, 74, 741, 3, 2, 2, 2, 76, 753, 3, 2, 2, 2, 78, 755, 3, 2, 2, 2, 80, 82, 5, 4, 3, 2, 81, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 7, 2, 2, 3, 86, 3, 3, 2, 2, 2, 87, 89, 7, 69, 2, 2, 88, 87, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 7, 3, 2, 2, 94, 95, 5, 74, 38, 2, 95, 99, 7, 4, 2, 2, 96, 98, 5, 6, 4, 2, 97, 96, 3, 2, 2, 2, 98, 101, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 5, 3, 2, 2, 2, 104, 106, 7, 69, 2, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 8, 5, 2, 111, 7, 3, 2, 2, 2, 112, 113, 7, 6, 2, 2, 113, 114, 5, 74, 38, 2, 114, 115, 7, 7, 2, 2, 115, 116, 5, 34, 18, 2, 116, 133, 3, 2, 2, 2, 117, 118, 7, 8, 2, 2, 118, 119, 5, 74, 38, 2, 119, 120, 7, 7, 2, 2, 120, 121, 5, 34, 18, 2, 121, 133, 3, 2, 2, 2, 122, 123, 7, 9, 2, 2, 123, 124, 5, 56, 29, 2, 124, 125, 7, 64, 2, 2, 125, 126, 5, 40, 21, 2, 126, 133, 3, 2, 2, 2, 127, 133, 5, 24, 13, 2, 128, 133, 5, 10, 6, 2, 129, 133, 5, 12, 7, 2, 130, 133, 5, 20, 11, 2, 131, 133, 5, 22, 12, 2, 132, 112, 3, 2, 2, 2, 132, 117, 3, 2, 2, 2, 132, 122, 3, 2, 2, 2, 132, 127, 3, 2, 2, 2, 132, 128, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 131, 3, 2, 2, 2, 133, 9, 3, 2, 2, 2, 134, 135, 5, 18, 10, 2, 135, 172, 5, 66, 34, 2, 136, 145, 7, 65, 2, 2, 137, 142, 5, 58, 30, 2, 138, 139, 7, 10, 2, 2, 139, 141, 5, 58, 30, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 137, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 150, 7, 66, 2, 2, 148, 149, 7, 7, 2, 2, 149, 151, 5, 34, 18, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 173, 3, 2, 2, 2, 152, 153, 7, 7, 2, 2, 153, 173, 5, 34, 18, 2, 154, 155, 7, 65, 2, 2, 155, 156, 5, 58, 30, 2, 156, 157, 7, 7, 2, 2, 157, 165, 5, 34, 18, 2, 158, 159, 7, 10, 2, 2, 159, 160, 5, 58, 30, 2, 160, 161, 7, 7, 2, 2, 161, 162, 5, 34, 18, 2, 162, 164, 3, 2, 2, 2, 163, 158, 3, 2, 2, 2, 164, 167, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 168, 169, 7, 66, 2, 2, 169, 170, 7, 7, 2, 2, 170, 171, 5, 34, 18, 2, 171, 173, 3, 2, 2, 2, 172, 136, 3, 2, 2, 2, 172, 152, 3, 2, 2, 2, 172, 154, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 177, 5, 40, 21, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 179, 3, 2, 2, 2, 178, 180, 7, 11, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 11, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 203, 5, 74, 38, 2, 183, 184, 7, 12, 2, 2, 184, 185, 5, 74, 38, 2, 185, 186, 7, 64, 2, 2, 186, 187, 5, 34, 18, 2, 187, 203, 3, 2, 2, 2, 188, 189, 7, 12, 2, 2, 189, 190, 5, 74, 38, 2, 190, 192, 7, 64, 2, 2, 191, 193, 7, 13, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 199, 5, 14, 8, 2, 195, 196, 7, 13, 2, 2, 196, 198, 5, 14, 8, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 181, 3, 2, 2, 2, 202, 183, 3, 2, 2, 2, 202, 188, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 209, 5, 76, 39, 2, 205, 206, 7, 65, 2, 2, 206, 207, 5, 34, 18, 2, 207, 208, 7, 66, 2, 2, 208, 210, 3, 2, 2, 2, 209, 205, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 15, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 215, 5, 74, 38, 2, 213, 214, 7, 7, 2, 2, 214, 216, 5, 34, 18, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 64, 2, 2, 218, 220, 5, 40, 21, 2, 219, 221, 7, 11, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 17, 3, 2, 2, 2, 222, 232, 7, 15, 2, 2, 223, 232, 7, 16, 2, 2, 224, 225, 7, 17, 2, 2, 225, 232, 7, 15, 2, 2, 226, 227, 7, 17, 2, 2, 227, 232, 7, 16, 2, 2, 228, 232, 7, 18, 2, 2, 229, 232, 7, 19, 2, 2, 230, 232, 7, 20, 2, 2, 231, 222, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 224, 3, 2, 2, 2, 231, 226, 3, 2, 2, 2, 231, 228, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 21, 2, 2, 234, 235, 5, 28, 15, 2, 235, 236, 7, 22, 2, 2, 236, 239, 5, 60, 31, 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, 252, 3, 2, 2, 2, 241, 242, 7, 21, 2, 2, 242, 245, 5, 28, 15, 2, 243, 244, 7, 24, 2, 2, 244, 246, 5, 28, 15, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 249, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 250, 5, 32, 17, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 233, 3, 2, 2, 2, 251, 241, 3, 2, 2, 2, 252, 21, 3, 2, 2, 2, 253, 254, 7, 25, 2, 2, 254, 255, 5, 28, 15, 2, 255, 256, 7, 22, 2, 2, 256, 257, 5, 60, 31, 2, 257, 265, 3, 2, 2, 2, 258, 259, 7, 25, 2, 2, 259, 262, 5, 28, 15, 2, 260, 261, 7, 24, 2, 2, 261, 263, 5, 28, 15, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 265, 3, 2, 2, 2, 264, 253, 3, 2, 2, 2, 264, 258, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 267, 7, 21, 2, 2, 267, 268, 5, 26, 14, 2, 268, 269, 7, 65, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 279, 5, 40, 21, 2, 272, 273, 7, 10, 2, 2, 273, 274, 5, 28, 15, 2, 274, 275, 7, 64, 2, 2, 275, 276, 5, 40, 21, 2, 276, 278, 3, 2, 2, 2, 277, 272, 3, 2, 2, 2, 278, 281, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 282, 283, 7, 66, 2, 2, 283, 284, 7, 22, 2, 2, 284, 287, 7, 55, 2, 2, 285, 286, 7, 23, 2, 2, 286, 288, 5, 32, 17, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 313, 3, 2, 2, 2, 289, 290, 7, 21, 2, 2, 290, 291, 5, 26, 14, 2, 291, 292, 7, 65, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 302, 5, 40, 21, 2, 295, 296, 7, 10, 2, 2, 296, 297, 5, 28, 15, 2, 297, 298, 7, 64, 2, 2, 298, 299, 5, 40, 21, 2, 299, 301, 3, 2, 2, 2, 300, 295, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 66, 2, 2, 306, 307, 7, 24, 2, 2, 307, 310, 5, 30, 16, 2, 308, 309, 7, 23, 2, 2, 309, 311, 5, 32, 17, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 313, 3, 2, 2, 2, 312, 266, 3, 2, 2, 2, 312, 289, 3, 2, 2, 2, 313, 25, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 27, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 29, 3, 2, 2, 2, 318, 319, 5, 74, 38, 2, 319, 31, 3, 2, 2, 2, 320, 321, 7, 42, 2, 2, 321, 33, 3, 2, 2, 2, 322, 323, 8, 18, 1, 2, 323, 332, 7, 65, 2, 2, 324, 329, 5, 34, 18, 2, 325, 326, 7, 10, 2, 2, 326, 328, 5, 34, 18, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 336, 7, 10, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 7, 66, 2, 2, 338, 339, 7, 27, 2, 2, 339, 380, 5, 34, 18, 13, 340, 341, 7, 49, 2, 2, 341, 342, 7, 28, 2, 2, 342, 343, 5, 34, 18, 2, 343, 344, 7, 29, 2, 2, 344, 380, 3, 2, 2, 2, 345, 346, 7, 50, 2, 2, 346, 347, 7, 28, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 29, 2, 2, 349, 380, 3, 2, 2, 2, 350, 351, 7, 65, 2, 2, 351, 352, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 358, 5, 34, 18, 2, 354, 355, 7, 10, 2, 2, 355, 357, 5, 34, 18, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 380, 3, 2, 2, 2, 366, 367, 7, 4, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 5, 2, 2, 369, 380, 3, 2, 2, 2, 370, 380, 7, 30, 2, 2, 371, 380, 7, 31, 2, 2, 372, 380, 7, 32, 2, 2, 373, 380, 7, 67, 2, 2, 374, 380, 5, 74, 38, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 322, 3, 2, 2, 2, 379, 340, 3, 2, 2, 2, 379, 345, 3, 2, 2, 2, 379, 350, 3, 2, 2, 2, 379, 366, 3, 2, 2, 2, 379, 370, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 5, 38, 20, 2, 393, 394, 7, 7, 2, 2, 394, 395, 5, 34, 18, 2, 395, 396, 7, 10, 2, 2, 396, 398, 3, 2, 2, 2, 397, 392, 3, 2, 2, 2, 398, 401, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 403, 5, 38, 20, 2, 403, 404, 7, 7, 2, 2, 404, 405, 5, 34, 18, 2, 405, 409, 3, 2, 2, 2, 406, 410, 7, 10, 2, 2, 407, 408, 7, 13, 2, 2, 408, 410, 5, 78, 40, 2, 409, 406, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 402, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 416, 3, 2, 2, 2, 413, 414, 7, 13, 2, 2, 414, 416, 5, 78, 40, 2, 415, 399, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 37, 3, 2, 2, 2, 417, 418, 5, 76, 39, 2, 418, 39, 3, 2, 2, 2, 419, 420, 8, 21, 1, 2, 420, 570, 5, 50, 26, 2, 421, 422, 5, 66, 34, 2, 422, 424, 7, 65, 2, 2, 423, 425, 5, 62, 32, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 66, 2, 2, 427, 570, 3, 2, 2, 2, 428, 429, 7, 54, 2, 2, 429, 570, 5, 40, 21, 27, 430, 431, 5, 74, 38, 2, 431, 432, 7, 34, 2, 2, 432, 433, 7, 64, 2, 2, 433, 434, 5, 40, 21, 23, 434, 570, 3, 2, 2, 2, 435, 436, 7, 45, 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, 570, 3, 2, 2, 2, 450, 451, 7, 46, 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, 570, 3, 2, 2, 2, 465, 570, 5, 42, 22, 2, 466, 467, 7, 35, 2, 2, 467, 468, 7, 4, 2, 2, 468, 473, 5, 40, 21, 2, 469, 470, 7, 10, 2, 2, 470, 472, 5, 40, 21, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 7, 10, 2, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 5, 2, 2, 480, 570, 3, 2, 2, 2, 481, 482, 7, 36, 2, 2, 482, 483, 7, 4, 2, 2, 483, 488, 5, 40, 21, 2, 484, 485, 7, 10, 2, 2, 485, 487, 5, 40, 21, 2, 486, 484, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 491, 493, 7, 10, 2, 2, 492, 491, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 7, 5, 2, 2, 495, 570, 3, 2, 2, 2, 496, 501, 5, 74, 38, 2, 497, 501, 7, 44, 2, 2, 498, 501, 7, 43, 2, 2, 499, 501, 7, 42, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 570, 3, 2, 2, 2, 502, 503, 7, 65, 2, 2, 503, 504, 5, 40, 21, 2, 504, 505, 7, 10, 2, 2, 505, 510, 5, 40, 21, 2, 506, 507, 7, 10, 2, 2, 507, 509, 5, 40, 21, 2, 508, 506, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 515, 7, 10, 2, 2, 514, 513, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 7, 66, 2, 2, 517, 570, 3, 2, 2, 2, 518, 519, 7, 4, 2, 2, 519, 524, 5, 64, 33, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 64, 33, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 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, 531, 7, 5, 2, 2, 531, 570, 3, 2, 2, 2, 532, 541, 7, 28, 2, 2, 533, 538, 5, 40, 21, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 40, 21, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 533, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 10, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 570, 7, 29, 2, 2, 547, 548, 7, 37, 2, 2, 548, 549, 7, 65, 2, 2, 549, 550, 5, 40, 21, 2, 550, 551, 7, 66, 2, 2, 551, 552, 5, 40, 21, 2, 552, 553, 7, 38, 2, 2, 553, 554, 5, 40, 21, 7, 554, 570, 3, 2, 2, 2, 555, 556, 5, 10, 6, 2, 556, 557, 5, 40, 21, 6, 557, 570, 3, 2, 2, 2, 558, 559, 5, 16, 9, 2, 559, 560, 5, 40, 21, 5, 560, 570, 3, 2, 2, 2, 561, 562, 7, 65, 2, 2, 562, 563, 5, 40, 21, 2, 563, 564, 7, 66, 2, 2, 564, 570, 3, 2, 2, 2, 565, 566, 7, 4, 2, 2, 566, 567, 5, 40, 21, 2, 567, 568, 7, 5, 2, 2, 568, 570, 3, 2, 2, 2, 569, 419, 3, 2, 2, 2, 569, 421, 3, 2, 2, 2, 569, 428, 3, 2, 2, 2, 569, 430, 3, 2, 2, 2, 569, 435, 3, 2, 2, 2, 569, 450, 3, 2, 2, 2, 569, 465, 3, 2, 2, 2, 569, 466, 3, 2, 2, 2, 569, 481, 3, 2, 2, 2, 569, 500, 3, 2, 2, 2, 569, 502, 3, 2, 2, 2, 569, 518, 3, 2, 2, 2, 569, 532, 3, 2, 2, 2, 569, 547, 3, 2, 2, 2, 569, 555, 3, 2, 2, 2, 569, 558, 3, 2, 2, 2, 569, 561, 3, 2, 2, 2, 569, 565, 3, 2, 2, 2, 570, 620, 3, 2, 2, 2, 571, 572, 12, 28, 2, 2, 572, 573, 7, 33, 2, 2, 573, 619, 5, 40, 21, 28, 574, 575, 12, 26, 2, 2, 575, 576, 9, 2, 2, 2, 576, 619, 5, 40, 21, 27, 577, 578, 12, 25, 2, 2, 578, 579, 9, 3, 2, 2, 579, 619, 5, 40, 21, 26, 580, 581, 12, 24, 2, 2, 581, 582, 9, 4, 2, 2, 582, 619, 5, 40, 21, 25, 583, 584, 12, 22, 2, 2, 584, 585, 7, 64, 2, 2, 585, 586, 5, 40, 21, 23, 586, 587, 8, 21, 1, 2, 587, 619, 3, 2, 2, 2, 588, 589, 12, 20, 2, 2, 589, 590, 7, 45, 2, 2, 590, 619, 5, 40, 21, 21, 591, 592, 12, 18, 2, 2, 592, 593, 7, 46, 2, 2, 593, 619, 5, 40, 21, 19, 594, 595, 12, 17, 2, 2, 595, 596, 7, 47, 2, 2, 596, 619, 5, 40, 21, 18, 597, 598, 12, 16, 2, 2, 598, 599, 7, 48, 2, 2, 599, 619, 5, 40, 21, 17, 600, 601, 12, 10, 2, 2, 601, 602, 7, 26, 2, 2, 602, 619, 5, 40, 21, 11, 603, 604, 12, 32, 2, 2, 604, 605, 7, 22, 2, 2, 605, 611, 5, 68, 35, 2, 606, 608, 7, 65, 2, 2, 607, 609, 5, 62, 32, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 66, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 619, 3, 2, 2, 2, 613, 614, 12, 29, 2, 2, 614, 615, 7, 28, 2, 2, 615, 616, 5, 40, 21, 2, 616, 617, 7, 29, 2, 2, 617, 619, 3, 2, 2, 2, 618, 571, 3, 2, 2, 2, 618, 574, 3, 2, 2, 2, 618, 577, 3, 2, 2, 2, 618, 580, 3, 2, 2, 2, 618, 583, 3, 2, 2, 2, 618, 588, 3, 2, 2, 2, 618, 591, 3, 2, 2, 2, 618, 594, 3, 2, 2, 2, 618, 597, 3, 2, 2, 2, 618, 600, 3, 2, 2, 2, 618, 603, 3, 2, 2, 2, 618, 613, 3, 2, 2, 2, 619, 622, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 41, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 623, 624, 7, 52, 2, 2, 624, 625, 5, 40, 21, 2, 625, 627, 7, 4, 2, 2, 626, 628, 7, 13, 2, 2, 627, 626, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 634, 5, 44, 23, 2, 630, 631, 7, 13, 2, 2, 631, 633, 5, 44, 23, 2, 632, 630, 3, 2, 2, 2, 633, 636, 3, 2, 2, 2, 634, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 637, 638, 7, 5, 2, 2, 638, 43, 3, 2, 2, 2, 639, 642, 5, 46, 24, 2, 640, 642, 7, 39, 2, 2, 641, 639, 3, 2, 2, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 7, 27, 2, 2, 644, 645, 5, 40, 21, 2, 645, 45, 3, 2, 2, 2, 646, 653, 5, 76, 39, 2, 647, 650, 7, 65, 2, 2, 648, 651, 5, 76, 39, 2, 649, 651, 7, 39, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 654, 7, 66, 2, 2, 653, 647, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 47, 3, 2, 2, 2, 655, 656, 5, 8, 5, 2, 656, 657, 7, 2, 2, 3, 657, 665, 3, 2, 2, 2, 658, 659, 5, 40, 21, 2, 659, 660, 7, 2, 2, 3, 660, 665, 3, 2, 2, 2, 661, 662, 7, 69, 2, 2, 662, 665, 7, 2, 2, 3, 663, 665, 7, 2, 2, 3, 664, 655, 3, 2, 2, 2, 664, 658, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 49, 3, 2, 2, 2, 666, 669, 5, 52, 27, 2, 667, 669, 5, 54, 28, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 51, 3, 2, 2, 2, 670, 671, 5, 58, 30, 2, 671, 672, 7, 27, 2, 2, 672, 673, 5, 40, 21, 2, 673, 688, 3, 2, 2, 2, 674, 675, 7, 65, 2, 2, 675, 680, 5, 58, 30, 2, 676, 677, 7, 10, 2, 2, 677, 679, 5, 58, 30, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 684, 7, 66, 2, 2, 684, 685, 7, 27, 2, 2, 685, 686, 5, 40, 21, 2, 686, 688, 3, 2, 2, 2, 687, 670, 3, 2, 2, 2, 687, 674, 3, 2, 2, 2, 688, 53, 3, 2, 2, 2, 689, 690, 7, 65, 2, 2, 690, 691, 7, 65, 2, 2, 691, 694, 5, 58, 30, 2, 692, 693, 7, 10, 2, 2, 693, 695, 5, 58, 30, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 66, 2, 2, 699, 700, 7, 66, 2, 2, 700, 701, 7, 27, 2, 2, 701, 702, 5, 40, 21, 2, 702, 55, 3, 2, 2, 2, 703, 706, 7, 39, 2, 2, 704, 706, 5, 74, 38, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 57, 3, 2, 2, 2, 707, 708, 5, 56, 29, 2, 708, 59, 3, 2, 2, 2, 709, 712, 7, 55, 2, 2, 710, 712, 5, 74, 38, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 61, 3, 2, 2, 2, 713, 718, 5, 40, 21, 2, 714, 715, 7, 10, 2, 2, 715, 717, 5, 40, 21, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 63, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 722, 5, 76, 39, 2, 722, 723, 7, 7, 2, 2, 723, 724, 5, 40, 21, 2, 724, 728, 3, 2, 2, 2, 725, 726, 7, 40, 2, 2, 726, 728, 5, 40, 21, 2, 727, 721, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 65, 3, 2, 2, 2, 729, 732, 5, 74, 38, 2, 730, 732, 9, 5, 2, 2, 731, 729, 3, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 67, 3, 2, 2, 2, 733, 736, 5, 74, 38, 2, 734, 736, 9, 6, 2, 2, 735, 733, 3, 2, 2, 2, 735, 734, 3, 2, 2, 2, 736, 69, 3, 2, 2, 2, 737, 738, 9, 7, 2, 2, 738, 71, 3, 2, 2, 2, 739, 740, 9, 8, 2, 2, 740, 73, 3, 2, 2, 2, 741, 746, 5, 78, 40, 2, 742, 743, 7, 41, 2, 2, 743, 745, 5, 78, 40, 2, 744, 742, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 75, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 754, 5, 78, 40, 2, 750, 751, 5, 74, 38, 2, 751, 752, 8, 39, 1, 2, 752, 754, 3, 2, 2, 2, 753, 749, 3, 2, 2, 2, 753, 750, 3, 2, 2, 2, 754, 77, 3, 2, 2, 2, 755, 756, 9, 9, 2, 2, 756, 79, 3, 2, 2, 2, 84, 83, 90, 99, 107, 132, 142, 145, 150, 165, 172, 176, 179, 192, 199, 202, 209, 215, 220, 231, 239, 245, 249, 251, 262, 264, 279, 287, 302, 310, 312, 329, 332, 335, 358, 362, 379, 387, 389, 399, 409, 411, 415, 424, 442, 446, 457, 461, 473, 477, 488, 492, 500, 510, 514, 524, 528, 538, 541, 544, 569, 608, 611, 618, 620, 627, 634, 641, 650, 653, 664, 668, 680, 687, 696, 705, 711, 718, 727, 731, 735, 746, 753] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 793, 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, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 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, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 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, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 179, 10, 6, 3, 6, 3, 6, 5, 6, 183, 10, 6, 3, 6, 5, 6, 186, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 200, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 207, 10, 8, 12, 8, 14, 8, 210, 11, 8, 3, 8, 3, 8, 5, 8, 214, 10, 8, 3, 9, 5, 9, 217, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 222, 10, 9, 12, 9, 14, 9, 225, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 262, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 268, 10, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 5, 13, 274, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 285, 10, 14, 5, 14, 287, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 300, 10, 15, 12, 15, 14, 15, 303, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 310, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 323, 10, 15, 12, 15, 14, 15, 326, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 333, 10, 15, 5, 15, 335, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 350, 10, 20, 12, 20, 14, 20, 353, 11, 20, 5, 20, 355, 10, 20, 3, 20, 5, 20, 358, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 379, 10, 20, 12, 20, 14, 20, 382, 11, 20, 3, 20, 5, 20, 385, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 403, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 416, 10, 20, 12, 20, 14, 20, 419, 11, 20, 3, 20, 3, 20, 7, 20, 423, 10, 20, 12, 20, 14, 20, 426, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 439, 10, 22, 12, 22, 14, 22, 442, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 447, 10, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 460, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 476, 10, 24, 12, 24, 14, 24, 479, 11, 24, 3, 24, 5, 24, 482, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 491, 10, 24, 12, 24, 14, 24, 494, 11, 24, 3, 24, 5, 24, 497, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 507, 10, 24, 12, 24, 14, 24, 510, 11, 24, 3, 24, 5, 24, 513, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 522, 10, 24, 12, 24, 14, 24, 525, 11, 24, 3, 24, 5, 24, 528, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 544, 10, 24, 12, 24, 14, 24, 547, 11, 24, 3, 24, 5, 24, 550, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 558, 10, 24, 12, 24, 14, 24, 561, 11, 24, 3, 24, 5, 24, 564, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 572, 10, 24, 12, 24, 14, 24, 575, 11, 24, 5, 24, 577, 10, 24, 3, 24, 5, 24, 580, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 605, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 644, 10, 24, 3, 24, 5, 24, 647, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 654, 10, 24, 12, 24, 14, 24, 657, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 663, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 668, 10, 25, 12, 25, 14, 25, 671, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 677, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 686, 10, 27, 3, 27, 5, 27, 689, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 700, 10, 28, 3, 29, 3, 29, 5, 29, 704, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 714, 10, 30, 12, 30, 14, 30, 717, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 723, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 730, 10, 31, 13, 31, 14, 31, 731, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 747, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 752, 10, 35, 12, 35, 14, 35, 755, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 763, 10, 36, 3, 37, 3, 37, 5, 37, 767, 10, 37, 3, 38, 3, 38, 5, 38, 771, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 780, 10, 41, 12, 41, 14, 41, 783, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 789, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 890, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 199, 3, 2, 2, 2, 14, 201, 3, 2, 2, 2, 16, 216, 3, 2, 2, 2, 18, 226, 3, 2, 2, 2, 20, 233, 3, 2, 2, 2, 22, 253, 3, 2, 2, 2, 24, 273, 3, 2, 2, 2, 26, 286, 3, 2, 2, 2, 28, 334, 3, 2, 2, 2, 30, 336, 3, 2, 2, 2, 32, 338, 3, 2, 2, 2, 34, 340, 3, 2, 2, 2, 36, 342, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 427, 3, 2, 2, 2, 42, 450, 3, 2, 2, 2, 44, 452, 3, 2, 2, 2, 46, 604, 3, 2, 2, 2, 48, 658, 3, 2, 2, 2, 50, 676, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 699, 3, 2, 2, 2, 56, 703, 3, 2, 2, 2, 58, 722, 3, 2, 2, 2, 60, 724, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 742, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 748, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 766, 3, 2, 2, 2, 74, 770, 3, 2, 2, 2, 76, 772, 3, 2, 2, 2, 78, 774, 3, 2, 2, 2, 80, 776, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 790, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 178, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 156, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 157, 5, 38, 20, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 179, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 179, 5, 38, 20, 2, 160, 161, 7, 63, 2, 2, 161, 162, 5, 64, 33, 2, 162, 163, 7, 7, 2, 2, 163, 171, 5, 38, 20, 2, 164, 165, 7, 10, 2, 2, 165, 166, 5, 64, 33, 2, 166, 167, 7, 7, 2, 2, 167, 168, 5, 38, 20, 2, 168, 170, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 142, 3, 2, 2, 2, 178, 158, 3, 2, 2, 2, 178, 160, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 181, 7, 62, 2, 2, 181, 183, 5, 46, 24, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 185, 3, 2, 2, 2, 184, 186, 7, 11, 2, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 11, 3, 2, 2, 2, 187, 188, 7, 12, 2, 2, 188, 200, 5, 80, 41, 2, 189, 190, 7, 12, 2, 2, 190, 191, 5, 14, 8, 2, 191, 192, 7, 62, 2, 2, 192, 193, 5, 38, 20, 2, 193, 200, 3, 2, 2, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 16, 9, 2, 198, 200, 3, 2, 2, 2, 199, 187, 3, 2, 2, 2, 199, 189, 3, 2, 2, 2, 199, 194, 3, 2, 2, 2, 200, 13, 3, 2, 2, 2, 201, 213, 5, 80, 41, 2, 202, 203, 7, 13, 2, 2, 203, 208, 5, 40, 21, 2, 204, 205, 7, 10, 2, 2, 205, 207, 5, 40, 21, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 214, 3, 2, 2, 2, 213, 202, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 15, 3, 2, 2, 2, 215, 217, 7, 15, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 223, 5, 18, 10, 2, 219, 220, 7, 15, 2, 2, 220, 222, 5, 18, 10, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 17, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 231, 5, 82, 42, 2, 227, 228, 7, 63, 2, 2, 228, 229, 5, 38, 20, 2, 229, 230, 7, 64, 2, 2, 230, 232, 3, 2, 2, 2, 231, 227, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 16, 2, 2, 234, 237, 5, 80, 41, 2, 235, 236, 7, 7, 2, 2, 236, 238, 5, 38, 20, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 7, 62, 2, 2, 240, 242, 5, 46, 24, 2, 241, 243, 7, 11, 2, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 21, 3, 2, 2, 2, 244, 254, 7, 17, 2, 2, 245, 254, 7, 18, 2, 2, 246, 247, 7, 19, 2, 2, 247, 254, 7, 17, 2, 2, 248, 249, 7, 19, 2, 2, 249, 254, 7, 18, 2, 2, 250, 254, 7, 20, 2, 2, 251, 254, 7, 21, 2, 2, 252, 254, 7, 22, 2, 2, 253, 244, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 246, 3, 2, 2, 2, 253, 248, 3, 2, 2, 2, 253, 250, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 23, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 257, 5, 32, 17, 2, 257, 258, 7, 24, 2, 2, 258, 261, 5, 66, 34, 2, 259, 260, 7, 25, 2, 2, 260, 262, 5, 36, 19, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 274, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 267, 5, 32, 17, 2, 265, 266, 7, 26, 2, 2, 266, 268, 5, 32, 17, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 270, 7, 25, 2, 2, 270, 272, 5, 36, 19, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 255, 3, 2, 2, 2, 273, 263, 3, 2, 2, 2, 274, 25, 3, 2, 2, 2, 275, 276, 7, 27, 2, 2, 276, 277, 5, 32, 17, 2, 277, 278, 7, 24, 2, 2, 278, 279, 5, 66, 34, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 284, 5, 32, 17, 2, 282, 283, 7, 26, 2, 2, 283, 285, 5, 32, 17, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 287, 3, 2, 2, 2, 286, 275, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 287, 27, 3, 2, 2, 2, 288, 289, 7, 23, 2, 2, 289, 290, 5, 30, 16, 2, 290, 291, 7, 63, 2, 2, 291, 292, 5, 32, 17, 2, 292, 293, 7, 62, 2, 2, 293, 301, 5, 46, 24, 2, 294, 295, 7, 10, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 298, 5, 46, 24, 2, 298, 300, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 305, 7, 64, 2, 2, 305, 306, 7, 24, 2, 2, 306, 309, 7, 53, 2, 2, 307, 308, 7, 25, 2, 2, 308, 310, 5, 36, 19, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 335, 3, 2, 2, 2, 311, 312, 7, 23, 2, 2, 312, 313, 5, 30, 16, 2, 313, 314, 7, 63, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 62, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 10, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 321, 5, 46, 24, 2, 321, 323, 3, 2, 2, 2, 322, 317, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 328, 7, 64, 2, 2, 328, 329, 7, 26, 2, 2, 329, 332, 5, 34, 18, 2, 330, 331, 7, 25, 2, 2, 331, 333, 5, 36, 19, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 288, 3, 2, 2, 2, 334, 311, 3, 2, 2, 2, 335, 29, 3, 2, 2, 2, 336, 337, 5, 80, 41, 2, 337, 31, 3, 2, 2, 2, 338, 339, 5, 80, 41, 2, 339, 33, 3, 2, 2, 2, 340, 341, 5, 80, 41, 2, 341, 35, 3, 2, 2, 2, 342, 343, 7, 42, 2, 2, 343, 37, 3, 2, 2, 2, 344, 345, 8, 20, 1, 2, 345, 354, 7, 63, 2, 2, 346, 351, 5, 38, 20, 2, 347, 348, 7, 10, 2, 2, 348, 350, 5, 38, 20, 2, 349, 347, 3, 2, 2, 2, 350, 353, 3, 2, 2, 2, 351, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 354, 346, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 357, 3, 2, 2, 2, 356, 358, 7, 10, 2, 2, 357, 356, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 7, 64, 2, 2, 360, 361, 7, 29, 2, 2, 361, 403, 5, 38, 20, 14, 362, 363, 7, 65, 2, 2, 363, 364, 7, 13, 2, 2, 364, 365, 5, 38, 20, 2, 365, 366, 7, 14, 2, 2, 366, 403, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 403, 3, 2, 2, 2, 372, 373, 7, 63, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 10, 2, 2, 375, 380, 5, 38, 20, 2, 376, 377, 7, 10, 2, 2, 377, 379, 5, 38, 20, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 384, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 385, 7, 10, 2, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 7, 64, 2, 2, 387, 403, 3, 2, 2, 2, 388, 390, 7, 4, 2, 2, 389, 391, 5, 42, 22, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 403, 7, 5, 2, 2, 393, 403, 7, 30, 2, 2, 394, 403, 7, 31, 2, 2, 395, 403, 7, 32, 2, 2, 396, 403, 5, 40, 21, 2, 397, 403, 5, 80, 41, 2, 398, 399, 7, 63, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 64, 2, 2, 401, 403, 3, 2, 2, 2, 402, 344, 3, 2, 2, 2, 402, 362, 3, 2, 2, 2, 402, 367, 3, 2, 2, 2, 402, 372, 3, 2, 2, 2, 402, 388, 3, 2, 2, 2, 402, 393, 3, 2, 2, 2, 402, 394, 3, 2, 2, 2, 402, 395, 3, 2, 2, 2, 402, 396, 3, 2, 2, 2, 402, 397, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 424, 3, 2, 2, 2, 404, 405, 12, 16, 2, 2, 405, 406, 7, 28, 2, 2, 406, 423, 5, 38, 20, 16, 407, 408, 12, 15, 2, 2, 408, 409, 7, 29, 2, 2, 409, 423, 5, 38, 20, 15, 410, 411, 12, 3, 2, 2, 411, 412, 7, 13, 2, 2, 412, 417, 5, 38, 20, 2, 413, 414, 7, 10, 2, 2, 414, 416, 5, 38, 20, 2, 415, 413, 3, 2, 2, 2, 416, 419, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 420, 421, 7, 14, 2, 2, 421, 423, 3, 2, 2, 2, 422, 404, 3, 2, 2, 2, 422, 407, 3, 2, 2, 2, 422, 410, 3, 2, 2, 2, 423, 426, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 39, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 428, 7, 67, 2, 2, 428, 41, 3, 2, 2, 2, 429, 430, 5, 44, 23, 2, 430, 431, 7, 7, 2, 2, 431, 432, 5, 38, 20, 2, 432, 440, 3, 2, 2, 2, 433, 434, 7, 10, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 439, 3, 2, 2, 2, 438, 433, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 446, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 447, 7, 10, 2, 2, 444, 445, 7, 15, 2, 2, 445, 447, 5, 84, 43, 2, 446, 443, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 451, 3, 2, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 84, 43, 2, 450, 429, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 43, 3, 2, 2, 2, 452, 453, 5, 82, 42, 2, 453, 45, 3, 2, 2, 2, 454, 455, 8, 24, 1, 2, 455, 605, 5, 56, 29, 2, 456, 457, 5, 72, 37, 2, 457, 459, 7, 63, 2, 2, 458, 460, 5, 68, 35, 2, 459, 458, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 64, 2, 2, 462, 605, 3, 2, 2, 2, 463, 464, 7, 52, 2, 2, 464, 605, 5, 46, 24, 27, 465, 466, 5, 80, 41, 2, 466, 467, 7, 34, 2, 2, 467, 468, 7, 62, 2, 2, 468, 469, 5, 46, 24, 23, 469, 605, 3, 2, 2, 2, 470, 471, 7, 45, 2, 2, 471, 472, 7, 4, 2, 2, 472, 477, 5, 46, 24, 2, 473, 474, 7, 10, 2, 2, 474, 476, 5, 46, 24, 2, 475, 473, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 480, 482, 7, 10, 2, 2, 481, 480, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 7, 5, 2, 2, 484, 605, 3, 2, 2, 2, 485, 486, 7, 46, 2, 2, 486, 487, 7, 4, 2, 2, 487, 492, 5, 46, 24, 2, 488, 489, 7, 10, 2, 2, 489, 491, 5, 46, 24, 2, 490, 488, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 497, 7, 10, 2, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 5, 2, 2, 499, 605, 3, 2, 2, 2, 500, 605, 5, 48, 25, 2, 501, 502, 7, 35, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 46, 24, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 46, 24, 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, 605, 3, 2, 2, 2, 516, 517, 7, 36, 2, 2, 517, 518, 7, 4, 2, 2, 518, 523, 5, 46, 24, 2, 519, 520, 7, 10, 2, 2, 520, 522, 5, 46, 24, 2, 521, 519, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 527, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 528, 7, 10, 2, 2, 527, 526, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 5, 2, 2, 530, 605, 3, 2, 2, 2, 531, 536, 5, 80, 41, 2, 532, 536, 7, 44, 2, 2, 533, 536, 7, 43, 2, 2, 534, 536, 7, 42, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 605, 3, 2, 2, 2, 537, 538, 7, 63, 2, 2, 538, 539, 5, 46, 24, 2, 539, 540, 7, 10, 2, 2, 540, 545, 5, 46, 24, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 46, 24, 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, 550, 7, 10, 2, 2, 549, 548, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 552, 7, 64, 2, 2, 552, 605, 3, 2, 2, 2, 553, 554, 7, 4, 2, 2, 554, 559, 5, 70, 36, 2, 555, 556, 7, 10, 2, 2, 556, 558, 5, 70, 36, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 564, 7, 10, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 5, 2, 2, 566, 605, 3, 2, 2, 2, 567, 576, 7, 13, 2, 2, 568, 573, 5, 46, 24, 2, 569, 570, 7, 10, 2, 2, 570, 572, 5, 46, 24, 2, 571, 569, 3, 2, 2, 2, 572, 575, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 7, 10, 2, 2, 579, 578, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 605, 7, 14, 2, 2, 582, 583, 7, 37, 2, 2, 583, 584, 7, 63, 2, 2, 584, 585, 5, 46, 24, 2, 585, 586, 7, 64, 2, 2, 586, 587, 5, 46, 24, 2, 587, 588, 7, 38, 2, 2, 588, 589, 5, 46, 24, 7, 589, 605, 3, 2, 2, 2, 590, 591, 5, 10, 6, 2, 591, 592, 5, 46, 24, 6, 592, 605, 3, 2, 2, 2, 593, 594, 5, 20, 11, 2, 594, 595, 5, 46, 24, 5, 595, 605, 3, 2, 2, 2, 596, 597, 7, 63, 2, 2, 597, 598, 5, 46, 24, 2, 598, 599, 7, 64, 2, 2, 599, 605, 3, 2, 2, 2, 600, 601, 7, 4, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 5, 2, 2, 603, 605, 3, 2, 2, 2, 604, 454, 3, 2, 2, 2, 604, 456, 3, 2, 2, 2, 604, 463, 3, 2, 2, 2, 604, 465, 3, 2, 2, 2, 604, 470, 3, 2, 2, 2, 604, 485, 3, 2, 2, 2, 604, 500, 3, 2, 2, 2, 604, 501, 3, 2, 2, 2, 604, 516, 3, 2, 2, 2, 604, 535, 3, 2, 2, 2, 604, 537, 3, 2, 2, 2, 604, 553, 3, 2, 2, 2, 604, 567, 3, 2, 2, 2, 604, 582, 3, 2, 2, 2, 604, 590, 3, 2, 2, 2, 604, 593, 3, 2, 2, 2, 604, 596, 3, 2, 2, 2, 604, 600, 3, 2, 2, 2, 605, 655, 3, 2, 2, 2, 606, 607, 12, 28, 2, 2, 607, 608, 7, 33, 2, 2, 608, 654, 5, 46, 24, 28, 609, 610, 12, 26, 2, 2, 610, 611, 9, 2, 2, 2, 611, 654, 5, 46, 24, 27, 612, 613, 12, 25, 2, 2, 613, 614, 9, 3, 2, 2, 614, 654, 5, 46, 24, 26, 615, 616, 12, 24, 2, 2, 616, 617, 9, 4, 2, 2, 617, 654, 5, 46, 24, 25, 618, 619, 12, 22, 2, 2, 619, 620, 7, 62, 2, 2, 620, 621, 5, 46, 24, 23, 621, 622, 8, 24, 1, 2, 622, 654, 3, 2, 2, 2, 623, 624, 12, 20, 2, 2, 624, 625, 7, 45, 2, 2, 625, 654, 5, 46, 24, 21, 626, 627, 12, 18, 2, 2, 627, 628, 7, 46, 2, 2, 628, 654, 5, 46, 24, 19, 629, 630, 12, 17, 2, 2, 630, 631, 7, 47, 2, 2, 631, 654, 5, 46, 24, 18, 632, 633, 12, 16, 2, 2, 633, 634, 7, 48, 2, 2, 634, 654, 5, 46, 24, 17, 635, 636, 12, 10, 2, 2, 636, 637, 7, 28, 2, 2, 637, 654, 5, 46, 24, 11, 638, 639, 12, 32, 2, 2, 639, 640, 7, 24, 2, 2, 640, 646, 5, 74, 38, 2, 641, 643, 7, 63, 2, 2, 642, 644, 5, 68, 35, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 647, 7, 64, 2, 2, 646, 641, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 654, 3, 2, 2, 2, 648, 649, 12, 29, 2, 2, 649, 650, 7, 13, 2, 2, 650, 651, 5, 46, 24, 2, 651, 652, 7, 14, 2, 2, 652, 654, 3, 2, 2, 2, 653, 606, 3, 2, 2, 2, 653, 609, 3, 2, 2, 2, 653, 612, 3, 2, 2, 2, 653, 615, 3, 2, 2, 2, 653, 618, 3, 2, 2, 2, 653, 623, 3, 2, 2, 2, 653, 626, 3, 2, 2, 2, 653, 629, 3, 2, 2, 2, 653, 632, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 638, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 47, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 50, 2, 2, 659, 660, 5, 46, 24, 2, 660, 662, 7, 4, 2, 2, 661, 663, 7, 15, 2, 2, 662, 661, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 669, 5, 50, 26, 2, 665, 666, 7, 15, 2, 2, 666, 668, 5, 50, 26, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 672, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 5, 2, 2, 673, 49, 3, 2, 2, 2, 674, 677, 5, 52, 27, 2, 675, 677, 7, 39, 2, 2, 676, 674, 3, 2, 2, 2, 676, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 679, 7, 29, 2, 2, 679, 680, 5, 46, 24, 2, 680, 51, 3, 2, 2, 2, 681, 688, 5, 82, 42, 2, 682, 685, 7, 63, 2, 2, 683, 686, 5, 82, 42, 2, 684, 686, 7, 39, 2, 2, 685, 683, 3, 2, 2, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 7, 64, 2, 2, 688, 682, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 53, 3, 2, 2, 2, 690, 691, 5, 8, 5, 2, 691, 692, 7, 2, 2, 3, 692, 700, 3, 2, 2, 2, 693, 694, 5, 46, 24, 2, 694, 695, 7, 2, 2, 3, 695, 700, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 700, 7, 2, 2, 3, 698, 700, 7, 2, 2, 3, 699, 690, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 55, 3, 2, 2, 2, 701, 704, 5, 58, 30, 2, 702, 704, 5, 60, 31, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 57, 3, 2, 2, 2, 705, 706, 5, 64, 33, 2, 706, 707, 7, 29, 2, 2, 707, 708, 5, 46, 24, 2, 708, 723, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 715, 5, 64, 33, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 64, 33, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 7, 64, 2, 2, 719, 720, 7, 29, 2, 2, 720, 721, 5, 46, 24, 2, 721, 723, 3, 2, 2, 2, 722, 705, 3, 2, 2, 2, 722, 709, 3, 2, 2, 2, 723, 59, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 729, 5, 64, 33, 2, 727, 728, 7, 10, 2, 2, 728, 730, 5, 64, 33, 2, 729, 727, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 7, 64, 2, 2, 734, 735, 7, 64, 2, 2, 735, 736, 7, 29, 2, 2, 736, 737, 5, 46, 24, 2, 737, 61, 3, 2, 2, 2, 738, 741, 7, 39, 2, 2, 739, 741, 5, 80, 41, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 743, 5, 62, 32, 2, 743, 65, 3, 2, 2, 2, 744, 747, 7, 53, 2, 2, 745, 747, 5, 80, 41, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 67, 3, 2, 2, 2, 748, 753, 5, 46, 24, 2, 749, 750, 7, 10, 2, 2, 750, 752, 5, 46, 24, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 69, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 5, 82, 42, 2, 757, 758, 7, 7, 2, 2, 758, 759, 5, 46, 24, 2, 759, 763, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 763, 5, 46, 24, 2, 762, 756, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 767, 5, 80, 41, 2, 765, 767, 9, 5, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 73, 3, 2, 2, 2, 768, 771, 5, 80, 41, 2, 769, 771, 9, 6, 2, 2, 770, 768, 3, 2, 2, 2, 770, 769, 3, 2, 2, 2, 771, 75, 3, 2, 2, 2, 772, 773, 9, 7, 2, 2, 773, 77, 3, 2, 2, 2, 774, 775, 9, 8, 2, 2, 775, 79, 3, 2, 2, 2, 776, 781, 5, 84, 43, 2, 777, 778, 7, 41, 2, 2, 778, 780, 5, 84, 43, 2, 779, 777, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 81, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 5, 80, 41, 2, 786, 787, 8, 42, 1, 2, 787, 789, 3, 2, 2, 2, 788, 784, 3, 2, 2, 2, 788, 785, 3, 2, 2, 2, 789, 83, 3, 2, 2, 2, 790, 791, 9, 9, 2, 2, 791, 85, 3, 2, 2, 2, 87, 89, 96, 105, 113, 138, 148, 151, 156, 171, 178, 182, 185, 199, 208, 213, 216, 223, 231, 237, 242, 253, 261, 267, 271, 273, 284, 286, 301, 309, 324, 332, 334, 351, 354, 357, 380, 384, 390, 402, 417, 422, 424, 440, 446, 450, 459, 477, 481, 492, 496, 508, 512, 523, 527, 535, 545, 549, 559, 563, 573, 576, 579, 604, 643, 646, 653, 655, 662, 669, 676, 685, 688, 699, 703, 715, 722, 731, 740, 746, 753, 762, 766, 770, 781, 788] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index a3529881a..c8362598c 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=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 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index e66950a16..b90ce839c 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -191,8 +191,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -209,6 +207,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -224,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 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, 303, 10, 41, 12, 41, 14, 41, 306, 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, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 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, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 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, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 199, 3, 2, 2, 2, 33, 204, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 215, 3, 2, 2, 2, 39, 224, 3, 2, 2, 2, 41, 231, 3, 2, 2, 2, 43, 233, 3, 2, 2, 2, 45, 238, 3, 2, 2, 2, 47, 241, 3, 2, 2, 2, 49, 248, 3, 2, 2, 2, 51, 251, 3, 2, 2, 2, 53, 254, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 372, 3, 2, 2, 2, 101, 376, 3, 2, 2, 2, 103, 382, 3, 2, 2, 2, 105, 384, 3, 2, 2, 2, 107, 386, 3, 2, 2, 2, 109, 388, 3, 2, 2, 2, 111, 390, 3, 2, 2, 2, 113, 392, 3, 2, 2, 2, 115, 394, 3, 2, 2, 2, 117, 396, 3, 2, 2, 2, 119, 399, 3, 2, 2, 2, 121, 402, 3, 2, 2, 2, 123, 405, 3, 2, 2, 2, 125, 408, 3, 2, 2, 2, 127, 410, 3, 2, 2, 2, 129, 412, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 126, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 113, 2, 2, 186, 187, 7, 112, 2, 2, 187, 188, 7, 102, 2, 2, 188, 189, 7, 103, 2, 2, 189, 190, 7, 118, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 120, 2, 2, 192, 193, 7, 99, 2, 2, 193, 194, 7, 110, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 102, 2, 2, 196, 197, 7, 103, 2, 2, 197, 198, 7, 104, 2, 2, 198, 30, 3, 2, 2, 2, 199, 200, 7, 114, 2, 2, 200, 201, 7, 119, 2, 2, 201, 202, 7, 116, 2, 2, 202, 203, 7, 103, 2, 2, 203, 32, 3, 2, 2, 2, 204, 205, 7, 99, 2, 2, 205, 206, 7, 101, 2, 2, 206, 207, 7, 118, 2, 2, 207, 208, 7, 107, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 116, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 112, 2, 2, 214, 36, 3, 2, 2, 2, 215, 216, 7, 118, 2, 2, 216, 217, 7, 103, 2, 2, 217, 218, 7, 111, 2, 2, 218, 219, 7, 114, 2, 2, 219, 220, 7, 113, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 38, 3, 2, 2, 2, 224, 225, 7, 107, 2, 2, 225, 226, 7, 111, 2, 2, 226, 227, 7, 114, 2, 2, 227, 228, 7, 113, 2, 2, 228, 229, 7, 116, 2, 2, 229, 230, 7, 118, 2, 2, 230, 40, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 42, 3, 2, 2, 2, 233, 234, 7, 104, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 111, 2, 2, 237, 44, 3, 2, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 117, 2, 2, 240, 46, 3, 2, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 122, 2, 2, 243, 244, 7, 114, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 116, 2, 2, 246, 247, 7, 118, 2, 2, 247, 48, 3, 2, 2, 2, 248, 249, 7, 47, 2, 2, 249, 250, 7, 64, 2, 2, 250, 50, 3, 2, 2, 2, 251, 252, 7, 63, 2, 2, 252, 253, 7, 64, 2, 2, 253, 52, 3, 2, 2, 2, 254, 255, 7, 93, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 95, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 85, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 7, 118, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 78, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 118, 2, 2, 371, 98, 3, 2, 2, 2, 372, 373, 7, 79, 2, 2, 373, 374, 7, 99, 2, 2, 374, 375, 7, 114, 2, 2, 375, 100, 3, 2, 2, 2, 376, 377, 7, 111, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 118, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 106, 2, 2, 381, 102, 3, 2, 2, 2, 382, 383, 7, 45, 2, 2, 383, 104, 3, 2, 2, 2, 384, 385, 7, 47, 2, 2, 385, 106, 3, 2, 2, 2, 386, 387, 7, 44, 2, 2, 387, 108, 3, 2, 2, 2, 388, 389, 7, 49, 2, 2, 389, 110, 3, 2, 2, 2, 390, 391, 7, 39, 2, 2, 391, 112, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 114, 3, 2, 2, 2, 394, 395, 7, 62, 2, 2, 395, 116, 3, 2, 2, 2, 396, 397, 7, 64, 2, 2, 397, 398, 7, 63, 2, 2, 398, 118, 3, 2, 2, 2, 399, 400, 7, 62, 2, 2, 400, 401, 7, 63, 2, 2, 401, 120, 3, 2, 2, 2, 402, 403, 7, 35, 2, 2, 403, 404, 7, 63, 2, 2, 404, 122, 3, 2, 2, 2, 405, 406, 7, 63, 2, 2, 406, 407, 7, 63, 2, 2, 407, 124, 3, 2, 2, 2, 408, 409, 7, 63, 2, 2, 409, 126, 3, 2, 2, 2, 410, 411, 7, 42, 2, 2, 411, 128, 3, 2, 2, 2, 412, 413, 7, 43, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 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, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 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, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 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, 303, 10, 41, 12, 41, 14, 41, 306, 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, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 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, 49, 3, 50, 3, 50, 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, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 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, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 195, 3, 2, 2, 2, 33, 199, 3, 2, 2, 2, 35, 203, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 215, 3, 2, 2, 2, 41, 219, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 112, 2, 2, 189, 190, 7, 113, 2, 2, 190, 191, 7, 112, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 118, 2, 2, 194, 30, 3, 2, 2, 2, 195, 196, 7, 120, 2, 2, 196, 197, 7, 99, 2, 2, 197, 198, 7, 110, 2, 2, 198, 32, 3, 2, 2, 2, 199, 200, 7, 102, 2, 2, 200, 201, 7, 103, 2, 2, 201, 202, 7, 104, 2, 2, 202, 34, 3, 2, 2, 2, 203, 204, 7, 114, 2, 2, 204, 205, 7, 119, 2, 2, 205, 206, 7, 116, 2, 2, 206, 207, 7, 103, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 118, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 113, 2, 2, 213, 214, 7, 112, 2, 2, 214, 38, 3, 2, 2, 2, 215, 216, 7, 116, 2, 2, 216, 217, 7, 119, 2, 2, 217, 218, 7, 112, 2, 2, 218, 40, 3, 2, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 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, 99, 2, 2, 226, 227, 7, 110, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 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 a3529881a..c8362598c 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=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 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index a2ccaf0ee..21060e0dd 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -68,24 +68,24 @@ export class QuintLexer extends Lexer { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -109,21 +109,21 @@ export class QuintLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; 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'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -132,9 +132,9 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -183,215 +183,216 @@ export class QuintLexer extends Lexer { "\x03\x03\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\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)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03*\x03*\x03" + - "*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03+\x03+\x07" + - "+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0152" + - "\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-" + - "\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x03" + - "0\x030\x030\x031\x031\x031\x031\x031\x032\x032\x032\x032\x033\x033\x03" + - "3\x033\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + - "9\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03" + - ">\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x07B\u01A1\nB\fB\x0EB\u01A4" + - "\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\nB\x03C\x03C\x07" + - "C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC\x0EC\u01B8\x05" + - "C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0ED\u01C5\vD\x03" + - "D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\vE\x03E\x03E\x03" + - "E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD\vF\x03F\x03F\x03" + - "F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03G\x06\u0130\u01C3" + - "\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v" + - "\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19" + - "\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14" + - "\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02\x1A3\x02\x1B5\x02" + - "\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C\x02#E\x02$G\x02%I" + - "\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02.[\x02/]\x020_\x02" + - "1a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02D\x87\x02E\x89\x02" + - "F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05\x022;CHch\x03\x02" + - "c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f\x0F\x0F\"\"\x02\u01FB" + - "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" + - "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" + - "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + - "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + - "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + - "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + - "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + - "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + - "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" + - "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" + - "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" + - "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" + - "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" + - "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" + - "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" + - "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" + - "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" + - "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" + - "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" + - "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" + - "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" + - "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02\x02\x02\x05\x96\x03" + - "\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02\x02\x02\v\xA0\x03\x02" + - "\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02\x02\x11\xAD\x03\x02" + - "\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02\x02\x17\xB6\x03\x02" + - "\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02" + - "\x02\x02\x1F\xC7\x03\x02\x02\x02!\xCC\x03\x02\x02\x02#\xD3\x03\x02\x02" + - "\x02%\xD7\x03\x02\x02\x02\'\xE0\x03\x02\x02\x02)\xE7\x03\x02\x02\x02+" + - "\xE9\x03\x02\x02\x02-\xEE\x03\x02\x02\x02/\xF1\x03\x02\x02\x021\xF8\x03" + - "\x02\x02\x023\xFB\x03\x02\x02\x025\xFE\x03\x02\x02\x027\u0100\x03\x02" + - "\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010A\x03\x02" + - "\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02C\u0113\x03\x02" + - "\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02I\u011E\x03\x02" + - "\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02O\u0129\x03\x02" + - "\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02U\u0156\x03\x02" + - "\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02[\u015F\x03\x02" + - "\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02a\u016F\x03\x02" + - "\x02\x02c\u0174\x03\x02\x02\x02e\u0178\x03\x02\x02\x02g\u017E\x03\x02" + - "\x02\x02i\u0180\x03\x02\x02\x02k\u0182\x03\x02\x02\x02m\u0184\x03\x02" + - "\x02\x02o\u0186\x03\x02\x02\x02q\u0188\x03\x02\x02\x02s\u018A\x03\x02" + - "\x02\x02u\u018C\x03\x02\x02\x02w\u018F\x03\x02\x02\x02y\u0192\x03\x02" + - "\x02\x02{\u0195\x03\x02\x02\x02}\u0198\x03\x02\x02\x02\x7F\u019A\x03\x02" + - "\x02\x02\x81\u019C\x03\x02\x02\x02\x83\u01AB\x03\x02\x02\x02\x85\u01BA" + - "\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8\x03\x02\x02\x02\x8B" + - "\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F\x90\x07o\x02\x02" + - "\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07w\x02\x02\x93\x94" + - "\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02\x02\x96\x97\x07" + - "}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02\x02\x99\b\x03\x02" + - "\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C\x9D\x07p\x02\x02" + - "\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03\x02\x02\x02\xA0\xA1" + - "\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02\x02\xA3\xA4\x07c" + - "\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02\xA6\xA7\x07c\x02" + - "\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA\x07w\x02\x02\xAA" + - "\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02\x02\x02\xAD\xAE" + - "\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02\x02\xB0\x14\x03" + - "\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02\xB3\xB4\x07r\x02" + - "\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6\xB7\x07~\x02\x02" + - "\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07q\x02\x02\xBA" + - "\xBB\x07p\x02\x02\xBB\xBC\x07f\x02\x02\xBC\xBD\x07g\x02\x02\xBD\xBE\x07" + - "v\x02\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07x\x02\x02\xC0\xC1\x07c\x02" + - "\x02\xC1\xC2\x07n\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07f\x02\x02" + - "\xC4\xC5\x07g\x02\x02\xC5\xC6\x07h\x02\x02\xC6\x1E\x03\x02\x02\x02\xC7" + - "\xC8\x07r\x02\x02\xC8\xC9\x07w\x02\x02\xC9\xCA\x07t\x02\x02\xCA\xCB\x07" + - "g\x02\x02\xCB \x03\x02\x02\x02\xCC\xCD\x07c\x02\x02\xCD\xCE\x07e\x02\x02" + - "\xCE\xCF\x07v\x02\x02\xCF\xD0\x07k\x02\x02\xD0\xD1\x07q\x02\x02\xD1\xD2" + - "\x07p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07t\x02\x02\xD4\xD5\x07w" + - "\x02\x02\xD5\xD6\x07p\x02\x02\xD6$\x03\x02\x02\x02\xD7\xD8\x07v\x02\x02" + - "\xD8\xD9\x07g\x02\x02\xD9\xDA\x07o\x02\x02\xDA\xDB\x07r\x02\x02\xDB\xDC" + - "\x07q\x02\x02\xDC\xDD\x07t\x02\x02\xDD\xDE\x07c\x02\x02\xDE\xDF\x07n\x02" + - "\x02\xDF&\x03\x02\x02\x02\xE0\xE1\x07k\x02\x02\xE1\xE2\x07o\x02\x02\xE2" + - "\xE3\x07r\x02\x02\xE3\xE4\x07q\x02\x02\xE4\xE5\x07t\x02\x02\xE5\xE6\x07" + - "v\x02\x02\xE6(\x03\x02\x02\x02\xE7\xE8\x070\x02\x02\xE8*\x03\x02\x02\x02" + - "\xE9\xEA\x07h\x02\x02\xEA\xEB\x07t\x02\x02\xEB\xEC\x07q\x02\x02\xEC\xED" + - "\x07o\x02\x02\xED,\x03\x02\x02\x02\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02" + - "\x02\xF0.\x03\x02\x02\x02\xF1\xF2\x07g\x02\x02\xF2\xF3\x07z\x02\x02\xF3" + - "\xF4\x07r\x02\x02\xF4\xF5\x07q\x02\x02\xF5\xF6\x07t\x02\x02\xF6\xF7\x07" + - "v\x02\x02\xF70\x03\x02\x02\x02\xF8\xF9\x07/\x02\x02\xF9\xFA\x07@\x02\x02" + - "\xFA2\x03\x02\x02\x02\xFB\xFC\x07?\x02\x02\xFC\xFD\x07@\x02\x02\xFD4\x03" + - "\x02\x02\x02\xFE\xFF\x07]\x02\x02\xFF6\x03\x02\x02\x02\u0100\u0101\x07" + - "_\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02\x02\u0103\u0104" + - "\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + - "\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109\x07t\x02\x02\u0109" + - "<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C\x07q\x02\x02\u010C" + - "\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E>\x03\x02\x02\x02\u010F" + - "\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + - "B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07n\x02\x02\u0115" + - "\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117\u0118\x07c\x02\x02\u0118" + - "\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02\u011AF\x03\x02\x02\x02\u011B" + - "\u011C\x07k\x02\x02\u011C\u011D\x07h\x02\x02\u011DH\x03\x02\x02\x02\u011E" + - "\u011F\x07g\x02\x02\u011F\u0120\x07n\x02\x02\u0120\u0121\x07u\x02\x02" + - "\u0121\u0122\x07g\x02\x02\u0122J\x03\x02\x02\x02\u0123\u0124\x07a\x02" + - "\x02\u0124L\x03\x02\x02\x02\u0125\u0126\x070\x02\x02\u0126\u0127\x070" + - "\x02\x02\u0127\u0128\x070\x02\x02\u0128N\x03\x02\x02\x02\u0129\u012A\x07" + - "<\x02\x02\u012A\u012B\x07<\x02\x02\u012BP\x03\x02\x02\x02\u012C\u0130" + - "\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E\u012D\x03\x02\x02\x02\u012F" + - "\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02\x02\x02\u0130\u012E\x03\x02" + - "\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132\u0130\x03\x02\x02\x02\u0133" + - "\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02\u0135\u0136\x07h\x02\x02\u0136" + - "\u0137\x07c\x02\x02\u0137\u0138\x07n\x02\x02\u0138\u0139\x07u\x02\x02" + - "\u0139\u013F\x07g\x02\x02\u013A\u013B\x07v\x02\x02\u013B\u013C\x07t\x02" + - "\x02\u013C\u013D\x07w\x02\x02\u013D\u013F\x07g\x02\x02\u013E\u0135\x03" + - "\x02\x02\x02\u013E\u013A\x03\x02\x02\x02\u013FT\x03\x02\x02\x02\u0140" + - "\u0157\x072\x02\x02\u0141\u0147\t\x02\x02\x02\u0142\u0146\t\x03\x02\x02" + - "\u0143\u0144\x07a\x02\x02\u0144\u0146\t\x03\x02\x02\u0145\u0142\x03\x02" + - "\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0157\x03\x02" + - "\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A\u014B\x072\x02\x02\u014B\u014C" + - "\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u0153\t\x04\x02\x02\u014E" + - "\u0152\t\x04\x02\x02\u014F\u0150\x07a\x02\x02\u0150\u0152\t\x04\x02\x02" + - "\u0151\u014E\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02\u0152\u0155\x03" + - "\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02\x02\u0154" + - "\u0157\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02\u0156\u0140\x03\x02" + - "\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156\u014A\x03\x02\x02\x02\u0157" + - "V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02\u0159\u015A\x07p\x02\x02\u015A" + - "\u015B\x07f\x02\x02\u015BX\x03\x02\x02\x02\u015C\u015D\x07q\x02\x02\u015D" + - "\u015E\x07t\x02\x02\u015EZ\x03\x02\x02\x02\u015F\u0160\x07k\x02\x02\u0160" + - "\u0161\x07h\x02\x02\u0161\u0162\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163" + - "\u0164\x07k\x02\x02\u0164\u0165\x07o\x02\x02\u0165\u0166\x07r\x02\x02" + - "\u0166\u0167\x07n\x02\x02\u0167\u0168\x07k\x02\x02\u0168\u0169\x07g\x02" + - "\x02\u0169\u016A\x07u\x02\x02\u016A^\x03\x02\x02\x02\u016B\u016C\x07U" + - "\x02\x02\u016C\u016D\x07g\x02\x02\u016D\u016E\x07v\x02\x02\u016E`\x03" + - "\x02\x02\x02\u016F\u0170\x07N\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172" + - "\x07u\x02\x02\u0172\u0173\x07v\x02\x02\u0173b\x03\x02\x02\x02\u0174\u0175" + - "\x07O\x02\x02\u0175\u0176\x07c\x02\x02\u0176\u0177\x07r\x02\x02\u0177" + - "d\x03\x02\x02\x02\u0178\u0179\x07o\x02\x02\u0179\u017A\x07c\x02\x02\u017A" + - "\u017B\x07v\x02\x02\u017B\u017C\x07e\x02\x02\u017C\u017D\x07j\x02\x02" + - "\u017Df\x03\x02\x02\x02\u017E\u017F\x07-\x02\x02\u017Fh\x03\x02\x02\x02" + - "\u0180\u0181\x07/\x02\x02\u0181j\x03\x02\x02\x02\u0182\u0183\x07,\x02" + - "\x02\u0183l\x03\x02\x02\x02\u0184\u0185\x071\x02\x02\u0185n\x03\x02\x02" + - "\x02\u0186\u0187\x07\'\x02\x02\u0187p\x03\x02\x02\x02\u0188\u0189\x07" + - "@\x02\x02\u0189r\x03\x02\x02\x02\u018A\u018B\x07>\x02\x02\u018Bt\x03\x02" + - "\x02\x02\u018C\u018D\x07@\x02\x02\u018D\u018E\x07?\x02\x02\u018Ev\x03" + - "\x02\x02\x02\u018F\u0190\x07>\x02\x02\u0190\u0191\x07?\x02\x02\u0191x" + - "\x03\x02\x02\x02\u0192\u0193\x07#\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "z\x03\x02\x02\x02\u0195\u0196\x07?\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "|\x03\x02\x02\x02\u0198\u0199\x07?\x02\x02\u0199~\x03\x02\x02\x02\u019A" + - "\u019B\x07*\x02\x02\u019B\x80\x03\x02\x02\x02\u019C\u019D\x07+\x02\x02" + - "\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t\x05\x02\x02\u019F\u01A1\t\x06" + - "\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2" + - "\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01AC\x03\x02" + - "\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A7\t\x07\x02\x02\u01A6\u01A8" + - "\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02" + - "\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03" + - "\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02\u01AC" + - "\x84\x03\x02\x02\x02\u01AD\u01B1\t\b\x02\x02\u01AE\u01B0\t\x06\x02\x02" + - "\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03\x02\x02\x02\u01B1\u01AF\x03" + - "\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2\u01BB\x03\x02\x02\x02\u01B3" + - "\u01B1\x03\x02\x02\x02\u01B4\u01B6\t\x07\x02\x02\u01B5\u01B7\t\x06\x02" + - "\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02\u01B8\u01B6" + - "\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BB\x03\x02\x02\x02" + - "\u01BA\u01AD\x03\x02\x02\x02\u01BA\u01B4\x03\x02\x02\x02\u01BB\x86\x03" + - "\x02\x02\x02\u01BC\u01BD\x071\x02\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF" + - "\x071\x02\x02\u01BF\u01C3\x03\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1" + - "\u01C0\x03\x02\x02\x02\u01C2\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02" + - "\x02\x02\u01C3\u01C1\x03\x02\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5" + - "\u01C3\x03\x02\x02\x02\u01C6\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02" + - "\x02\u01C8\u01C9\x071\x02\x02\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03" + - "\x02\x02\x02\u01CB\u01CD\v\x02\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD" + - "\u01D0\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02" + - "\x02\x02\u01CF\u01D1\x03\x02\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1" + - "\u01D2\x07\f\x02\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02" + - "\u01D4\x8A\x03\x02\x02\x02\u01D5\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02" + - "\x02\u01D7\u01DB\x03\x02\x02\x02\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8" + - "\x03\x02\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02" + - "\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03" + - "\x02\x02\x02\u01DE\u01DF\x07,\x02\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1" + - "\x03\x02\x02\x02\u01E1\u01E2\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3" + - "\u01E5\t\t\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02" + - "\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8" + - "\x03\x02\x02\x02\u01E8\u01E9\bG\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14" + - "\x02\u0130\u013E\u0145\u0147\u0151\u0153\u0156\u01A2\u01A9\u01AB\u01B1" + - "\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6\x03\b\x02\x02"; + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\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\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1C\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)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03" + + "+\x03+\x07+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03" + + "+\x07+\u0152\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03" + + "-\x03-\x03-\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03" + + "/\x030\x030\x030\x030\x031\x031\x031\x031\x031\x031\x032\x032\x033\x03" + + "3\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x039\x03" + + ":\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x07B\u01A1\n" + + "B\fB\x0EB\u01A4\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\n" + + "B\x03C\x03C\x07C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC" + + "\x0EC\u01B8\x05C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0E" + + "D\u01C5\vD\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\v" + + "E\x03E\x03E\x03E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD" + + "\vF\x03F\x03F\x03F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03" + + "G\x06\u0130\u01C3\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02" + + "\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02" + + "\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12" + + "#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02" + + "\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C" + + "\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02" + + ".[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02" + + ":s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02" + + "D\x87\x02E\x89\x02F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05" + + "\x022;CHch\x03\x02c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f" + + "\x0F\x0F\"\"\x02\u01FB\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02" + + "\x02\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02" + + "\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02" + + "\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02" + + "\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02" + + "\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03" + + "\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02" + + "\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x02" + + "3\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02" + + "\x02\x02\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02" + + "\x02A\x03\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03" + + "\x02\x02\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02" + + "\x02\x02O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02" + + "U\x03\x02\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02" + + "\x02\x02\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02" + + "\x02c\x03\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03" + + "\x02\x02\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02" + + "\x02\x02q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02" + + "w\x03\x02\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02" + + "\x02\x02\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02" + + "\x02\x02\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02" + + "\x02\x02\x02\x8B\x03\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02" + + "\x02\x02\x05\x96\x03\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02" + + "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC3\x03\x02\x02\x02!\xC7\x03\x02\x02" + + "\x02#\xCB\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD7\x03\x02\x02\x02)" + + "\xDB\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + + "C\u0113\x03\x02\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02" + + "I\u011E\x03\x02\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02" + + "O\u0129\x03\x02\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02" + + "U\u0156\x03\x02\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02" + + "[\u015F\x03\x02\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02" + + "a\u016F\x03\x02\x02\x02c\u0175\x03\x02\x02\x02e\u0177\x03\x02\x02\x02" + + "g\u0179\x03\x02\x02\x02i\u017B\x03\x02\x02\x02k\u017D\x03\x02\x02\x02" + + "m\u017F\x03\x02\x02\x02o\u0181\x03\x02\x02\x02q\u0183\x03\x02\x02\x02" + + "s\u0186\x03\x02\x02\x02u\u0189\x03\x02\x02\x02w\u018C\x03\x02\x02\x02" + + "y\u018F\x03\x02\x02\x02{\u0191\x03\x02\x02\x02}\u0193\x03\x02\x02\x02" + + "\x7F\u0195\x03\x02\x02\x02\x81\u0199\x03\x02\x02\x02\x83\u01AB\x03\x02" + + "\x02\x02\x85\u01BA\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8" + + "\x03\x02\x02\x02\x8B\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F" + + "\x90\x07o\x02\x02\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07" + + "w\x02\x02\x93\x94\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02" + + "\x02\x96\x97\x07}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02" + + "\x02\x99\b\x03\x02\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C" + + "\x9D\x07p\x02\x02\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03" + + "\x02\x02\x02\xA0\xA1\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02" + + "\x02\xA3\xA4\x07c\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02" + + "\xA6\xA7\x07c\x02\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA" + + "\x07w\x02\x02\xAA\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02" + + "\x02\x02\xAD\xAE\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02" + + "\x02\xB0\x14\x03\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02" + + "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + + "\x07p\x02\x02\xBD\xBE\x07q\x02\x02\xBE\xBF\x07p\x02\x02\xBF\xC0\x07f\x02" + + "\x02\xC0\xC1\x07g\x02\x02\xC1\xC2\x07v\x02\x02\xC2\x1E\x03\x02\x02\x02" + + "\xC3\xC4\x07x\x02\x02\xC4\xC5\x07c\x02\x02\xC5\xC6\x07n\x02\x02\xC6 \x03" + + "\x02\x02\x02\xC7\xC8\x07f\x02\x02\xC8\xC9\x07g\x02\x02\xC9\xCA\x07h\x02" + + "\x02\xCA\"\x03\x02\x02\x02\xCB\xCC\x07r\x02\x02\xCC\xCD\x07w\x02\x02\xCD" + + "\xCE\x07t\x02\x02\xCE\xCF\x07g\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1\x07" + + "c\x02\x02\xD1\xD2\x07e\x02\x02\xD2\xD3\x07v\x02\x02\xD3\xD4\x07k\x02\x02" + + "\xD4\xD5\x07q\x02\x02\xD5\xD6\x07p\x02\x02\xD6&\x03\x02\x02\x02\xD7\xD8" + + "\x07t\x02\x02\xD8\xD9\x07w\x02\x02\xD9\xDA\x07p\x02\x02\xDA(\x03\x02\x02" + + "\x02\xDB\xDC\x07v\x02\x02\xDC\xDD\x07g\x02\x02\xDD\xDE\x07o\x02\x02\xDE" + + "\xDF\x07r\x02\x02\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07" + + "c\x02\x02\xE2\xE3\x07n\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02\x02" + + "\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9" + + "\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x070\x02" + + "\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02\xEF" + + "\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3\x07" + + "c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02\x02" + + "\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9\xFA" + + "\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07/\x02" + + "\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02\x02" + + "\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02" + + "\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02" + + "\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + + "\u0112\x07)\x02\x02\u0112B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114" + + "\u0115\x07n\x02\x02\u0115\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117" + + "\u0118\x07c\x02\x02\u0118\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02" + + "\u011AF\x03\x02\x02\x02\u011B\u011C\x07k\x02\x02\u011C\u011D\x07h\x02" + + "\x02\u011DH\x03\x02\x02\x02\u011E\u011F\x07g\x02\x02\u011F\u0120\x07n" + + "\x02\x02\u0120\u0121\x07u\x02\x02\u0121\u0122\x07g\x02\x02\u0122J\x03" + + "\x02\x02\x02\u0123\u0124\x07a\x02\x02\u0124L\x03\x02\x02\x02\u0125\u0126" + + "\x070\x02\x02\u0126\u0127\x070\x02\x02\u0127\u0128\x070\x02\x02\u0128" + + "N\x03\x02\x02\x02\u0129\u012A\x07<\x02\x02\u012A\u012B\x07<\x02\x02\u012B" + + "P\x03\x02\x02\x02\u012C\u0130\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E" + + "\u012D\x03\x02\x02\x02\u012F\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02" + + "\x02\x02\u0130\u012E\x03\x02\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0133\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02" + + "\u0135\u0136\x07h\x02\x02\u0136\u0137\x07c\x02\x02\u0137\u0138\x07n\x02" + + "\x02\u0138\u0139\x07u\x02\x02\u0139\u013F\x07g\x02\x02\u013A\u013B\x07" + + "v\x02\x02\u013B\u013C\x07t\x02\x02\u013C\u013D\x07w\x02\x02\u013D\u013F" + + "\x07g\x02\x02\u013E\u0135\x03\x02\x02\x02\u013E\u013A\x03\x02\x02\x02" + + "\u013FT\x03\x02\x02\x02\u0140\u0157\x072\x02\x02\u0141\u0147\t\x02\x02" + + "\x02\u0142\u0146\t\x03\x02\x02\u0143\u0144\x07a\x02\x02\u0144\u0146\t" + + "\x03\x02\x02\u0145\u0142\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146" + + "\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02" + + "\x02\x02\u0148\u0157\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A" + + "\u014B\x072\x02\x02\u014B\u014C\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02" + + "\u014D\u0153\t\x04\x02\x02\u014E\u0152\t\x04\x02\x02\u014F\u0150\x07a" + + "\x02\x02\u0150\u0152\t\x04\x02\x02\u0151\u014E\x03\x02\x02\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02" + + "\u0153\u0154\x03\x02\x02\x02\u0154\u0157\x03\x02\x02\x02\u0155\u0153\x03" + + "\x02\x02\x02\u0156\u0140\x03\x02\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156" + + "\u014A\x03\x02\x02\x02\u0157V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02" + + "\u0159\u015A\x07p\x02\x02\u015A\u015B\x07f\x02\x02\u015BX\x03\x02\x02" + + "\x02\u015C\u015D\x07q\x02\x02\u015D\u015E\x07t\x02\x02\u015EZ\x03\x02" + + "\x02\x02\u015F\u0160\x07k\x02\x02\u0160\u0161\x07h\x02\x02\u0161\u0162" + + "\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163\u0164\x07k\x02\x02\u0164\u0165" + + "\x07o\x02\x02\u0165\u0166\x07r\x02\x02\u0166\u0167\x07n\x02\x02\u0167" + + "\u0168\x07k\x02\x02\u0168\u0169\x07g\x02\x02\u0169\u016A\x07u\x02\x02" + + "\u016A^\x03\x02\x02\x02\u016B\u016C\x07O\x02\x02\u016C\u016D\x07c\x02" + + "\x02\u016D\u016E\x07r\x02\x02\u016E`\x03\x02\x02\x02\u016F\u0170\x07o" + + "\x02\x02\u0170\u0171\x07c\x02\x02\u0171\u0172\x07v\x02\x02\u0172\u0173" + + "\x07e\x02\x02\u0173\u0174\x07j\x02\x02\u0174b\x03\x02\x02\x02\u0175\u0176" + + "\x07-\x02\x02\u0176d\x03\x02\x02\x02\u0177\u0178\x07/\x02\x02\u0178f\x03" + + "\x02\x02\x02\u0179\u017A\x07,\x02\x02\u017Ah\x03\x02\x02\x02\u017B\u017C" + + "\x071\x02\x02\u017Cj\x03\x02\x02\x02\u017D\u017E\x07\'\x02\x02\u017El" + + "\x03\x02\x02\x02\u017F\u0180\x07@\x02\x02\u0180n\x03\x02\x02\x02\u0181" + + "\u0182\x07>\x02\x02\u0182p\x03\x02\x02\x02\u0183\u0184\x07@\x02\x02\u0184" + + "\u0185\x07?\x02\x02\u0185r\x03\x02\x02\x02\u0186\u0187\x07>\x02\x02\u0187" + + "\u0188\x07?\x02\x02\u0188t\x03\x02\x02\x02\u0189\u018A\x07#\x02\x02\u018A" + + "\u018B\x07?\x02\x02\u018Bv\x03\x02\x02\x02\u018C\u018D\x07?\x02\x02\u018D" + + "\u018E\x07?\x02\x02\u018Ex\x03\x02\x02\x02\u018F\u0190\x07?\x02\x02\u0190" + + "z\x03\x02\x02\x02\u0191\u0192\x07*\x02\x02\u0192|\x03\x02\x02\x02\u0193" + + "\u0194\x07+\x02\x02\u0194~\x03\x02\x02\x02\u0195\u0196\x07U\x02\x02\u0196" + + "\u0197\x07g\x02\x02\u0197\u0198\x07v\x02\x02\u0198\x80\x03\x02\x02\x02" + + "\u0199\u019A\x07N\x02\x02\u019A\u019B\x07k\x02\x02\u019B\u019C\x07u\x02" + + "\x02\u019C\u019D\x07v\x02\x02\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t" + + "\x05\x02\x02\u019F\u01A1\t\x06\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1" + + "\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A7\t\x07\x02\x02\u01A6\u01A8\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02" + + "\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA" + + "\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02" + + "\u01AB\u01A5\x03\x02\x02\x02\u01AC\x84\x03\x02\x02\x02\u01AD\u01B1\t\b" + + "\x02\x02\u01AE\u01B0\t\x06\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3" + + "\x03\x02\x02\x02\u01B1\u01AF\x03\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02" + + "\u01B2\u01BB\x03\x02\x02\x02\u01B3\u01B1\x03\x02\x02\x02\u01B4\u01B6\t" + + "\x07\x02\x02\u01B5\u01B7\t\x06\x02\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7" + + "\u01B8\x03\x02\x02\x02\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02" + + "\x02\x02\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01AD\x03\x02\x02\x02\u01BA" + + "\u01B4\x03\x02\x02\x02\u01BB\x86\x03\x02\x02\x02\u01BC\u01BD\x071\x02" + + "\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF\x071\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1\u01C0\x03\x02\x02\x02\u01C2" + + "\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C3\u01C1\x03\x02" + + "\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5\u01C3\x03\x02\x02\x02\u01C6" + + "\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02\x02\u01C8\u01C9\x071\x02\x02" + + "\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03\x02\x02\x02\u01CB\u01CD\v\x02" + + "\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD\u01D0\x03\x02\x02\x02\u01CE" + + "\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02\x02\x02\u01CF\u01D1\x03\x02" + + "\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1\u01D2\x07\f\x02\x02\u01D2\u01D3" + + "\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02\u01D4\x8A\x03\x02\x02\x02\u01D5" + + "\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02\x02\u01D7\u01DB\x03\x02\x02\x02" + + "\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8\x03\x02\x02\x02\u01DA\u01DD\x03" + + "\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC" + + "\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DE\u01DF\x07,\x02" + + "\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E2" + + "\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3\u01E5\t\t\x02\x02\u01E4\u01E3" + + "\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02" + + "\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b" + + "G\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14\x02\u0130\u013E\u0145\u0147\u0151" + + "\u0153\u0156\u01A2\u01A9\u01AB\u01B1\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6" + + "\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index b687aeefd..3894383e6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -226,17 +230,17 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeVar` + * Enter a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeVar?: (ctx: TypeVarContext) => void; + enterTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** - * Exit a parse tree produced by the `typeVar` + * Exit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeVar?: (ctx: TypeVarContext) => void; + exitTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** * Enter a parse tree produced by the `typeConst` @@ -264,6 +268,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeParen?: (ctx: TypeParenContext) => void; + /** + * Enter a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeApp?: (ctx: TypeAppContext) => void; + /** + * Exit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeApp?: (ctx: TypeAppContext) => void; + /** * Enter a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -863,6 +880,28 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeDef?: (ctx: TypeDefContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + enterTypeDefHead?: (ctx: TypeDefHeadContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + exitTypeDefHead?: (ctx: TypeDefHeadContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + enterSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** + * Exit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + exitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** * Enter a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -984,6 +1023,17 @@ export interface QuintListener extends ParseTreeListener { */ exitType?: (ctx: TypeContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + enterTypeVar?: (ctx: TypeVarContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + exitTypeVar?: (ctx: TypeVarContext) => void; + /** * Enter a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 8a95eddc0..53294b225 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -80,24 +80,24 @@ export class QuintParser extends Parser { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -110,59 +110,63 @@ export class QuintParser extends Parser { public static readonly RULE_declaration = 3; public static readonly RULE_operDef = 4; public static readonly RULE_typeDef = 5; - 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_row = 17; - public static readonly RULE_rowLabel = 18; - public static readonly RULE_expr = 19; - public static readonly RULE_matchSumExpr = 20; - public static readonly RULE_matchSumCase = 21; - public static readonly RULE_matchSumVariant = 22; - public static readonly RULE_declarationOrExpr = 23; - public static readonly RULE_lambda = 24; - public static readonly RULE_lambdaUnsugared = 25; - public static readonly RULE_lambdaTupleSugar = 26; - public static readonly RULE_identOrHole = 27; - public static readonly RULE_parameter = 28; - public static readonly RULE_identOrStar = 29; - public static readonly RULE_argList = 30; - public static readonly RULE_recElem = 31; - public static readonly RULE_normalCallName = 32; - public static readonly RULE_nameAfterDot = 33; - public static readonly RULE_operator = 34; - public static readonly RULE_literal = 35; - public static readonly RULE_qualId = 36; - public static readonly RULE_simpleId = 37; - public static readonly RULE_identifier = 38; + public static readonly RULE_typeDefHead = 6; + public static readonly RULE_sumTypeDefinition = 7; + public static readonly RULE_typeSumVariant = 8; + public static readonly RULE_nondetOperDef = 9; + public static readonly RULE_qualifier = 10; + public static readonly RULE_importMod = 11; + public static readonly RULE_exportMod = 12; + public static readonly RULE_instanceMod = 13; + public static readonly RULE_moduleName = 14; + public static readonly RULE_name = 15; + public static readonly RULE_qualifiedName = 16; + public static readonly RULE_fromSource = 17; + public static readonly RULE_type = 18; + public static readonly RULE_typeVar = 19; + public static readonly RULE_row = 20; + public static readonly RULE_rowLabel = 21; + public static readonly RULE_expr = 22; + public static readonly RULE_matchSumExpr = 23; + public static readonly RULE_matchSumCase = 24; + public static readonly RULE_matchSumVariant = 25; + public static readonly RULE_declarationOrExpr = 26; + public static readonly RULE_lambda = 27; + public static readonly RULE_lambdaUnsugared = 28; + public static readonly RULE_lambdaTupleSugar = 29; + public static readonly RULE_identOrHole = 30; + public static readonly RULE_parameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeSumVariant", "nondetOperDef", "qualifier", "importMod", - "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", "fromSource", - "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", - "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", - "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "nondetOperDef", + "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", + "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", + "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", + "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; 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'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -171,9 +175,9 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -210,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 79; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 78; + this.state = 84; this.module(); } } - this.state = 81; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 83; + this.state = 89; this.match(QuintParser.EOF); } } @@ -250,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 88; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 85; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 90; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 91; + this.state = 97; this.match(QuintParser.T__0); - this.state = 92; + this.state = 98; this.qualId(); - this.state = 93; + this.state = 99; this.match(QuintParser.T__1); - this.state = 97; + this.state = 103; 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__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) { + 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__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 94; + this.state = 100; this.documentedDeclaration(); } } - this.state = 99; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 100; + this.state = 106; this.match(QuintParser.T__2); } } @@ -310,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 105; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 102; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 107; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 108; + this.state = 114; this.declaration(); } } @@ -347,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 130; + this.state = 136; 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 = 110; + this.state = 116; this.match(QuintParser.T__3); - this.state = 111; + this.state = 117; this.qualId(); - this.state = 112; + this.state = 118; this.match(QuintParser.T__4); - this.state = 113; + this.state = 119; this.type(0); } break; @@ -369,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 115; + this.state = 121; this.match(QuintParser.T__5); - this.state = 116; + this.state = 122; this.qualId(); - this.state = 117; + this.state = 123; this.match(QuintParser.T__4); - this.state = 118; + this.state = 124; this.type(0); } break; @@ -384,13 +388,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 120; + this.state = 126; this.match(QuintParser.T__6); - this.state = 121; + this.state = 127; this.identOrHole(); - this.state = 122; + this.state = 128; this.match(QuintParser.ASGN); - this.state = 123; + this.state = 129; this.expr(0); } break; @@ -399,7 +403,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 125; + this.state = 131; this.instanceMod(); } break; @@ -408,7 +412,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 126; + this.state = 132; this.operDef(); } break; @@ -417,7 +421,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 127; + this.state = 133; this.typeDef(); } break; @@ -426,7 +430,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 128; + this.state = 134; this.importMod(); } break; @@ -435,7 +439,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 129; + this.state = 135; this.exportMod(); } break; @@ -463,53 +467,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 132; + this.state = 138; this.qualifier(); - this.state = 133; + this.state = 139; this.normalCallName(); - this.state = 170; + this.state = 176; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 134; + this.state = 140; this.match(QuintParser.LPAREN); - this.state = 143; + this.state = 149; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 135; + this.state = 141; this.parameter(); - this.state = 140; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 136; + this.state = 142; this.match(QuintParser.T__7); - this.state = 137; + this.state = 143; this.parameter(); } } - this.state = 142; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 145; + this.state = 151; this.match(QuintParser.RPAREN); - this.state = 148; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 146; + this.state = 152; this.match(QuintParser.T__4); - this.state = 147; + this.state = 153; this.type(0); } } @@ -519,72 +523,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 150; + this.state = 156; this.match(QuintParser.T__4); - this.state = 151; + this.state = 157; this.type(0); } break; case 3: { - this.state = 152; + this.state = 158; this.match(QuintParser.LPAREN); { - this.state = 153; + this.state = 159; this.parameter(); - this.state = 154; + this.state = 160; this.match(QuintParser.T__4); - this.state = 155; + this.state = 161; this.type(0); - this.state = 163; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 156; + this.state = 162; this.match(QuintParser.T__7); - this.state = 157; + this.state = 163; this.parameter(); - this.state = 158; + this.state = 164; this.match(QuintParser.T__4); - this.state = 159; + this.state = 165; this.type(0); } } - this.state = 165; + this.state = 171; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 166; + this.state = 172; this.match(QuintParser.RPAREN); - this.state = 167; + this.state = 173; this.match(QuintParser.T__4); - this.state = 168; + this.state = 174; this.type(0); } break; } - this.state = 174; + this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 172; + this.state = 178; this.match(QuintParser.ASGN); - this.state = 173; + this.state = 179; this.expr(0); } } - this.state = 177; + this.state = 183; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 176; + this.state = 182; this.match(QuintParser.T__8); } } @@ -609,18 +613,17 @@ 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 = 200; + this.state = 197; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 179; + this.state = 185; this.match(QuintParser.T__9); - this.state = 180; + this.state = 186; this.qualId(); } break; @@ -629,13 +632,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 181; + this.state = 187; this.match(QuintParser.T__9); - this.state = 182; - this.qualId(); - this.state = 183; + this.state = 188; + this.typeDefHead(); + this.state = 189; this.match(QuintParser.ASGN); - this.state = 184; + this.state = 190; this.type(0); } break; @@ -644,42 +647,126 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 186; + this.state = 192; this.match(QuintParser.T__9); - this.state = 187; - (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 188; + this.state = 193; + this.typeDefHead(); + this.state = 194; this.match(QuintParser.ASGN); - this.state = 190; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__10) { - { - this.state = 189; - this.match(QuintParser.T__10); - } + this.state = 195; + this.sumTypeDefinition(); } - - this.state = 192; - this.typeSumVariant(); - this.state = 197; + 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 typeDefHead(): TypeDefHeadContext { + let _localctx: TypeDefHeadContext = new TypeDefHeadContext(this._ctx, this.state); + this.enterRule(_localctx, 12, QuintParser.RULE_typeDefHead); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 199; + _localctx._typeName = this.qualId(); + this.state = 211; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 200; + this.match(QuintParser.T__10); + this.state = 201; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); + this.state = 206; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__7) { { { - this.state = 193; - this.match(QuintParser.T__10); - this.state = 194; - this.typeSumVariant(); + this.state = 202; + this.match(QuintParser.T__7); + this.state = 203; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 199; + this.state = 208; this._errHandler.sync(this); _la = this._input.LA(1); } + this.state = 209; + this.match(QuintParser.T__11); } - 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 sumTypeDefinition(): SumTypeDefinitionContext { + let _localctx: SumTypeDefinitionContext = new SumTypeDefinitionContext(this._ctx, this.state); + this.enterRule(_localctx, 14, QuintParser.RULE_sumTypeDefinition); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 214; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12) { + { + this.state = 213; + this.match(QuintParser.T__12); + } + } + + this.state = 216; + this.typeSumVariant(); + this.state = 221; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__12) { + { + { + this.state = 217; + this.match(QuintParser.T__12); + this.state = 218; + this.typeSumVariant(); + } + } + this.state = 223; + this._errHandler.sync(this); + _la = this._input.LA(1); + } } } catch (re) { @@ -699,23 +786,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeSumVariant(): TypeSumVariantContext { let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 12, QuintParser.RULE_typeSumVariant); + this.enterRule(_localctx, 16, QuintParser.RULE_typeSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 202; + this.state = 224; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 207; + this.state = 229; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 203; + this.state = 225; this.match(QuintParser.LPAREN); - this.state = 204; + this.state = 226; this.type(0); - this.state = 205; + this.state = 227; this.match(QuintParser.RPAREN); } } @@ -739,37 +826,37 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nondetOperDef(): NondetOperDefContext { let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 14, QuintParser.RULE_nondetOperDef); + this.enterRule(_localctx, 18, QuintParser.RULE_nondetOperDef); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 209; - this.match(QuintParser.T__11); - this.state = 210; + this.state = 231; + this.match(QuintParser.T__13); + this.state = 232; this.qualId(); - this.state = 213; + this.state = 235; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 211; + this.state = 233; this.match(QuintParser.T__4); - this.state = 212; + this.state = 234; this.type(0); } } - this.state = 215; + this.state = 237; this.match(QuintParser.ASGN); - this.state = 216; + this.state = 238; this.expr(0); - this.state = 218; + this.state = 240; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 217; + this.state = 239; this.match(QuintParser.T__8); } } @@ -793,68 +880,68 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 229; + this.state = 251; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 220; - this.match(QuintParser.T__12); + this.state = 242; + this.match(QuintParser.T__14); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 221; - this.match(QuintParser.T__13); + this.state = 243; + this.match(QuintParser.T__15); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 222; + this.state = 244; + this.match(QuintParser.T__16); + this.state = 245; this.match(QuintParser.T__14); - this.state = 223; - this.match(QuintParser.T__12); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 224; - this.match(QuintParser.T__14); - this.state = 225; - this.match(QuintParser.T__13); + this.state = 246; + this.match(QuintParser.T__16); + this.state = 247; + this.match(QuintParser.T__15); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 226; - this.match(QuintParser.T__15); + this.state = 248; + this.match(QuintParser.T__17); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 227; - this.match(QuintParser.T__16); + this.state = 249; + this.match(QuintParser.T__18); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 228; - this.match(QuintParser.T__17); + this.state = 250; + this.match(QuintParser.T__19); } break; } @@ -876,31 +963,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_importMod); + this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 249; + this.state = 271; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 231; - this.match(QuintParser.T__18); - this.state = 232; + this.state = 253; + this.match(QuintParser.T__20); + this.state = 254; this.name(); - this.state = 233; - this.match(QuintParser.T__19); - this.state = 234; + this.state = 255; + this.match(QuintParser.T__21); + this.state = 256; this.identOrStar(); - this.state = 237; + this.state = 259; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 235; - this.match(QuintParser.T__20); - this.state = 236; + this.state = 257; + this.match(QuintParser.T__22); + this.state = 258; this.fromSource(); } } @@ -911,30 +998,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 239; - this.match(QuintParser.T__18); - this.state = 240; + this.state = 261; + this.match(QuintParser.T__20); + this.state = 262; this.name(); - this.state = 243; + this.state = 265; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 241; - this.match(QuintParser.T__21); - this.state = 242; + this.state = 263; + this.match(QuintParser.T__23); + this.state = 264; this.name(); } } - this.state = 247; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 245; - this.match(QuintParser.T__20); - this.state = 246; + this.state = 267; + this.match(QuintParser.T__22); + this.state = 268; this.fromSource(); } } @@ -960,22 +1047,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 262; + this.state = 284; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 251; - this.match(QuintParser.T__22); - this.state = 252; + this.state = 273; + this.match(QuintParser.T__24); + this.state = 274; this.name(); - this.state = 253; - this.match(QuintParser.T__19); - this.state = 254; + this.state = 275; + this.match(QuintParser.T__21); + this.state = 276; this.identOrStar(); } break; @@ -983,18 +1070,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 256; - this.match(QuintParser.T__22); - this.state = 257; + this.state = 278; + this.match(QuintParser.T__24); + this.state = 279; this.name(); - this.state = 260; + this.state = 282; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 258; - this.match(QuintParser.T__21); - this.state = 259; + this.state = 280; + this.match(QuintParser.T__23); + this.state = 281; this.name(); } } @@ -1020,63 +1107,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 310; + this.state = 332; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 264; - this.match(QuintParser.T__18); - this.state = 265; + this.state = 286; + this.match(QuintParser.T__20); + this.state = 287; this.moduleName(); - this.state = 266; + this.state = 288; this.match(QuintParser.LPAREN); { - this.state = 267; + this.state = 289; this.name(); - this.state = 268; + this.state = 290; this.match(QuintParser.ASGN); - this.state = 269; + this.state = 291; this.expr(0); - this.state = 277; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 270; + this.state = 292; this.match(QuintParser.T__7); - this.state = 271; + this.state = 293; this.name(); - this.state = 272; + this.state = 294; this.match(QuintParser.ASGN); - this.state = 273; + this.state = 295; this.expr(0); } } - this.state = 279; + this.state = 301; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 280; + this.state = 302; this.match(QuintParser.RPAREN); - this.state = 281; - this.match(QuintParser.T__19); - this.state = 282; + this.state = 303; + this.match(QuintParser.T__21); + this.state = 304; this.match(QuintParser.MUL); - this.state = 285; + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 283; - this.match(QuintParser.T__20); - this.state = 284; + this.state = 305; + this.match(QuintParser.T__22); + this.state = 306; this.fromSource(); } } @@ -1087,54 +1174,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 287; - this.match(QuintParser.T__18); - this.state = 288; + this.state = 309; + this.match(QuintParser.T__20); + this.state = 310; this.moduleName(); - this.state = 289; + this.state = 311; this.match(QuintParser.LPAREN); { - this.state = 290; + this.state = 312; this.name(); - this.state = 291; + this.state = 313; this.match(QuintParser.ASGN); - this.state = 292; + this.state = 314; this.expr(0); - this.state = 300; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 293; + this.state = 315; this.match(QuintParser.T__7); - this.state = 294; + this.state = 316; this.name(); - this.state = 295; + this.state = 317; this.match(QuintParser.ASGN); - this.state = 296; + this.state = 318; this.expr(0); } } - this.state = 302; + this.state = 324; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 303; + this.state = 325; this.match(QuintParser.RPAREN); - this.state = 304; - this.match(QuintParser.T__21); - this.state = 305; + this.state = 326; + this.match(QuintParser.T__23); + this.state = 327; this.qualifiedName(); - this.state = 308; + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 306; - this.match(QuintParser.T__20); - this.state = 307; + this.state = 328; + this.match(QuintParser.T__22); + this.state = 329; this.fromSource(); } } @@ -1160,11 +1247,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 28, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 334; this.qualId(); } } @@ -1185,11 +1272,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_name); + this.enterRule(_localctx, 30, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 336; this.qualId(); } } @@ -1210,11 +1297,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 32, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 338; this.qualId(); } } @@ -1235,11 +1322,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 34, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 318; + this.state = 340; this.match(QuintParser.STRING); } } @@ -1270,68 +1357,68 @@ 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 = 32; - this.enterRecursionRule(_localctx, 32, QuintParser.RULE_type, _p); + let _startState: number = 36; + this.enterRecursionRule(_localctx, 36, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 377; + this.state = 400; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 321; + this.state = 343; this.match(QuintParser.LPAREN); - this.state = 330; + this.state = 352; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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.LOW_ID - 47)) | (1 << (QuintParser.CAP_ID - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 322; + this.state = 344; this.type(0); - this.state = 327; + this.state = 349; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 323; + this.state = 345; this.match(QuintParser.T__7); - this.state = 324; + this.state = 346; this.type(0); } } } - this.state = 329; + this.state = 351; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); } } } - this.state = 333; + this.state = 355; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 332; + this.state = 354; this.match(QuintParser.T__7); } } - this.state = 335; + this.state = 357; this.match(QuintParser.RPAREN); - this.state = 336; - this.match(QuintParser.T__24); - this.state = 337; - this.type(11); + this.state = 358; + this.match(QuintParser.T__26); + this.state = 359; + this.type(12); } break; @@ -1340,14 +1427,14 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 338; + this.state = 360; this.match(QuintParser.SET); - this.state = 339; - this.match(QuintParser.T__25); - this.state = 340; + this.state = 361; + this.match(QuintParser.T__10); + this.state = 362; this.type(0); - this.state = 341; - this.match(QuintParser.T__26); + this.state = 363; + this.match(QuintParser.T__11); } break; @@ -1356,14 +1443,14 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 365; this.match(QuintParser.LIST); - this.state = 344; - this.match(QuintParser.T__25); - this.state = 345; + this.state = 366; + this.match(QuintParser.T__10); + this.state = 367; this.type(0); - this.state = 346; - this.match(QuintParser.T__26); + this.state = 368; + this.match(QuintParser.T__11); } break; @@ -1372,43 +1459,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 348; + this.state = 370; this.match(QuintParser.LPAREN); - this.state = 349; + this.state = 371; this.type(0); - this.state = 350; + this.state = 372; this.match(QuintParser.T__7); - this.state = 351; + this.state = 373; this.type(0); - this.state = 356; + this.state = 378; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 352; + this.state = 374; this.match(QuintParser.T__7); - this.state = 353; + this.state = 375; this.type(0); } } } - this.state = 358; + this.state = 380; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } - this.state = 360; + this.state = 382; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 359; + this.state = 381; this.match(QuintParser.T__7); } } - this.state = 362; + this.state = 384; this.match(QuintParser.RPAREN); } break; @@ -1418,11 +1505,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 386; this.match(QuintParser.T__1); - this.state = 365; - this.row(); - this.state = 366; + this.state = 388; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + { + this.state = 387; + this.row(); + } + } + + this.state = 390; this.match(QuintParser.T__2); } break; @@ -1432,7 +1527,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 391; this.match(QuintParser.T__27); } break; @@ -1442,7 +1537,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 392; this.match(QuintParser.T__28); } break; @@ -1452,18 +1547,18 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 393; this.match(QuintParser.T__29); } break; case 9: { - _localctx = new TypeVarContext(_localctx); + _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 371; - this.match(QuintParser.LOW_ID); + this.state = 394; + this.typeVar(); } break; @@ -1472,7 +1567,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 372; + this.state = 395; this.qualId(); } break; @@ -1482,19 +1577,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 373; + this.state = 396; this.match(QuintParser.LPAREN); - this.state = 374; + this.state = 397; this.type(0); - this.state = 375; + this.state = 398; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 387; + this.state = 422; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1502,44 +1597,82 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 385; + this.state = 420; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; + this.state = 402; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + } + this.state = 403; + this.match(QuintParser.T__25); + this.state = 404; + this.type(14); + } + break; + + case 2: + { + _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); + this.state = 405; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 380; - this.match(QuintParser.T__23); - this.state = 381; + this.state = 406; + this.match(QuintParser.T__26); + this.state = 407; this.type(13); } break; - case 2: + case 3: { - _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); + (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 382; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 408; + if (!(this.precpred(this._ctx, 1))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); + } + { + this.state = 409; + this.match(QuintParser.T__10); + this.state = 410; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 415; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 411; + this.match(QuintParser.T__7); + this.state = 412; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 417; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 418; + this.match(QuintParser.T__11); } - this.state = 383; - this.match(QuintParser.T__24); - this.state = 384; - this.type(12); } break; } } } - this.state = 389; + this.state = 424; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } } } @@ -1558,91 +1691,106 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) + public typeVar(): TypeVarContext { + let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); + this.enterRule(_localctx, 38, QuintParser.RULE_typeVar); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 425; + this.match(QuintParser.LOW_ID); + } + } + 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 row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_row); - let _la: number; + this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 413; + this.state = 448; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.T__2: case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 397; + { + this.state = 427; + this.rowLabel(); + this.state = 428; + this.match(QuintParser.T__4); + this.state = 429; + this.type(0); + } + this.state = 438; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 390; + this.state = 431; + this.match(QuintParser.T__7); + this.state = 432; this.rowLabel(); - this.state = 391; + this.state = 433; this.match(QuintParser.T__4); - this.state = 392; + this.state = 434; this.type(0); - this.state = 393; - this.match(QuintParser.T__7); } } } - this.state = 399; + this.state = 440; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } - this.state = 409; + this.state = 444; this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { - { + switch (this._input.LA(1)) { + case QuintParser.T__7: { - this.state = 400; - this.rowLabel(); - this.state = 401; - this.match(QuintParser.T__4); - this.state = 402; - this.type(0); + this.state = 441; + this.match(QuintParser.T__7); } - this.state = 407; - this._errHandler.sync(this); - switch (this._input.LA(1)) { - case QuintParser.T__7: - { - this.state = 404; - this.match(QuintParser.T__7); - } - break; - case QuintParser.T__10: - { - this.state = 405; - this.match(QuintParser.T__10); - { - this.state = 406; - _localctx._rowVar = this.identifier(); - } - } - break; - case QuintParser.T__2: - break; - default: - break; + break; + case QuintParser.T__12: + { + this.state = 442; + this.match(QuintParser.T__12); + { + this.state = 443; + _localctx._rowVar = this.identifier(); } } + break; + case QuintParser.T__2: + break; + default: + break; } - } break; - case QuintParser.T__10: + case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 411; - this.match(QuintParser.T__10); + this.state = 446; + this.match(QuintParser.T__12); { - this.state = 412; + this.state = 447; _localctx._rowVar = this.identifier(); } } @@ -1668,11 +1816,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, 42, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 415; + this.state = 450; this.simpleId("record"); } } @@ -1703,23 +1851,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 = 44; + this.enterRecursionRule(_localctx, 44, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 567; + this.state = 602; 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 = 418; + this.state = 453; this.lambda(); } break; @@ -1729,21 +1877,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 419; + this.state = 454; this.normalCallName(); - this.state = 420; + this.state = 455; this.match(QuintParser.LPAREN); - this.state = 422; + this.state = 457; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 421; + this.state = 456; this.argList(); } } - this.state = 424; + this.state = 459; this.match(QuintParser.RPAREN); } break; @@ -1753,9 +1901,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 426; + this.state = 461; this.match(QuintParser.MINUS); - this.state = 427; + this.state = 462; this.expr(25); } break; @@ -1765,13 +1913,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 428; + this.state = 463; this.qualId(); - this.state = 429; + this.state = 464; this.match(QuintParser.T__31); - this.state = 430; + this.state = 465; this.match(QuintParser.ASGN); - this.state = 431; + this.state = 466; this.expr(21); } break; @@ -1781,41 +1929,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 433; + this.state = 468; this.match(QuintParser.AND); - this.state = 434; + this.state = 469; this.match(QuintParser.T__1); - this.state = 435; + this.state = 470; this.expr(0); - this.state = 440; + this.state = 475; 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 = 436; + this.state = 471; this.match(QuintParser.T__7); - this.state = 437; + this.state = 472; this.expr(0); } } } - this.state = 442; + this.state = 477; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); } - this.state = 444; + this.state = 479; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 443; + this.state = 478; this.match(QuintParser.T__7); } } - this.state = 446; + this.state = 481; this.match(QuintParser.T__2); } break; @@ -1825,41 +1973,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 448; + this.state = 483; this.match(QuintParser.OR); - this.state = 449; + this.state = 484; this.match(QuintParser.T__1); - this.state = 450; + this.state = 485; this.expr(0); - this.state = 455; + this.state = 490; 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 = 451; + this.state = 486; this.match(QuintParser.T__7); - this.state = 452; + this.state = 487; this.expr(0); } } } - this.state = 457; + this.state = 492; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); } - this.state = 459; + this.state = 494; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 458; + this.state = 493; this.match(QuintParser.T__7); } } - this.state = 461; + this.state = 496; this.match(QuintParser.T__2); } break; @@ -1869,7 +2017,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 498; this.matchSumExpr(); } break; @@ -1879,41 +2027,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 464; + this.state = 499; this.match(QuintParser.T__32); - this.state = 465; + this.state = 500; this.match(QuintParser.T__1); - this.state = 466; + this.state = 501; this.expr(0); - this.state = 471; + this.state = 506; 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 = 467; + this.state = 502; this.match(QuintParser.T__7); - this.state = 468; + this.state = 503; this.expr(0); } } } - this.state = 473; + this.state = 508; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); } - this.state = 475; + this.state = 510; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 474; + this.state = 509; this.match(QuintParser.T__7); } } - this.state = 477; + this.state = 512; this.match(QuintParser.T__2); } break; @@ -1923,41 +2071,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 479; + this.state = 514; this.match(QuintParser.T__33); - this.state = 480; + this.state = 515; this.match(QuintParser.T__1); - this.state = 481; + this.state = 516; this.expr(0); - this.state = 486; + this.state = 521; 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 = 482; + this.state = 517; this.match(QuintParser.T__7); - this.state = 483; + this.state = 518; this.expr(0); } } } - this.state = 488; + this.state = 523; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 490; + this.state = 525; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 489; + this.state = 524; this.match(QuintParser.T__7); } } - this.state = 492; + this.state = 527; this.match(QuintParser.T__2); } break; @@ -1967,31 +2115,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 498; + this.state = 533; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 494; + this.state = 529; this.qualId(); } break; case QuintParser.INT: { - this.state = 495; + this.state = 530; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 496; + this.state = 531; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 497; + this.state = 532; this.match(QuintParser.STRING); } break; @@ -2006,43 +2154,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 500; + this.state = 535; this.match(QuintParser.LPAREN); - this.state = 501; + this.state = 536; this.expr(0); - this.state = 502; + this.state = 537; this.match(QuintParser.T__7); - this.state = 503; + this.state = 538; this.expr(0); - this.state = 508; + this.state = 543; 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 = 504; + this.state = 539; this.match(QuintParser.T__7); - this.state = 505; + this.state = 540; this.expr(0); } } } - this.state = 510; + this.state = 545; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 512; + this.state = 547; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 511; + this.state = 546; this.match(QuintParser.T__7); } } - this.state = 514; + this.state = 549; this.match(QuintParser.RPAREN); } break; @@ -2052,39 +2200,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 516; + this.state = 551; this.match(QuintParser.T__1); - this.state = 517; + this.state = 552; this.recElem(); - this.state = 522; + this.state = 557; 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 = 518; + this.state = 553; this.match(QuintParser.T__7); - this.state = 519; + this.state = 554; this.recElem(); } } } - this.state = 524; + this.state = 559; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); } - this.state = 526; + this.state = 561; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 525; + this.state = 560; this.match(QuintParser.T__7); } } - this.state = 528; + this.state = 563; this.match(QuintParser.T__2); } break; @@ -2094,48 +2242,48 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 530; - this.match(QuintParser.T__25); - this.state = 539; + this.state = 565; + this.match(QuintParser.T__10); + this.state = 574; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 531; + this.state = 566; this.expr(0); - this.state = 536; + this.state = 571; 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 = 532; + this.state = 567; this.match(QuintParser.T__7); - this.state = 533; + this.state = 568; this.expr(0); } } } - this.state = 538; + this.state = 573; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); } } } - this.state = 542; + this.state = 577; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 541; + this.state = 576; this.match(QuintParser.T__7); } } - this.state = 544; - this.match(QuintParser.T__26); + this.state = 579; + this.match(QuintParser.T__11); } break; @@ -2144,19 +2292,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 545; + this.state = 580; this.match(QuintParser.T__34); - this.state = 546; + this.state = 581; this.match(QuintParser.LPAREN); - this.state = 547; + this.state = 582; this.expr(0); - this.state = 548; + this.state = 583; this.match(QuintParser.RPAREN); - this.state = 549; + this.state = 584; this.expr(0); - this.state = 550; + this.state = 585; this.match(QuintParser.T__35); - this.state = 551; + this.state = 586; this.expr(5); } break; @@ -2166,9 +2314,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; + this.state = 588; this.operDef(); - this.state = 554; + this.state = 589; this.expr(4); } break; @@ -2178,9 +2326,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 591; this.nondetOperDef(); - this.state = 557; + this.state = 592; this.expr(3); } break; @@ -2190,11 +2338,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 594; this.match(QuintParser.LPAREN); - this.state = 560; + this.state = 595; this.expr(0); - this.state = 561; + this.state = 596; this.match(QuintParser.RPAREN); } break; @@ -2204,19 +2352,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 563; + this.state = 598; this.match(QuintParser.T__1); - this.state = 564; + this.state = 599; this.expr(0); - this.state = 565; + this.state = 600; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 618; + this.state = 653; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2224,20 +2372,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 616; + this.state = 651; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 604; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 570; + this.state = 605; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 571; + this.state = 606; this.expr(26); } break; @@ -2246,14 +2394,14 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 607; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 573; + this.state = 608; (_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))) { + if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { (_localctx as MultDivContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2263,7 +2411,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 609; this.expr(25); } break; @@ -2272,11 +2420,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 610; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 576; + this.state = 611; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2289,7 +2437,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 612; this.expr(24); } break; @@ -2298,14 +2446,14 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 613; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 579; + this.state = 614; (_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))) { + if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { (_localctx as RelationsContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2315,7 +2463,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 580; + this.state = 615; this.expr(23); } break; @@ -2324,13 +2472,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 581; + this.state = 616; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 582; + this.state = 617; this.match(QuintParser.ASGN); - this.state = 583; + this.state = 618; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2343,13 +2491,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 621; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 587; + this.state = 622; this.match(QuintParser.AND); - this.state = 588; + this.state = 623; this.expr(19); } break; @@ -2358,13 +2506,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 624; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 590; + this.state = 625; this.match(QuintParser.OR); - this.state = 591; + this.state = 626; this.expr(17); } break; @@ -2373,13 +2521,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 627; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 593; + this.state = 628; this.match(QuintParser.IFF); - this.state = 594; + this.state = 629; this.expr(16); } break; @@ -2388,13 +2536,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 630; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 596; + this.state = 631; this.match(QuintParser.IMPLIES); - this.state = 597; + this.state = 632; this.expr(15); } break; @@ -2403,13 +2551,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 633; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 599; - this.match(QuintParser.T__23); - this.state = 600; + this.state = 634; + this.match(QuintParser.T__25); + this.state = 635; this.expr(9); } break; @@ -2418,32 +2566,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 601; + this.state = 636; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 602; - this.match(QuintParser.T__19); - this.state = 603; + this.state = 637; + this.match(QuintParser.T__21); + this.state = 638; this.nameAfterDot(); - this.state = 609; + this.state = 644; 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 = 604; + this.state = 639; this.match(QuintParser.LPAREN); - this.state = 606; + this.state = 641; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (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__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 605; + this.state = 640; this.argList(); } } - this.state = 608; + this.state = 643; this.match(QuintParser.RPAREN); } break; @@ -2455,24 +2603,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 611; + this.state = 646; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 612; - this.match(QuintParser.T__25); - this.state = 613; + this.state = 647; + this.match(QuintParser.T__10); + this.state = 648; this.expr(0); - this.state = 614; - this.match(QuintParser.T__26); + this.state = 649; + this.match(QuintParser.T__11); } break; } } } - this.state = 620; + this.state = 655; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); } } } @@ -2493,48 +2641,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 621; + this.state = 656; this.match(QuintParser.MATCH); - this.state = 622; + this.state = 657; this.expr(0); - this.state = 623; + this.state = 658; this.match(QuintParser.T__1); - this.state = 625; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__10) { + if (_la === QuintParser.T__12) { { - this.state = 624; - this.match(QuintParser.T__10); + this.state = 659; + this.match(QuintParser.T__12); } } - this.state = 627; + this.state = 662; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 632; + this.state = 667; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__12) { { { - this.state = 628; - this.match(QuintParser.T__10); - this.state = 629; + this.state = 663; + this.match(QuintParser.T__12); + this.state = 664; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 634; + this.state = 669; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 635; + this.state = 670; this.match(QuintParser.T__2); } } @@ -2555,32 +2703,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 639; + this.state = 674; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 637; + this.state = 672; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 638; + this.state = 673; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 641; - this.match(QuintParser.T__24); - this.state = 642; + this.state = 676; + this.match(QuintParser.T__26); + this.state = 677; this.expr(0); } } @@ -2601,42 +2749,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 50, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 644; + this.state = 679; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 651; + this.state = 686; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 645; + this.state = 680; this.match(QuintParser.LPAREN); - this.state = 648; + this.state = 683; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 646; + this.state = 681; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 647; + this.state = 682; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 650; + this.state = 685; this.match(QuintParser.RPAREN); } } @@ -2660,17 +2808,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 662; + this.state = 697; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 72, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 653; + this.state = 688; this.declaration(); - this.state = 654; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2678,9 +2826,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 656; + this.state = 691; this.expr(0); - this.state = 657; + this.state = 692; this.match(QuintParser.EOF); } break; @@ -2688,9 +2836,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 659; + this.state = 694; this.match(QuintParser.DOCCOMMENT); - this.state = 660; + this.state = 695; this.match(QuintParser.EOF); } break; @@ -2698,7 +2846,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 661; + this.state = 696; this.match(QuintParser.EOF); } break; @@ -2721,15 +2869,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_lambda); + this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 666; + this.state = 701; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 699; this.lambdaUnsugared(); } break; @@ -2737,7 +2885,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 665; + this.state = 700; this.lambdaTupleSugar(); } break; @@ -2760,10 +2908,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 685; + this.state = 720; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2771,42 +2919,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 668; + this.state = 703; this.parameter(); - this.state = 669; - this.match(QuintParser.T__24); - this.state = 670; + this.state = 704; + this.match(QuintParser.T__26); + this.state = 705; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 672; + this.state = 707; this.match(QuintParser.LPAREN); - this.state = 673; + this.state = 708; this.parameter(); - this.state = 678; + this.state = 713; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 674; + this.state = 709; this.match(QuintParser.T__7); - this.state = 675; + this.state = 710; this.parameter(); } } - this.state = 680; + this.state = 715; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 681; + this.state = 716; this.match(QuintParser.RPAREN); - this.state = 682; - this.match(QuintParser.T__24); - this.state = 683; + this.state = 717; + this.match(QuintParser.T__26); + this.state = 718; this.expr(0); } break; @@ -2831,40 +2979,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 58, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 687; + this.state = 722; this.match(QuintParser.LPAREN); - this.state = 688; + this.state = 723; this.match(QuintParser.LPAREN); - this.state = 689; + this.state = 724; this.parameter(); - this.state = 692; + this.state = 727; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 690; + this.state = 725; this.match(QuintParser.T__7); - this.state = 691; + this.state = 726; this.parameter(); } } - this.state = 694; + this.state = 729; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 696; + this.state = 731; this.match(QuintParser.RPAREN); - this.state = 697; + this.state = 732; this.match(QuintParser.RPAREN); - this.state = 698; - this.match(QuintParser.T__24); - this.state = 699; + this.state = 733; + this.match(QuintParser.T__26); + this.state = 734; this.expr(0); } } @@ -2885,15 +3033,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 703; + this.state = 738; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 701; + this.state = 736; this.match(QuintParser.T__36); } break; @@ -2901,7 +3049,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 702; + this.state = 737; this.qualId(); } break; @@ -2926,11 +3074,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_parameter); + this.enterRule(_localctx, 62, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 740; this.identOrHole(); } } @@ -2951,15 +3099,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 709; + this.state = 744; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 742; this.match(QuintParser.MUL); } break; @@ -2967,7 +3115,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 743; this.qualId(); } break; @@ -2992,26 +3140,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 746; this.expr(0); - this.state = 716; + this.state = 751; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 712; + this.state = 747; this.match(QuintParser.T__7); - this.state = 713; + this.state = 748; this.expr(0); } } - this.state = 718; + this.state = 753; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3034,29 +3182,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 725; + this.state = 760; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 719; + this.state = 754; this.simpleId("record"); - this.state = 720; + this.state = 755; this.match(QuintParser.T__4); - this.state = 721; + this.state = 756; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 723; + this.state = 758; this.match(QuintParser.T__37); - this.state = 724; + this.state = 759; this.expr(0); } break; @@ -3081,17 +3229,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 729; + this.state = 764; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 727; + this.state = 762; this.qualId(); } break; @@ -3099,15 +3247,15 @@ export class QuintParser extends Parser { case QuintParser.OR: case QuintParser.IFF: case QuintParser.IMPLIES: + case QuintParser.MAP: case QuintParser.SET: case QuintParser.LIST: - case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 728; + this.state = 763; _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))) { + 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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { _localctx._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -3140,17 +3288,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 733; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 731; + this.state = 766; this.qualId(); } break; @@ -3160,7 +3308,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 732; + this.state = 767; _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))) { @@ -3196,12 +3344,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 735; + this.state = 770; _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); @@ -3232,12 +3380,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 737; + this.state = 772; _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); @@ -3268,30 +3416,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 739; + this.state = 774; this.identifier(); - this.state = 744; + this.state = 779; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 740; + this.state = 775; this.match(QuintParser.T__38); - this.state = 741; + this.state = 776; this.identifier(); } } } - this.state = 746; + this.state = 781; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); } } } @@ -3312,15 +3460,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, 74, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 751; + this.state = 786; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 84, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 747; + this.state = 782; this.identifier(); } break; @@ -3328,7 +3476,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 748; + this.state = 783; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3359,12 +3507,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_identifier); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 753; + this.state = 788; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3395,10 +3543,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 16: + case 18: return this.type_sempred(_localctx as TypeContext, predIndex); - case 19: + case 22: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3406,49 +3554,52 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 13); + return this.precpred(this._ctx, 14); case 1: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 13); + + case 2: + return this.precpred(this._ctx, 1); } return true; } private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { - case 2: + case 3: return this.precpred(this._ctx, 26); - case 3: + case 4: return this.precpred(this._ctx, 24); - case 4: + case 5: return this.precpred(this._ctx, 23); - case 5: + case 6: return this.precpred(this._ctx, 22); - case 6: + case 7: return this.precpred(this._ctx, 20); - case 7: + case 8: return this.precpred(this._ctx, 18); - case 8: + case 9: return this.precpred(this._ctx, 16); - case 9: + case 10: return this.precpred(this._ctx, 15); - case 10: + case 11: return this.precpred(this._ctx, 14); - case 11: + case 12: return this.precpred(this._ctx, 8); - case 12: + case 13: return this.precpred(this._ctx, 30); - case 13: + case 14: return this.precpred(this._ctx, 27); } return true; @@ -3456,405 +3607,423 @@ 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\x03H\u02F6\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0319\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\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x03\x02\x06\x02R\n\x02\r" + - "\x02\x0E\x02S\x03\x02\x03\x02\x03\x03\x07\x03Y\n\x03\f\x03\x0E\x03\\\v" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03b\n\x03\f\x03\x0E\x03e\v\x03" + - "\x03\x03\x03\x03\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\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\x85\n\x05\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x07\x06\x8D\n\x06\f\x06\x0E\x06\x90\v\x06\x05\x06\x92" + - "\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x97\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" + - "\xA4\n\x06\f\x06\x0E\x06\xA7\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05" + - "\x06\xAD\n\x06\x03\x06\x03\x06\x05\x06\xB1\n\x06\x03\x06\x05\x06\xB4\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\xC1\n\x07\x03\x07\x03\x07\x03\x07\x07\x07" + - "\xC6\n\x07\f\x07\x0E\x07\xC9\v\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b" + - "\x03\b\x03\b\x05\b\xD2\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD8\n\t\x03\t" + - "\x03\t\x03\t\x05\t\xDD\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + - "\n\x03\n\x05\n\xE8\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF0\n" + - "\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x05\v\xFA\n\v\x05" + - "\v\xFC\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f" + - "\u0107\n\f\x05\f\u0109\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\u0116\n\r\f\r\x0E\r\u0119\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0120\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\u012D\n\r\f\r\x0E\r\u0130\v\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x05\r\u0137\n\r\x05\r\u0139\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\u0148\n\x12\f\x12\x0E\x12\u014B\v\x12\x05\x12\u014D" + - "\n\x12\x03\x12\x05\x12\u0150\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\u0165\n\x12\f\x12" + - "\x0E\x12\u0168\v\x12\x03\x12\x05\x12\u016B\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\x05\x12\u017C\n\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187\v\x12\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u018E\n\x13\f\x13\x0E\x13" + - "\u0191\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + - "\x13\u019A\n\x13\x05\x13\u019C\n\x13\x03\x13\x03\x13\x05\x13\u01A0\n\x13" + - "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A9" + - "\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\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\x03\x15\x07\x15\u01D8\n\x15\f\x15\x0E\x15\u01DB" + - "\v\x15\x03\x15\x05\x15\u01DE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01E7\n\x15\f\x15\x0E\x15\u01EA\v\x15\x03" + - "\x15\x05\x15\u01ED\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x05\x15\u01F5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07" + - "\x15\u01FD\n\x15\f\x15\x0E\x15\u0200\v\x15\x03\x15\x05\x15\u0203\n\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u020B\n\x15\f" + - "\x15\x0E\x15\u020E\v\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0219\n\x15\f\x15\x0E\x15\u021C\v" + - "\x15\x05\x15\u021E\n\x15\x03\x15\x05\x15\u0221\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\u023A\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\u0261\n\x15\x03" + - "\x15\x05\x15\u0264\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15" + - "\u026B\n\x15\f\x15\x0E\x15\u026E\v\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x05\x16\u0274\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0279\n\x16\f\x16" + - "\x0E\x16\u027C\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u0282\n\x17" + - "\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028B" + - "\n\x18\x03\x18\x05\x18\u028E\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0299\n\x19\x03\x1A\x03\x1A" + - "\x05\x1A\u029D\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x07\x1B\u02A7\n\x1B\f\x1B\x0E\x1B\u02AA\v\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x03\x1B\x05\x1B\u02B0\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x06\x1C\u02B7\n\x1C\r\x1C\x0E\x1C\u02B8\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x05\x1D\u02C2\n\x1D\x03\x1E\x03\x1E\x03" + - "\x1F\x03\x1F\x05\x1F\u02C8\n\x1F\x03 \x03 \x03 \x07 \u02CD\n \f \x0E " + - "\u02D0\v \x03!\x03!\x03!\x03!\x03!\x03!\x05!\u02D8\n!\x03\"\x03\"\x05" + - "\"\u02DC\n\"\x03#\x03#\x05#\u02E0\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03" + - "&\x07&\u02E9\n&\f&\x0E&\u02EC\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02F2\n" + - "\'\x03(\x03(\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\x02" + - "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02\x02\n\x03" + - "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + - ",\x03\x02CD\x02\u0356\x02Q\x03\x02\x02\x02\x04Z\x03\x02\x02\x02\x06k\x03" + - "\x02\x02\x02\b\x84\x03\x02\x02\x02\n\x86\x03\x02\x02\x02\f\xCA\x03\x02" + - "\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xD3\x03\x02\x02\x02\x12\xE7\x03\x02" + - "\x02\x02\x14\xFB\x03\x02\x02\x02\x16\u0108\x03\x02\x02\x02\x18\u0138\x03" + - "\x02\x02\x02\x1A\u013A\x03\x02\x02\x02\x1C\u013C\x03\x02\x02\x02\x1E\u013E" + - "\x03\x02\x02\x02 \u0140\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u019F" + - "\x03\x02\x02\x02&\u01A1\x03\x02\x02\x02(\u0239\x03\x02\x02\x02*\u026F" + - "\x03\x02\x02\x02,\u0281\x03\x02\x02\x02.\u0286\x03\x02\x02\x020\u0298" + - "\x03\x02\x02\x022\u029C\x03\x02\x02\x024\u02AF\x03\x02\x02\x026\u02B1" + - "\x03\x02\x02\x028\u02C1\x03\x02\x02\x02:\u02C3\x03\x02\x02\x02<\u02C7" + - "\x03\x02\x02\x02>\u02C9\x03\x02\x02\x02@\u02D7\x03\x02\x02\x02B\u02DB" + - "\x03\x02\x02\x02D\u02DF\x03\x02\x02\x02F\u02E1\x03\x02\x02\x02H\u02E3" + - "\x03\x02\x02\x02J\u02E5\x03\x02\x02\x02L\u02F1\x03\x02\x02\x02N\u02F3" + - "\x03\x02\x02\x02PR\x05\x04\x03\x02QP\x03\x02\x02\x02RS\x03\x02\x02\x02" + - "SQ\x03\x02\x02\x02ST\x03\x02\x02\x02TU\x03\x02\x02\x02UV\x07\x02\x02\x03" + - "V\x03\x03\x02\x02\x02WY\x07E\x02\x02XW\x03\x02\x02\x02Y\\\x03\x02\x02" + - "\x02ZX\x03\x02\x02\x02Z[\x03\x02\x02\x02[]\x03\x02\x02\x02\\Z\x03\x02" + - "\x02\x02]^\x07\x03\x02\x02^_\x05J&\x02_c\x07\x04\x02\x02`b\x05\x06\x04" + - "\x02a`\x03\x02\x02\x02be\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + - "\x02df\x03\x02\x02\x02ec\x03\x02\x02\x02fg\x07\x05\x02\x02g\x05\x03\x02" + - "\x02\x02hj\x07E\x02\x02ih\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02" + - "\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03\x02\x02\x02no\x05\b" + - "\x05\x02o\x07\x03\x02\x02\x02pq\x07\x06\x02\x02qr\x05J&\x02rs\x07\x07" + - "\x02\x02st\x05\"\x12\x02t\x85\x03\x02\x02\x02uv\x07\b\x02\x02vw\x05J&" + - "\x02wx\x07\x07\x02\x02xy\x05\"\x12\x02y\x85\x03\x02\x02\x02z{\x07\t\x02" + - "\x02{|\x058\x1D\x02|}\x07@\x02\x02}~\x05(\x15\x02~\x85\x03\x02\x02\x02" + - "\x7F\x85\x05\x18\r\x02\x80\x85\x05\n\x06\x02\x81\x85\x05\f\x07\x02\x82" + - "\x85\x05\x14\v\x02\x83\x85\x05\x16\f\x02\x84p\x03\x02\x02\x02\x84u\x03" + - "\x02\x02\x02\x84z\x03\x02\x02\x02\x84\x7F\x03\x02\x02\x02\x84\x80\x03" + - "\x02\x02\x02\x84\x81\x03\x02\x02\x02\x84\x82\x03\x02\x02\x02\x84\x83\x03" + - "\x02\x02\x02\x85\t\x03\x02\x02\x02\x86\x87\x05\x12\n\x02\x87\xAC\x05B" + - "\"\x02\x88\x91\x07A\x02\x02\x89\x8E\x05:\x1E\x02\x8A\x8B\x07\n\x02\x02" + - "\x8B\x8D\x05:\x1E\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02" + - "\x8E\x8C\x03\x02\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x92\x03\x02\x02\x02" + - "\x90\x8E\x03\x02\x02\x02\x91\x89\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02" + - "\x92\x93\x03\x02\x02\x02\x93\x96\x07B\x02\x02\x94\x95\x07\x07\x02\x02" + - "\x95\x97\x05\"\x12\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02" + - "\x97\xAD\x03\x02\x02\x02\x98\x99\x07\x07\x02\x02\x99\xAD\x05\"\x12\x02" + - "\x9A\x9B\x07A\x02\x02\x9B\x9C\x05:\x1E\x02\x9C\x9D\x07\x07\x02\x02\x9D" + - "\xA5\x05\"\x12\x02\x9E\x9F\x07\n\x02\x02\x9F\xA0\x05:\x1E\x02\xA0\xA1" + - "\x07\x07\x02\x02\xA1\xA2\x05\"\x12\x02\xA2\xA4\x03\x02\x02\x02\xA3\x9E" + - "\x03\x02\x02\x02\xA4\xA7\x03\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA5\xA6" + - "\x03\x02\x02\x02\xA6\xA8\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA8\xA9" + - "\x07B\x02\x02\xA9\xAA\x07\x07\x02\x02\xAA\xAB\x05\"\x12\x02\xAB\xAD\x03" + - "\x02\x02\x02\xAC\x88\x03\x02\x02\x02\xAC\x98\x03\x02\x02\x02\xAC\x9A\x03" + - "\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xB0\x03\x02\x02\x02\xAE\xAF\x07" + - "@\x02\x02\xAF\xB1\x05(\x15\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1\x03\x02" + - "\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB4\x07\v\x02\x02\xB3\xB2\x03\x02" + - "\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\v\x03\x02\x02\x02\xB5\xB6\x07\f\x02" + - "\x02\xB6\xCB\x05J&\x02\xB7\xB8\x07\f\x02\x02\xB8\xB9\x05J&\x02\xB9\xBA" + - "\x07@\x02\x02\xBA\xBB\x05\"\x12\x02\xBB\xCB\x03\x02\x02\x02\xBC\xBD\x07" + - "\f\x02\x02\xBD\xBE\x05J&\x02\xBE\xC0\x07@\x02\x02\xBF\xC1\x07\r\x02\x02" + - "\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02" + - "\xC2\xC7\x05\x0E\b\x02\xC3\xC4\x07\r\x02\x02\xC4\xC6\x05\x0E\b\x02\xC5" + - "\xC3\x03\x02\x02\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7" + - "\xC8\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA" + - "\xB5\x03\x02\x02\x02\xCA\xB7\x03\x02\x02\x02\xCA\xBC\x03\x02\x02\x02\xCB" + - "\r\x03\x02\x02\x02\xCC\xD1\x05L\'\x02\xCD\xCE\x07A\x02\x02\xCE\xCF\x05" + - "\"\x12\x02\xCF\xD0\x07B\x02\x02\xD0\xD2\x03\x02\x02\x02\xD1\xCD\x03\x02" + - "\x02\x02\xD1\xD2\x03\x02\x02\x02\xD2\x0F\x03\x02\x02\x02\xD3\xD4\x07\x0E" + - "\x02\x02\xD4\xD7\x05J&\x02\xD5\xD6\x07\x07\x02\x02\xD6\xD8\x05\"\x12\x02" + - "\xD7\xD5\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + - "\xD9\xDA\x07@\x02\x02\xDA\xDC\x05(\x15\x02\xDB\xDD\x07\v\x02\x02\xDC\xDB" + - "\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\x11\x03\x02\x02\x02\xDE\xE8" + - "\x07\x0F\x02\x02\xDF\xE8\x07\x10\x02\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE8" + - "\x07\x0F\x02\x02\xE2\xE3\x07\x11\x02\x02\xE3\xE8\x07\x10\x02\x02\xE4\xE8" + - "\x07\x12\x02\x02\xE5\xE8\x07\x13\x02\x02\xE6\xE8\x07\x14\x02\x02\xE7\xDE" + - "\x03\x02\x02\x02\xE7\xDF\x03\x02\x02\x02\xE7\xE0\x03\x02\x02\x02\xE7\xE2" + - "\x03\x02\x02\x02\xE7\xE4\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE6" + - "\x03\x02\x02\x02\xE8\x13\x03\x02\x02\x02\xE9\xEA\x07\x15\x02\x02\xEA\xEB" + - "\x05\x1C\x0F\x02\xEB\xEC\x07\x16\x02\x02\xEC\xEF\x05<\x1F\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\xFC\x03\x02\x02\x02\xF1\xF2\x07\x15\x02\x02\xF2\xF5" + - "\x05\x1C\x0F\x02\xF3\xF4\x07\x18\x02\x02\xF4\xF6\x05\x1C\x0F\x02\xF5\xF3" + - "\x03\x02\x02\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF9\x03\x02\x02\x02\xF7\xF8" + - "\x07\x17\x02\x02\xF8\xFA\x05 \x11\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA" + - "\x03\x02\x02\x02\xFA\xFC\x03\x02\x02\x02\xFB\xE9\x03\x02\x02\x02\xFB\xF1" + - "\x03\x02\x02\x02\xFC\x15\x03\x02\x02\x02\xFD\xFE\x07\x19\x02\x02\xFE\xFF" + - "\x05\x1C\x0F\x02\xFF\u0100\x07\x16\x02\x02\u0100\u0101\x05<\x1F\x02\u0101" + - "\u0109\x03\x02\x02\x02\u0102\u0103\x07\x19\x02\x02\u0103\u0106\x05\x1C" + - "\x0F\x02\u0104\u0105\x07\x18\x02\x02\u0105\u0107\x05\x1C\x0F\x02\u0106" + - "\u0104\x03\x02\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x03\x02" + - "\x02\x02\u0108\xFD\x03\x02\x02\x02\u0108\u0102\x03\x02\x02\x02\u0109\x17" + - "\x03\x02\x02\x02\u010A\u010B\x07\x15\x02\x02\u010B\u010C\x05\x1A\x0E\x02" + - "\u010C\u010D\x07A\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + - "@\x02\x02\u010F\u0117\x05(\x15\x02\u0110\u0111\x07\n\x02\x02\u0111\u0112" + - "\x05\x1C\x0F\x02\u0112\u0113\x07@\x02\x02\u0113\u0114\x05(\x15\x02\u0114" + - "\u0116\x03\x02\x02\x02\u0115\u0110\x03\x02\x02\x02\u0116\u0119\x03\x02" + - "\x02\x02\u0117\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118" + - "\u011A\x03\x02\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u011B\x07B\x02" + - "\x02\u011B\u011C\x07\x16\x02\x02\u011C\u011F\x077\x02\x02\u011D\u011E" + - "\x07\x17\x02\x02\u011E\u0120\x05 \x11\x02\u011F\u011D\x03\x02\x02\x02" + - "\u011F\u0120\x03\x02\x02\x02\u0120\u0139\x03\x02\x02\x02\u0121\u0122\x07" + - "\x15\x02\x02\u0122\u0123\x05\x1A\x0E\x02\u0123\u0124\x07A\x02\x02\u0124" + - "\u0125\x05\x1C\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u012E\x05(\x15\x02" + - "\u0127\u0128\x07\n\x02\x02\u0128\u0129\x05\x1C\x0F\x02\u0129\u012A\x07" + - "@\x02\x02\u012A\u012B\x05(\x15\x02\u012B\u012D\x03\x02\x02\x02\u012C\u0127" + - "\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02" + - "\u012E\u012F\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130\u012E\x03" + - "\x02\x02\x02\u0131\u0132\x07B\x02\x02\u0132\u0133\x07\x18\x02\x02\u0133" + - "\u0136\x05\x1E\x10\x02\u0134\u0135\x07\x17\x02\x02\u0135\u0137\x05 \x11" + - "\x02\u0136\u0134\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137\u0139" + - "\x03\x02\x02\x02\u0138\u010A\x03\x02\x02\x02\u0138\u0121\x03\x02\x02\x02" + - "\u0139\x19\x03\x02\x02\x02\u013A\u013B\x05J&\x02\u013B\x1B\x03\x02\x02" + - "\x02\u013C\u013D\x05J&\x02\u013D\x1D\x03\x02\x02\x02\u013E\u013F\x05J" + - "&\x02\u013F\x1F\x03\x02\x02\x02\u0140\u0141\x07*\x02\x02\u0141!\x03\x02" + - "\x02\x02\u0142\u0143\b\x12\x01\x02\u0143\u014C\x07A\x02\x02\u0144\u0149" + - "\x05\"\x12\x02\u0145\u0146\x07\n\x02\x02\u0146\u0148\x05\"\x12\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02" + - "\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014D\x03\x02\x02\x02\u014B" + - "\u0149\x03\x02\x02\x02\u014C\u0144\x03\x02\x02\x02\u014C\u014D\x03\x02" + - "\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0150\x07\n\x02\x02\u014F\u014E" + - "\x03\x02\x02\x02\u014F\u0150\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02" + - "\u0151\u0152\x07B\x02\x02\u0152\u0153\x07\x1B\x02\x02\u0153\u017C\x05" + - "\"\x12\r\u0154\u0155\x071\x02\x02\u0155\u0156\x07\x1C\x02\x02\u0156\u0157" + - "\x05\"\x12\x02\u0157\u0158\x07\x1D\x02\x02\u0158\u017C\x03\x02\x02\x02" + - "\u0159\u015A\x072\x02\x02\u015A\u015B\x07\x1C\x02\x02\u015B\u015C\x05" + - "\"\x12\x02\u015C\u015D\x07\x1D\x02\x02\u015D\u017C\x03\x02\x02\x02\u015E" + - "\u015F\x07A\x02\x02\u015F\u0160\x05\"\x12\x02\u0160\u0161\x07\n\x02\x02" + - "\u0161\u0166\x05\"\x12\x02\u0162\u0163\x07\n\x02\x02\u0163\u0165\x05\"" + - "\x12\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166" + - "\u0164\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u016A\x03\x02" + - "\x02\x02\u0168\u0166\x03\x02\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169" + - "\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02" + - "\u016C\u016D\x07B\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u016F\x07" + - "\x04\x02\x02\u016F\u0170\x05$\x13\x02\u0170\u0171\x07\x05\x02\x02\u0171" + - "\u017C\x03\x02\x02\x02\u0172\u017C\x07\x1E\x02\x02\u0173\u017C\x07\x1F" + - "\x02\x02\u0174\u017C\x07 \x02\x02\u0175\u017C\x07C\x02\x02\u0176\u017C" + - "\x05J&\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"\x12\x02\u0179\u017A" + - "\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u0142\x03\x02\x02\x02" + - "\u017B\u0154\x03\x02\x02\x02\u017B\u0159\x03\x02\x02\x02\u017B\u015E\x03" + - "\x02\x02\x02\u017B\u016E\x03\x02\x02\x02\u017B\u0172\x03\x02\x02\x02\u017B" + - "\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B\u0175\x03\x02" + - "\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02\x02\x02\u017C" + - "\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F\x07\x1A\x02" + - "\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181\u0182\x07" + - "\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02\x02\u0183" + - "\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183\x03\x02" + - "\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187\u0185" + - "\x03\x02\x02\x02\u0188\u0189\x05&\x14\x02\u0189\u018A\x07\x07\x02\x02" + - "\u018A\u018B\x05\"\x12\x02\u018B\u018C\x07\n\x02\x02\u018C\u018E\x03\x02" + - "\x02\x02\u018D\u0188\x03\x02\x02\x02\u018E\u0191\x03\x02\x02\x02\u018F" + - "\u018D\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x03\x02" + - "\x02\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0193\x05&\x14\x02\u0193\u0194" + - "\x07\x07\x02\x02\u0194\u0195\x05\"\x12\x02\u0195\u0199\x03\x02\x02\x02" + - "\u0196\u019A\x07\n\x02\x02\u0197\u0198\x07\r\x02\x02\u0198\u019A\x05N" + - "(\x02\u0199\u0196\x03\x02\x02\x02\u0199\u0197\x03\x02\x02\x02\u0199\u019A" + - "\x03\x02\x02\x02\u019A\u019C\x03\x02\x02\x02\u019B\u0192\x03\x02\x02\x02" + - "\u019B\u019C\x03\x02\x02\x02\u019C\u01A0\x03\x02\x02\x02\u019D\u019E\x07" + - "\r\x02\x02\u019E\u01A0\x05N(\x02\u019F\u018F\x03\x02\x02\x02\u019F\u019D" + - "\x03\x02\x02\x02\u01A0%\x03\x02\x02\x02\u01A1\u01A2\x05L\'\x02\u01A2\'" + - "\x03\x02\x02\x02\u01A3\u01A4\b\x15\x01\x02\u01A4\u023A\x052\x1A\x02\u01A5" + - "\u01A6\x05B\"\x02\u01A6\u01A8\x07A\x02\x02\u01A7\u01A9\x05> \x02\u01A8" + - "\u01A7\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01AA\x03\x02" + - "\x02\x02\u01AA\u01AB\x07B\x02\x02\u01AB\u023A\x03\x02\x02\x02\u01AC\u01AD" + - "\x076\x02\x02\u01AD\u023A\x05(\x15\x1B\u01AE\u01AF\x05J&\x02\u01AF\u01B0" + - "\x07\"\x02\x02\u01B0\u01B1\x07@\x02\x02\u01B1\u01B2\x05(\x15\x17\u01B2" + - "\u023A\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\u023A\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\u023A" + - "\x03\x02\x02\x02\u01D1\u023A\x05*\x16\x02\u01D2\u01D3\x07#\x02\x02\u01D3" + - "\u01D4\x07\x04\x02\x02\u01D4\u01D9\x05(\x15\x02\u01D5\u01D6\x07\n\x02" + - "\x02\u01D6\u01D8\x05(\x15\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8\u01DB" + - "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02" + - "\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x07" + - "\n\x02\x02\u01DD\u01DC\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE" + - "\u01DF\x03\x02\x02\x02\u01DF\u01E0\x07\x05\x02\x02\u01E0\u023A\x03\x02" + - "\x02\x02\u01E1\u01E2\x07$\x02\x02\u01E2\u01E3\x07\x04\x02\x02\u01E3\u01E8" + - "\x05(\x15\x02\u01E4\u01E5\x07\n\x02\x02\u01E5\u01E7\x05(\x15\x02\u01E6" + - "\u01E4\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + - "\x02\x02\u01E8\u01E9\x03\x02\x02\x02\u01E9\u01EC\x03\x02\x02\x02\u01EA" + - "\u01E8\x03\x02\x02\x02\u01EB\u01ED\x07\n\x02\x02\u01EC\u01EB\x03\x02\x02" + - "\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + - "\x07\x05\x02\x02\u01EF\u023A\x03\x02\x02\x02\u01F0\u01F5\x05J&\x02\u01F1" + - "\u01F5\x07,\x02\x02\u01F2\u01F5\x07+\x02\x02\u01F3\u01F5\x07*\x02\x02" + - "\u01F4\u01F0\x03\x02\x02\x02\u01F4\u01F1\x03\x02\x02\x02\u01F4\u01F2\x03" + - "\x02\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F5\u023A\x03\x02\x02\x02\u01F6" + - "\u01F7\x07A\x02\x02\u01F7\u01F8\x05(\x15\x02"; + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\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\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\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\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x03\x06" + + "\x03\x06\x03\x06\x03\x06\x05\x06\xB3\n\x06\x03\x06\x03\x06\x05\x06\xB7" + + "\n\x06\x03\x06\x05\x06\xBA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xC8\n" + + "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xCF\n\b\f\b\x0E\b\xD2\v\b\x03" + + "\b\x03\b\x05\b\xD6\n\b\x03\t\x05\t\xD9\n\t\x03\t\x03\t\x03\t\x07\t\xDE" + + "\n\t\f\t\x0E\t\xE1\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE8\n\n\x03" + + "\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03\r" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0106\n\r\x03\r\x03\r\x03\r\x03\r" + + "\x05\r\u010C\n\r\x03\r\x03\r\x05\r\u0110\n\r\x05\r\u0112\n\r\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u011D" + + "\n\x0E\x05\x0E\u011F\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u012C\n\x0F\f\x0F" + + "\x0E\x0F\u012F\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0136" + + "\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0143\n\x0F\f\x0F\x0E\x0F\u0146\v\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u014D\n\x0F\x05\x0F\u014F" + + "\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03\x13" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u015E\n\x14\f\x14\x0E" + + "\x14\u0161\v\x14\x05\x14\u0163\n\x14\x03\x14\x05\x14\u0166\n\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u017B\n\x14\f\x14\x0E\x14\u017E\v\x14\x03\x14\x05\x14\u0181\n" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14" + + "\u0193\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A0\n\x14\f\x14\x0E\x14\u01A3\v" + + "\x14\x03\x14\x03\x14\x07\x14\u01A7\n\x14\f\x14\x0E\x14\u01AA\v\x14\x03" + + "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x07\x16\u01B7\n\x16\f\x16\x0E\x16\u01BA\v\x16\x03\x16\x03" + + "\x16\x03\x16\x05\x16\u01BF\n\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03" + + "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01CC\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01DC\n\x18\f\x18\x0E" + + "\x18\u01DF\v\x18\x03\x18\x05\x18\u01E2\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EB\n\x18\f\x18\x0E\x18\u01EE\v" + + "\x18\x03\x18\x05\x18\u01F1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x07\x18\u01FB\n\x18\f\x18\x0E\x18\u01FE\v\x18" + + "\x03\x18\x05\x18\u0201\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u020A\n\x18\f\x18\x0E\x18\u020D\v\x18\x03\x18\x05" + + "\x18\u0210\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0220" + + "\n\x18\f\x18\x0E\x18\u0223\v\x18\x03\x18\x05\x18\u0226\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u022E\n\x18\f\x18\x0E\x18" + + "\u0231\v\x18\x03\x18\x05\x18\u0234\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u023C\n\x18\f\x18\x0E\x18\u023F\v\x18\x05\x18" + + "\u0241\n\x18\x03\x18\x05\x18\u0244\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x05\x18\u025D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0284\n\x18\x03\x18\x05\x18" + + "\u0287\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u028E\n\x18" + + "\f\x18\x0E\x18\u0291\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0297" + + "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u029C\n\x19\f\x19\x0E\x19\u029F" + + "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02A5\n\x1A\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02AE\n\x1B\x03\x1B" + + "\x05\x1B\u02B1\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x05\x1C\u02BC\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C0" + + "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x07\x1E\u02CA\n\x1E\f\x1E\x0E\x1E\u02CD\v\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x05\x1E\u02D3\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + + "\x1F\u02DA\n\x1F\r\x1F\x0E\x1F\u02DB\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + + "\x1F\x03 \x03 \x05 \u02E5\n \x03!\x03!\x03\"\x03\"\x05\"\u02EB\n\"\x03" + + "#\x03#\x03#\x07#\u02F0\n#\f#\x0E#\u02F3\v#\x03$\x03$\x03$\x03$\x03$\x03" + + "$\x05$\u02FB\n$\x03%\x03%\x05%\u02FF\n%\x03&\x03&\x05&\u0303\n&\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u030C\n)\f)\x0E)\u030F\v)\x03*\x03" + + "*\x03*\x03*\x05*\u0315\n*\x03+\x03+\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.\x02" + + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + + "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + + "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u037A\x02W\x03\x02" + + "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + + "\n\x8C\x03\x02\x02\x02\f\xC7\x03\x02\x02\x02\x0E\xC9\x03\x02\x02\x02\x10" + + "\xD8\x03\x02\x02\x02\x12\xE2\x03\x02\x02\x02\x14\xE9\x03\x02\x02\x02\x16" + + "\xFD\x03\x02\x02\x02\x18\u0111\x03\x02\x02\x02\x1A\u011E\x03\x02\x02\x02" + + "\x1C\u014E\x03\x02\x02\x02\x1E\u0150\x03\x02\x02\x02 \u0152\x03\x02\x02" + + "\x02\"\u0154\x03\x02\x02\x02$\u0156\x03\x02\x02\x02&\u0192\x03\x02\x02" + + "\x02(\u01AB\x03\x02\x02\x02*\u01C2\x03\x02\x02\x02,\u01C4\x03\x02\x02" + + "\x02.\u025C\x03\x02\x02\x020\u0292\x03\x02\x02\x022\u02A4\x03\x02\x02" + + "\x024\u02A9\x03\x02\x02\x026\u02BB\x03\x02\x02\x028\u02BF\x03\x02\x02" + + "\x02:\u02D2\x03\x02\x02\x02<\u02D4\x03\x02\x02\x02>\u02E4\x03\x02\x02" + + "\x02@\u02E6\x03\x02\x02\x02B\u02EA\x03\x02\x02\x02D\u02EC\x03\x02\x02" + + "\x02F\u02FA\x03\x02\x02\x02H\u02FE\x03\x02\x02\x02J\u0302\x03\x02\x02" + + "\x02L\u0304\x03\x02\x02\x02N\u0306\x03\x02\x02\x02P\u0308\x03\x02\x02" + + "\x02R\u0314\x03\x02\x02\x02T\u0316\x03\x02\x02\x02VX\x05\x04\x03\x02W" + + "V\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + + "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + + "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + + "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + + "ei\x07\x04\x02\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02" + + "ig\x03\x02\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02" + + "lm\x07\x05\x02\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02" + + "ps\x03\x02\x02\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02" + + "sq\x03\x02\x02\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02" + + "\x02wx\x05P)\x02xy\x07\x07\x02\x02yz\x05&\x14\x02z\x8B\x03\x02\x02\x02" + + "{|\x07\b\x02\x02|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05&\x14\x02\x7F\x8B" + + "\x03\x02\x02\x02\x80\x81\x07\t\x02\x02\x81\x82\x05> \x02\x82\x83\x07>" + + "\x02\x02\x83\x84\x05.\x18\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1C" + + "\x0F\x02\x86\x8B\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x18\r" + + "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + + "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + + "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + + "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\xB2\x05H%\x02\x8E\x97" + + "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + + "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + + "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + + "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + + "\x99\x9C\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9D\x05&\x14\x02\x9C" + + "\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02\x02\x9D\xB3\x03\x02\x02\x02\x9E" + + "\x9F\x07\x07\x02\x02\x9F\xB3\x05&\x14\x02\xA0\xA1\x07?\x02\x02\xA1\xA2" + + "\x05@!\x02\xA2\xA3\x07\x07\x02\x02\xA3\xAB\x05&\x14\x02\xA4\xA5\x07\n" + + "\x02\x02\xA5\xA6\x05@!\x02\xA6\xA7\x07\x07\x02\x02\xA7\xA8\x05&\x14\x02" + + "\xA8\xAA\x03\x02\x02\x02\xA9\xA4\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02" + + "\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAE\x03\x02\x02\x02" + + "\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07@\x02\x02\xAF\xB0\x07\x07\x02\x02" + + "\xB0\xB1\x05&\x14\x02\xB1\xB3\x03\x02\x02\x02\xB2\x8E\x03\x02\x02\x02" + + "\xB2\x9E\x03\x02\x02\x02\xB2\xA0\x03\x02\x02\x02\xB2\xB3\x03\x02\x02\x02" + + "\xB3\xB6\x03\x02\x02\x02\xB4\xB5\x07>\x02\x02\xB5\xB7\x05.\x18\x02\xB6" + + "\xB4\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB9\x03\x02\x02\x02\xB8" + + "\xBA\x07\v\x02\x02\xB9\xB8\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA" + + "\v\x03\x02\x02\x02\xBB\xBC\x07\f\x02\x02\xBC\xC8\x05P)\x02\xBD\xBE\x07" + + "\f\x02\x02\xBE\xBF\x05\x0E\b\x02\xBF\xC0\x07>\x02\x02\xC0\xC1\x05&\x14" + + "\x02\xC1\xC8\x03\x02\x02\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + + "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05\x10\t\x02\xC6\xC8\x03\x02\x02\x02\xC7" + + "\xBB\x03\x02\x02\x02\xC7\xBD\x03\x02\x02\x02\xC7\xC2\x03\x02\x02\x02\xC8" + + "\r\x03\x02\x02\x02\xC9\xD5\x05P)\x02\xCA\xCB\x07\r\x02\x02\xCB\xD0\x05" + + "(\x15\x02\xCC\xCD\x07\n\x02\x02\xCD\xCF\x05(\x15\x02\xCE\xCC\x03\x02\x02" + + "\x02\xCF\xD2\x03\x02\x02\x02\xD0\xCE\x03\x02\x02\x02\xD0\xD1\x03\x02\x02" + + "\x02\xD1\xD3\x03\x02\x02\x02\xD2\xD0\x03\x02\x02\x02\xD3\xD4\x07\x0E\x02" + + "\x02\xD4\xD6\x03\x02\x02\x02\xD5\xCA\x03\x02\x02\x02\xD5\xD6\x03\x02\x02" + + "\x02\xD6\x0F\x03\x02\x02\x02\xD7\xD9\x07\x0F\x02\x02\xD8\xD7\x03\x02\x02" + + "\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\xDF\x05\x12\n" + + "\x02\xDB\xDC\x07\x0F\x02\x02\xDC\xDE\x05\x12\n\x02\xDD\xDB\x03\x02\x02" + + "\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02\x02" + + "\x02\xE0\x11\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE7\x05R*\x02" + + "\xE3\xE4\x07?\x02\x02\xE4\xE5\x05&\x14\x02\xE5\xE6\x07@\x02\x02\xE6\xE8" + + "\x03\x02\x02\x02\xE7\xE3\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\x13" + + "\x03\x02\x02\x02\xE9\xEA\x07\x10\x02\x02\xEA\xED\x05P)\x02\xEB\xEC\x07" + + "\x07\x02\x02\xEC\xEE\x05&\x14\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03" + + "\x02\x02\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\x07>\x02\x02\xF0\xF2\x05" + + ".\x18\x02\xF1\xF3\x07\v\x02\x02\xF2\xF1\x03\x02\x02\x02\xF2\xF3\x03\x02" + + "\x02\x02\xF3\x15\x03\x02\x02\x02\xF4\xFE\x07\x11\x02\x02\xF5\xFE\x07\x12" + + "\x02\x02\xF6\xF7\x07\x13\x02\x02\xF7\xFE\x07\x11\x02\x02\xF8\xF9\x07\x13" + + "\x02\x02\xF9\xFE\x07\x12\x02\x02\xFA\xFE\x07\x14\x02\x02\xFB\xFE\x07\x15" + + "\x02\x02\xFC\xFE\x07\x16\x02\x02\xFD\xF4\x03\x02\x02\x02\xFD\xF5\x03\x02" + + "\x02\x02\xFD\xF6\x03\x02\x02\x02\xFD\xF8\x03\x02\x02\x02\xFD\xFA\x03\x02" + + "\x02\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFC\x03\x02\x02\x02\xFE\x17\x03\x02" + + "\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0101\x05 \x11\x02\u0101\u0102" + + "\x07\x18\x02\x02\u0102\u0105\x05B\"\x02\u0103\u0104\x07\x19\x02\x02\u0104" + + "\u0106\x05$\x13\x02\u0105\u0103\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" + + "\x02\u0106\u0112\x03\x02\x02\x02\u0107\u0108\x07\x17\x02\x02\u0108\u010B" + + "\x05 \x11\x02\u0109\u010A\x07\x1A\x02\x02\u010A\u010C\x05 \x11\x02\u010B" + + "\u0109\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02" + + "\x02\x02\u010D\u010E\x07\x19\x02\x02\u010E\u0110\x05$\x13\x02\u010F\u010D" + + "\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0112\x03\x02\x02\x02" + + "\u0111\xFF\x03\x02\x02\x02\u0111\u0107\x03\x02\x02\x02\u0112\x19\x03\x02" + + "\x02\x02\u0113\u0114\x07\x1B\x02\x02\u0114\u0115\x05 \x11\x02\u0115\u0116" + + "\x07\x18\x02\x02\u0116\u0117\x05B\"\x02\u0117\u011F\x03\x02\x02\x02\u0118" + + "\u0119\x07\x1B\x02\x02\u0119\u011C\x05 \x11\x02\u011A\u011B\x07\x1A\x02" + + "\x02\u011B\u011D\x05 \x11\x02\u011C\u011A\x03\x02\x02\x02\u011C\u011D" + + "\x03\x02\x02\x02\u011D\u011F\x03\x02\x02\x02\u011E\u0113\x03\x02\x02\x02" + + "\u011E\u0118\x03\x02\x02\x02\u011F\x1B\x03\x02\x02\x02\u0120\u0121\x07" + + "\x17\x02\x02\u0121\u0122\x05\x1E\x10\x02\u0122\u0123\x07?\x02\x02\u0123" + + "\u0124\x05 \x11\x02\u0124\u0125\x07>\x02\x02\u0125\u012D\x05.\x18\x02" + + "\u0126\u0127\x07\n\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02" + + "\x02\u0129\u012A\x05.\x18\x02\u012A\u012C\x03\x02\x02\x02\u012B\u0126" + + "\x03\x02\x02\x02\u012C\u012F\x03\x02\x02\x02\u012D\u012B\x03\x02\x02\x02" + + "\u012D\u012E\x03\x02\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012D\x03" + + "\x02\x02\x02\u0130\u0131\x07@\x02\x02\u0131\u0132\x07\x18\x02\x02\u0132" + + "\u0135\x075\x02\x02\u0133\u0134\x07\x19\x02\x02\u0134\u0136\x05$\x13\x02" + + "\u0135\u0133\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u014F\x03" + + "\x02\x02\x02\u0137\u0138\x07\x17\x02\x02\u0138\u0139\x05\x1E\x10\x02\u0139" + + "\u013A\x07?\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C\x07>\x02\x02" + + "\u013C\u0144\x05.\x18\x02\u013D\u013E\x07\n\x02\x02\u013E\u013F\x05 \x11" + + "\x02\u013F\u0140\x07>\x02\x02\u0140\u0141\x05.\x18\x02\u0141\u0143\x03" + + "\x02\x02\x02\u0142\u013D\x03\x02\x02\x02\u0143\u0146\x03\x02\x02\x02\u0144" + + "\u0142\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02" + + "\x02\x02\u0146\u0144\x03\x02\x02\x02\u0147\u0148\x07@\x02\x02\u0148\u0149" + + "\x07\x1A\x02\x02\u0149\u014C\x05\"\x12\x02\u014A\u014B\x07\x19\x02\x02" + + "\u014B\u014D\x05$\x13\x02\u014C\u014A\x03\x02\x02\x02\u014C\u014D\x03" + + "\x02\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0120\x03\x02\x02\x02\u014E" + + "\u0137\x03\x02\x02\x02\u014F\x1D\x03\x02\x02\x02\u0150\u0151\x05P)\x02" + + "\u0151\x1F\x03\x02\x02\x02\u0152\u0153\x05P)\x02\u0153!\x03\x02\x02\x02" + + "\u0154\u0155\x05P)\x02\u0155#\x03\x02\x02\x02\u0156\u0157\x07*\x02\x02" + + "\u0157%\x03\x02\x02\x02\u0158\u0159\b\x14\x01\x02\u0159\u0162\x07?\x02" + + "\x02\u015A\u015F\x05&\x14\x02\u015B\u015C\x07\n\x02\x02\u015C\u015E\x05" + + "&\x14\x02\u015D\u015B\x03\x02\x02\x02\u015E\u0161\x03\x02\x02\x02\u015F" + + "\u015D\x03\x02\x02\x02\u015F\u0160\x03\x02\x02\x02\u0160\u0163\x03\x02" + + "\x02\x02\u0161\u015F\x03\x02\x02\x02\u0162\u015A\x03\x02\x02\x02\u0162" + + "\u0163\x03\x02\x02\x02\u0163\u0165\x03\x02\x02\x02\u0164\u0166\x07\n\x02" + + "\x02\u0165\u0164\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + + "\x03\x02\x02\x02\u0167\u0168\x07@\x02\x02\u0168\u0169\x07\x1D\x02\x02" + + "\u0169\u0193\x05&\x14\x0E\u016A\u016B\x07A\x02\x02\u016B\u016C\x07\r\x02" + + "\x02\u016C\u016D\x05&\x14\x02\u016D\u016E\x07\x0E\x02\x02\u016E\u0193" + + "\x03\x02\x02\x02\u016F\u0170\x07B\x02\x02\u0170\u0171\x07\r\x02\x02\u0171" + + "\u0172\x05&\x14\x02\u0172\u0173\x07\x0E\x02\x02\u0173\u0193\x03\x02\x02" + + "\x02\u0174\u0175\x07?\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177\x07" + + "\n\x02\x02\u0177\u017C\x05&\x14\x02\u0178\u0179\x07\n\x02\x02\u0179\u017B" + + "\x05&\x14\x02\u017A\u0178\x03\x02\x02\x02\u017B\u017E\x03\x02\x02\x02" + + "\u017C\u017A\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u0180\x03" + + "\x02\x02\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0181\x07\n\x02\x02\u0180" + + "\u017F\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02" + + "\x02\x02\u0182\u0183\x07@\x02\x02\u0183\u0193\x03\x02\x02\x02\u0184\u0186" + + "\x07\x04\x02\x02\u0185\u0187\x05*\x16\x02\u0186\u0185\x03\x02\x02\x02" + + "\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0193\x07" + + "\x05\x02\x02\u0189\u0193\x07\x1E\x02\x02\u018A\u0193\x07\x1F\x02\x02\u018B" + + "\u0193\x07 \x02\x02\u018C\u0193\x05(\x15\x02\u018D\u0193\x05P)\x02\u018E" + + "\u018F\x07?\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191\x07@\x02\x02" + + "\u0191\u0193\x03\x02\x02\x02\u0192\u0158\x03\x02\x02\x02\u0192\u016A\x03" + + "\x02\x02\x02\u0192\u016F\x03\x02\x02\x02\u0192\u0174\x03\x02\x02\x02\u0192" + + "\u0184\x03\x02\x02\x02\u0192\u0189\x03\x02\x02\x02\u0192\u018A\x03\x02" + + "\x02\x02\u0192\u018B\x03\x02\x02\x02\u0192\u018C\x03\x02\x02\x02\u0192" + + "\u018D\x03\x02\x02\x02\u0192\u018E\x03\x02\x02\x02\u0193\u01A8\x03\x02" + + "\x02\x02\u0194\u0195\f\x10\x02\x02\u0195\u0196\x07\x1C\x02\x02\u0196\u01A7" + + "\x05&\x14\x10\u0197\u0198\f\x0F\x02\x02\u0198\u0199\x07\x1D\x02\x02\u0199" + + "\u01A7\x05&\x14\x0F\u019A\u019B\f\x03\x02\x02\u019B\u019C\x07\r\x02\x02" + + "\u019C\u01A1\x05&\x14\x02\u019D\u019E\x07\n\x02\x02\u019E\u01A0\x05&\x14" + + "\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A3\x03\x02\x02\x02\u01A1\u019F" + + "\x03\x02\x02\x02\u01A1\u01A2\x03\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02" + + "\u01A3\u01A1\x03\x02\x02\x02\u01A4\u01A5\x07\x0E\x02\x02\u01A5\u01A7\x03" + + "\x02\x02\x02\u01A6\u0194\x03\x02\x02\x02\u01A6\u0197\x03\x02\x02\x02\u01A6" + + "\u019A\x03\x02\x02\x02\u01A7\u01AA\x03\x02\x02\x02\u01A8\u01A6\x03\x02" + + "\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\'\x03\x02\x02\x02\u01AA\u01A8" + + "\x03\x02\x02\x02\u01AB\u01AC\x07C\x02\x02\u01AC)\x03\x02\x02\x02\u01AD" + + "\u01AE\x05,\x17\x02\u01AE\u01AF\x07\x07\x02\x02\u01AF\u01B0\x05&\x14\x02" + + "\u01B0\u01B8\x03\x02\x02\x02\u01B1\u01B2\x07\n\x02\x02\u01B2\u01B3\x05" + + ",\x17\x02\u01B3\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01B7" + + "\x03\x02\x02\x02\u01B6\u01B1\x03\x02\x02\x02\u01B7\u01BA\x03\x02\x02\x02" + + "\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BE\x03" + + "\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02\u01BB\u01BF\x07\n\x02\x02\u01BC" + + "\u01BD\x07\x0F\x02\x02\u01BD\u01BF\x05T+\x02\u01BE\u01BB\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05T+\x02\u01C2\u01AD" + + "\x03\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3+\x03\x02\x02\x02\u01C4" + + "\u01C5\x05R*\x02\u01C5-\x03\x02\x02\x02\u01C6\u01C7\b\x18\x01\x02\u01C7" + + "\u025D\x058\x1D\x02\u01C8\u01C9\x05H%\x02\u01C9\u01CB\x07?\x02\x02\u01CA" + + "\u01CC\x05D#\x02\u01CB\u01CA\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02" + + "\u01CC\u01CD\x03\x02\x02\x02\u01CD\u01CE\x07@\x02\x02\u01CE\u025D\x03" + + "\x02\x02\x02\u01CF\u01D0\x074\x02\x02\u01D0\u025D\x05.\x18\x1B\u01D1\u01D2" + + "\x05P)\x02\u01D2\u01D3\x07\"\x02\x02\u01D3\u01D4\x07>\x02\x02\u01D4\u01D5" + + "\x05.\x18\x17\u01D5\u025D\x03\x02\x02\x02\u01D6\u01D7\x07-\x02\x02\u01D7" + + "\u01D8\x07\x04\x02\x02\u01D8\u01DD\x05.\x18\x02\u01D9\u01DA\x07\n\x02" + + "\x02\u01DA\u01DC\x05.\x18\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DF" + + "\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02" + + "\u01DE\u01E1\x03\x02\x02\x02\u01DF\u01DD\x03\x02\x02\x02\u01E0\u01E2\x07" + + "\n\x02\x02\u01E1\u01E0\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02\u01E2" + + "\u01E3\x03\x02\x02\x02\u01E3\u01E4\x07\x05\x02\x02\u01E4\u025D\x03\x02" + + "\x02\x02\u01E5\u01E6\x07.\x02\x02\u01E6\u01E7\x07\x04\x02\x02\u01E7\u01EC" + + "\x05.\x18\x02\u01E8\u01E9\x07\n\x02\x02\u01E9\u01EB\x05.\x18\x02\u01EA" + + "\u01E8\x03\x02\x02\x02\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02" + + "\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE" + + "\u01EC\x03\x02\x02\x02\u01EF\u01F1\x07\n\x02\x02\u01F0\u01EF\x03\x02\x02" + + "\x02\u01F0"; private static readonly _serializedATNSegment1: string = - "\u01F8\u01F9\x07\n\x02\x02\u01F9\u01FE\x05(\x15\x02\u01FA\u01FB\x07\n" + - "\x02\x02\u01FB\u01FD\x05(\x15\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u0200" + - "\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FE\u01FF\x03\x02\x02\x02" + - "\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0203\x07" + - "\n\x02\x02\u0202\u0201\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + - "\u0204\x03\x02\x02\x02\u0204\u0205\x07B\x02\x02\u0205\u023A\x03\x02\x02" + - "\x02\u0206\u0207\x07\x04\x02\x02\u0207\u020C\x05@!\x02\u0208\u0209\x07" + - "\n\x02\x02\u0209\u020B\x05@!\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E" + - "\x03\x02\x02\x02\u020C\u020A\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02" + - "\u020D\u0210\x03\x02\x02\x02\u020E\u020C\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\u0213\x07\x05\x02\x02\u0213\u023A\x03\x02" + - "\x02\x02\u0214\u021D\x07\x1C\x02\x02\u0215\u021A\x05(\x15\x02\u0216\u0217" + - "\x07\n\x02\x02\u0217\u0219\x05(\x15\x02\u0218\u0216\x03\x02\x02\x02\u0219" + - "\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A\u021B\x03\x02" + - "\x02\x02\u021B\u021E\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021D" + - "\u0215\x03\x02\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E\u0220\x03\x02" + - "\x02\x02\u021F\u0221\x07\n\x02\x02\u0220\u021F\x03\x02\x02\x02\u0220\u0221" + - "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u023A\x07\x1D\x02\x02" + - "\u0223\u0224\x07%\x02\x02\u0224\u0225\x07A\x02\x02\u0225\u0226\x05(\x15" + - "\x02\u0226\u0227\x07B\x02\x02\u0227\u0228\x05(\x15\x02\u0228\u0229\x07" + - "&\x02\x02\u0229\u022A\x05(\x15\x07\u022A\u023A\x03\x02\x02\x02\u022B\u022C" + - "\x05\n\x06\x02\u022C\u022D\x05(\x15\x06\u022D\u023A\x03\x02\x02\x02\u022E" + - "\u022F\x05\x10\t\x02\u022F\u0230\x05(\x15\x05\u0230\u023A\x03\x02\x02" + - "\x02\u0231\u0232\x07A\x02\x02\u0232\u0233\x05(\x15\x02\u0233\u0234\x07" + - "B\x02\x02\u0234\u023A\x03\x02\x02\x02\u0235\u0236\x07\x04\x02\x02\u0236" + - "\u0237\x05(\x15\x02\u0237\u0238\x07\x05\x02\x02\u0238\u023A\x03\x02\x02" + - "\x02\u0239\u01A3\x03\x02\x02\x02\u0239\u01A5\x03\x02\x02\x02\u0239\u01AC" + - "\x03\x02\x02\x02\u0239\u01AE\x03\x02\x02\x02\u0239\u01B3\x03\x02\x02\x02" + - "\u0239\u01C2\x03\x02\x02\x02\u0239\u01D1\x03\x02\x02\x02\u0239\u01D2\x03" + - "\x02\x02\x02\u0239\u01E1\x03\x02\x02\x02\u0239\u01F4\x03\x02\x02\x02\u0239" + - "\u01F6\x03\x02\x02\x02\u0239\u0206\x03\x02\x02\x02\u0239\u0214\x03\x02" + - "\x02\x02\u0239\u0223\x03\x02\x02\x02\u0239\u022B\x03\x02\x02\x02\u0239" + - "\u022E\x03\x02\x02\x02\u0239\u0231\x03\x02\x02\x02\u0239\u0235\x03\x02" + - "\x02\x02\u023A\u026C\x03\x02\x02\x02\u023B\u023C\f\x1C\x02\x02\u023C\u023D" + - "\x07!\x02\x02\u023D\u026B\x05(\x15\x1C\u023E\u023F\f\x1A\x02\x02\u023F" + - "\u0240\t\x02\x02\x02\u0240\u026B\x05(\x15\x1B\u0241\u0242\f\x19\x02\x02" + - "\u0242\u0243\t\x03\x02\x02\u0243\u026B\x05(\x15\x1A\u0244\u0245\f\x18" + - "\x02\x02\u0245\u0246\t\x04\x02\x02\u0246\u026B\x05(\x15\x19\u0247\u0248" + - "\f\x16\x02\x02\u0248\u0249\x07@\x02\x02\u0249\u024A\x05(\x15\x17\u024A" + - "\u024B\b\x15\x01\x02\u024B\u026B\x03\x02\x02\x02\u024C\u024D\f\x14\x02" + - "\x02\u024D\u024E\x07-\x02\x02\u024E\u026B\x05(\x15\x15\u024F\u0250\f\x12" + - "\x02\x02\u0250\u0251\x07.\x02\x02\u0251\u026B\x05(\x15\x13\u0252\u0253" + - "\f\x11\x02\x02\u0253\u0254\x07/\x02\x02\u0254\u026B\x05(\x15\x12\u0255" + - "\u0256\f\x10\x02\x02\u0256\u0257\x070\x02\x02\u0257\u026B\x05(\x15\x11" + - "\u0258\u0259\f\n\x02\x02\u0259\u025A\x07\x1A\x02\x02\u025A\u026B\x05(" + - "\x15\v\u025B\u025C\f \x02\x02\u025C\u025D\x07\x16\x02\x02\u025D\u0263" + - "\x05D#\x02\u025E\u0260\x07A\x02\x02\u025F\u0261\x05> \x02\u0260\u025F" + - "\x03\x02\x02\x02\u0260\u0261\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02" + - "\u0262\u0264\x07B\x02\x02\u0263\u025E\x03\x02\x02\x02\u0263\u0264\x03" + - "\x02\x02\x02\u0264\u026B\x03\x02\x02\x02\u0265\u0266\f\x1D\x02\x02\u0266" + - "\u0267\x07\x1C\x02\x02\u0267\u0268\x05(\x15\x02\u0268\u0269\x07\x1D\x02" + - "\x02\u0269\u026B\x03\x02\x02\x02\u026A\u023B\x03\x02\x02\x02\u026A\u023E" + - "\x03\x02\x02\x02\u026A\u0241\x03\x02\x02\x02\u026A\u0244\x03\x02\x02\x02" + - "\u026A\u0247\x03\x02\x02\x02\u026A\u024C\x03\x02\x02\x02\u026A\u024F\x03" + - "\x02\x02\x02\u026A\u0252\x03\x02\x02\x02\u026A\u0255\x03\x02\x02\x02\u026A" + - "\u0258\x03\x02\x02\x02\u026A\u025B\x03\x02\x02\x02\u026A\u0265\x03\x02" + - "\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C\u026A\x03\x02\x02\x02\u026C" + - "\u026D\x03\x02\x02\x02\u026D)\x03\x02\x02\x02\u026E\u026C\x03\x02\x02" + - "\x02\u026F\u0270\x074\x02\x02\u0270\u0271\x05(\x15\x02\u0271\u0273\x07" + - "\x04\x02\x02\u0272\u0274\x07\r\x02\x02\u0273\u0272\x03\x02\x02\x02\u0273" + - "\u0274\x03\x02\x02\x02\u0274\u0275\x03\x02\x02\x02\u0275\u027A\x05,\x17" + - "\x02\u0276\u0277\x07\r\x02\x02\u0277\u0279\x05,\x17\x02\u0278\u0276\x03" + - "\x02\x02\x02\u0279\u027C\x03\x02\x02\x02\u027A\u0278\x03\x02\x02\x02\u027A" + - "\u027B\x03\x02\x02\x02\u027B\u027D\x03\x02\x02\x02\u027C\u027A\x03\x02" + - "\x02\x02\u027D\u027E\x07\x05\x02\x02\u027E+\x03\x02\x02\x02\u027F\u0282" + - "\x05.\x18\x02\u0280\u0282\x07\'\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281" + - "\u0280\x03\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0284\x07\x1B" + - "\x02\x02\u0284\u0285\x05(\x15\x02\u0285-\x03\x02\x02\x02\u0286\u028D\x05" + - "L\'\x02\u0287\u028A\x07A\x02\x02\u0288\u028B\x05L\'\x02\u0289\u028B\x07" + - "\'\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + - "\u028C\x03\x02\x02\x02\u028C\u028E\x07B\x02\x02\u028D\u0287\x03\x02\x02" + - "\x02\u028D\u028E\x03\x02\x02\x02\u028E/\x03\x02\x02\x02\u028F\u0290\x05" + - "\b\x05\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0299\x03\x02\x02\x02\u0292" + - "\u0293\x05(\x15\x02\u0293\u0294\x07\x02\x02\x03\u0294\u0299\x03\x02\x02" + - "\x02\u0295\u0296\x07E\x02\x02\u0296\u0299\x07\x02\x02\x03\u0297\u0299" + - "\x07\x02\x02\x03\u0298\u028F\x03\x02\x02\x02\u0298\u0292\x03\x02\x02\x02" + - "\u0298\u0295\x03\x02\x02\x02\u0298\u0297\x03\x02\x02\x02\u02991\x03\x02" + - "\x02\x02\u029A\u029D\x054\x1B\x02\u029B\u029D\x056\x1C\x02\u029C\u029A" + - "\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02\u029D3\x03\x02\x02\x02\u029E" + - "\u029F\x05:\x1E\x02\u029F\u02A0\x07\x1B\x02\x02\u02A0\u02A1\x05(\x15\x02" + - "\u02A1\u02B0\x03\x02\x02\x02\u02A2\u02A3\x07A\x02\x02\u02A3\u02A8\x05" + - ":\x1E\x02\u02A4\u02A5\x07\n\x02\x02\u02A5\u02A7\x05:\x1E\x02\u02A6\u02A4" + - "\x03\x02\x02\x02\u02A7\u02AA\x03\x02\x02\x02\u02A8\u02A6\x03\x02\x02\x02" + - "\u02A8\u02A9\x03\x02\x02\x02\u02A9\u02AB\x03\x02\x02\x02\u02AA\u02A8\x03" + - "\x02\x02\x02\u02AB\u02AC\x07B\x02\x02\u02AC\u02AD\x07\x1B\x02\x02\u02AD" + - "\u02AE\x05(\x15\x02\u02AE\u02B0\x03\x02\x02\x02\u02AF\u029E\x03\x02\x02" + - "\x02\u02AF\u02A2\x03\x02\x02\x02\u02B05\x03\x02\x02\x02\u02B1\u02B2\x07" + - "A\x02\x02\u02B2\u02B3\x07A\x02\x02\u02B3\u02B6\x05:\x1E\x02\u02B4\u02B5" + - "\x07\n\x02\x02\u02B5\u02B7\x05:\x1E\x02\u02B6\u02B4\x03\x02\x02\x02\u02B7" + - "\u02B8\x03\x02\x02\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02" + - "\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x07B\x02\x02\u02BB\u02BC" + - "\x07B\x02\x02\u02BC\u02BD\x07\x1B\x02\x02\u02BD\u02BE\x05(\x15\x02\u02BE" + - "7\x03\x02\x02\x02\u02BF\u02C2\x07\'\x02\x02\u02C0\u02C2\x05J&\x02\u02C1" + - "\u02BF\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C29\x03\x02\x02" + - "\x02\u02C3\u02C4\x058\x1D\x02\u02C4;\x03\x02\x02\x02\u02C5\u02C8\x077" + - "\x02\x02\u02C6\u02C8\x05J&\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7\u02C6" + - "\x03\x02\x02\x02\u02C8=\x03\x02\x02\x02\u02C9\u02CE\x05(\x15\x02\u02CA" + - "\u02CB\x07\n\x02\x02\u02CB\u02CD\x05(\x15\x02\u02CC\u02CA\x03\x02\x02" + - "\x02\u02CD\u02D0\x03\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CE\u02CF" + - "\x03\x02\x02\x02\u02CF?\x03\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D1" + - "\u02D2\x05L\'\x02\u02D2\u02D3\x07\x07\x02\x02\u02D3\u02D4\x05(\x15\x02" + - "\u02D4\u02D8\x03\x02\x02\x02\u02D5\u02D6\x07(\x02\x02\u02D6\u02D8\x05" + - "(\x15\x02\u02D7\u02D1\x03\x02\x02\x02\u02D7\u02D5\x03\x02\x02\x02\u02D8" + - "A\x03\x02\x02\x02\u02D9\u02DC\x05J&\x02\u02DA\u02DC\t\x05\x02\x02\u02DB" + - "\u02D9\x03\x02\x02\x02\u02DB\u02DA\x03\x02\x02\x02\u02DCC\x03\x02\x02" + - "\x02\u02DD\u02E0\x05J&\x02\u02DE\u02E0\t\x06\x02\x02\u02DF\u02DD\x03\x02" + - "\x02\x02\u02DF\u02DE\x03\x02\x02\x02\u02E0E\x03\x02\x02\x02\u02E1\u02E2" + - "\t\x07\x02\x02\u02E2G\x03\x02\x02\x02\u02E3\u02E4\t\b\x02\x02\u02E4I\x03" + - "\x02\x02\x02\u02E5\u02EA\x05N(\x02\u02E6\u02E7\x07)\x02\x02\u02E7\u02E9" + - "\x05N(\x02\u02E8\u02E6\x03\x02\x02\x02\u02E9\u02EC\x03\x02\x02\x02\u02EA" + - "\u02E8\x03\x02\x02\x02\u02EA\u02EB\x03\x02\x02\x02\u02EBK\x03\x02\x02" + - "\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED\u02F2\x05N(\x02\u02EE\u02EF\x05" + - "J&\x02\u02EF\u02F0\b\'\x01\x02\u02F0\u02F2\x03\x02\x02\x02\u02F1\u02ED" + - "\x03\x02\x02\x02\u02F1\u02EE\x03\x02\x02\x02\u02F2M\x03\x02\x02\x02\u02F3" + - "\u02F4\t\t\x02\x02\u02F4O\x03\x02\x02\x02TSZck\x84\x8E\x91\x96\xA5\xAC" + - "\xB0\xB3\xC0\xC7\xCA\xD1\xD7\xDC\xE7\xEF\xF5\xF9\xFB\u0106\u0108\u0117" + - "\u011F\u012E\u0136\u0138\u0149\u014C\u014F\u0166\u016A\u017B\u0183\u0185" + - "\u018F\u0199\u019B\u019F\u01A8\u01BA\u01BE\u01C9\u01CD\u01D9\u01DD\u01E8" + - "\u01EC\u01F4\u01FE\u0202\u020C\u0210\u021A\u021D\u0220\u0239\u0260\u0263" + - "\u026A\u026C\u0273\u027A\u0281\u028A\u028D\u0298\u029C\u02A8\u02AF\u02B8" + - "\u02C1\u02C7\u02CE\u02D7\u02DB\u02DF\u02EA\u02F1"; + "\u01F1\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F3\x07\x05" + + "\x02\x02\u01F3\u025D\x03\x02\x02\x02\u01F4\u025D\x050\x19\x02\u01F5\u01F6" + + "\x07#\x02\x02\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x05.\x18\x02\u01F8" + + "\u01F9\x07\n\x02\x02\u01F9\u01FB\x05.\x18\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" + + "\u025D\x03\x02\x02\x02\u0204\u0205\x07$\x02\x02\u0205\u0206\x07\x04\x02" + + "\x02\u0206\u020B\x05.\x18\x02\u0207\u0208\x07\n\x02\x02\u0208\u020A\x05" + + ".\x18\x02\u0209\u0207\x03\x02\x02\x02\u020A\u020D\x03\x02\x02\x02\u020B" + + "\u0209\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x03\x02" + + "\x02\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0210\x07\n\x02\x02\u020F\u020E" + + "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02" + + "\u0211\u0212\x07\x05\x02\x02\u0212\u025D\x03\x02\x02\x02\u0213\u0218\x05" + + "P)\x02\u0214\u0218\x07,\x02\x02\u0215\u0218\x07+\x02\x02\u0216\u0218\x07" + + "*\x02\x02\u0217\u0213\x03\x02\x02\x02\u0217\u0214\x03\x02\x02\x02\u0217" + + "\u0215\x03\x02\x02\x02\u0217\u0216\x03\x02\x02\x02\u0218\u025D\x03\x02" + + "\x02\x02\u0219\u021A\x07?\x02\x02\u021A\u021B\x05.\x18\x02\u021B\u021C" + + "\x07\n\x02\x02\u021C\u0221\x05.\x18\x02\u021D\u021E\x07\n\x02\x02\u021E" + + "\u0220\x05.\x18\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\u0226\x07\n\x02\x02" + + "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + + "\x02\x02\x02\u0227\u0228\x07@\x02\x02\u0228\u025D\x03\x02\x02\x02\u0229" + + "\u022A\x07\x04\x02\x02\u022A\u022F\x05F$\x02\u022B\u022C\x07\n\x02\x02" + + "\u022C\u022E\x05F$\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02" + + "\x02\x02\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230" + + "\u0233\x03\x02\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0234\x07\n\x02" + + "\x02\u0233\u0232\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0235" + + "\x03\x02\x02\x02\u0235\u0236\x07\x05\x02\x02\u0236\u025D\x03\x02\x02\x02" + + "\u0237\u0240\x07\r\x02\x02\u0238\u023D\x05.\x18\x02\u0239\u023A\x07\n" + + "\x02\x02\u023A\u023C\x05.\x18\x02\u023B\u0239\x03\x02\x02\x02\u023C\u023F" + + "\x03\x02\x02\x02\u023D\u023B\x03\x02\x02\x02\u023D\u023E\x03\x02\x02\x02" + + "\u023E\u0241\x03\x02\x02\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0238\x03" + + "\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0243\x03\x02\x02\x02\u0242" + + "\u0244\x07\n\x02\x02\u0243\u0242\x03\x02\x02\x02\u0243\u0244\x03\x02\x02" + + "\x02\u0244\u0245\x03\x02\x02\x02\u0245\u025D\x07\x0E\x02\x02\u0246\u0247" + + "\x07%\x02\x02\u0247\u0248\x07?\x02\x02\u0248\u0249\x05.\x18\x02\u0249" + + "\u024A\x07@\x02\x02\u024A\u024B\x05.\x18\x02\u024B\u024C\x07&\x02\x02" + + "\u024C\u024D\x05.\x18\x07\u024D\u025D\x03\x02\x02\x02\u024E\u024F\x05" + + "\n\x06\x02\u024F\u0250\x05.\x18\x06\u0250\u025D\x03\x02\x02\x02\u0251" + + "\u0252\x05\x14\v\x02\u0252\u0253\x05.\x18\x05\u0253\u025D\x03\x02\x02" + + "\x02\u0254\u0255\x07?\x02\x02\u0255\u0256\x05.\x18\x02\u0256\u0257\x07" + + "@\x02\x02\u0257\u025D\x03\x02\x02\x02\u0258\u0259\x07\x04\x02\x02\u0259" + + "\u025A\x05.\x18\x02\u025A\u025B\x07\x05\x02\x02\u025B\u025D\x03\x02\x02" + + "\x02\u025C\u01C6\x03\x02\x02\x02\u025C\u01C8\x03\x02\x02\x02\u025C\u01CF" + + "\x03\x02\x02\x02\u025C\u01D1\x03\x02\x02\x02\u025C\u01D6\x03\x02\x02\x02" + + "\u025C\u01E5\x03\x02\x02\x02\u025C\u01F4\x03\x02\x02\x02\u025C\u01F5\x03" + + "\x02\x02\x02\u025C\u0204\x03\x02\x02\x02\u025C\u0217\x03\x02\x02\x02\u025C" + + "\u0219\x03\x02\x02\x02\u025C\u0229\x03\x02\x02\x02\u025C\u0237\x03\x02" + + "\x02\x02\u025C\u0246\x03\x02\x02\x02\u025C\u024E\x03\x02\x02\x02\u025C" + + "\u0251\x03\x02\x02\x02\u025C\u0254\x03\x02\x02\x02\u025C\u0258\x03\x02" + + "\x02\x02\u025D\u028F\x03\x02\x02\x02\u025E\u025F\f\x1C\x02\x02\u025F\u0260" + + "\x07!\x02\x02\u0260\u028E\x05.\x18\x1C\u0261\u0262\f\x1A\x02\x02\u0262" + + "\u0263\t\x02\x02\x02\u0263\u028E\x05.\x18\x1B\u0264\u0265\f\x19\x02\x02" + + "\u0265\u0266\t\x03\x02\x02\u0266\u028E\x05.\x18\x1A\u0267\u0268\f\x18" + + "\x02\x02\u0268\u0269\t\x04\x02\x02\u0269\u028E\x05.\x18\x19\u026A\u026B" + + "\f\x16\x02\x02\u026B\u026C\x07>\x02\x02\u026C\u026D\x05.\x18\x17\u026D" + + "\u026E\b\x18\x01\x02\u026E\u028E\x03\x02\x02\x02\u026F\u0270\f\x14\x02" + + "\x02\u0270\u0271\x07-\x02\x02\u0271\u028E\x05.\x18\x15\u0272\u0273\f\x12" + + "\x02\x02\u0273\u0274\x07.\x02\x02\u0274\u028E\x05.\x18\x13\u0275\u0276" + + "\f\x11\x02\x02\u0276\u0277\x07/\x02\x02\u0277\u028E\x05.\x18\x12\u0278" + + "\u0279\f\x10\x02\x02\u0279\u027A\x070\x02\x02\u027A\u028E\x05.\x18\x11" + + "\u027B\u027C\f\n\x02\x02\u027C\u027D\x07\x1C\x02\x02\u027D\u028E\x05." + + "\x18\v\u027E\u027F\f \x02\x02\u027F\u0280\x07\x18\x02\x02\u0280\u0286" + + "\x05J&\x02\u0281\u0283\x07?\x02\x02\u0282\u0284\x05D#\x02\u0283\u0282" + + "\x03\x02\x02\x02\u0283\u0284\x03\x02\x02\x02\u0284\u0285\x03\x02\x02\x02" + + "\u0285\u0287\x07@\x02\x02\u0286\u0281\x03\x02\x02\x02\u0286\u0287\x03" + + "\x02\x02\x02\u0287\u028E\x03\x02\x02\x02\u0288\u0289\f\x1D\x02\x02\u0289" + + "\u028A\x07\r\x02\x02\u028A\u028B\x05.\x18\x02\u028B\u028C\x07\x0E\x02" + + "\x02\u028C\u028E\x03\x02\x02\x02\u028D\u025E\x03\x02\x02\x02\u028D\u0261" + + "\x03\x02\x02\x02\u028D\u0264\x03\x02\x02\x02\u028D\u0267\x03\x02\x02\x02" + + "\u028D\u026A\x03\x02\x02\x02\u028D\u026F\x03\x02\x02\x02\u028D\u0272\x03" + + "\x02\x02\x02\u028D\u0275\x03\x02\x02\x02\u028D\u0278\x03\x02\x02\x02\u028D" + + "\u027B\x03\x02\x02\x02\u028D\u027E\x03\x02\x02\x02\u028D\u0288\x03\x02" + + "\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F\u028D\x03\x02\x02\x02\u028F" + + "\u0290\x03\x02\x02\x02\u0290/\x03\x02\x02\x02\u0291\u028F\x03\x02\x02" + + "\x02\u0292\u0293\x072\x02\x02\u0293\u0294\x05.\x18\x02\u0294\u0296\x07" + + "\x04\x02\x02\u0295\u0297\x07\x0F\x02\x02\u0296\u0295\x03\x02\x02\x02\u0296" + + "\u0297\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298\u029D\x052\x1A" + + "\x02\u0299\u029A\x07\x0F\x02\x02\u029A\u029C\x052\x1A\x02\u029B\u0299" + + "\x03\x02\x02\x02\u029C\u029F\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02" + + "\u029D\u029E\x03\x02\x02\x02\u029E\u02A0\x03\x02\x02\x02\u029F\u029D\x03" + + "\x02\x02\x02\u02A0\u02A1\x07\x05\x02\x02\u02A11\x03\x02\x02\x02\u02A2" + + "\u02A5\x054\x1B\x02\u02A3\u02A5\x07\'\x02\x02\u02A4\u02A2\x03\x02\x02" + + "\x02\u02A4\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + + "\x07\x1D\x02\x02\u02A7\u02A8\x05.\x18\x02\u02A83\x03\x02\x02\x02\u02A9" + + "\u02B0\x05R*\x02\u02AA\u02AD\x07?\x02\x02\u02AB\u02AE\x05R*\x02\u02AC" + + "\u02AE\x07\'\x02\x02\u02AD\u02AB\x03\x02\x02\x02\u02AD\u02AC\x03\x02\x02" + + "\x02\u02AE\u02AF\x03\x02\x02\x02\u02AF\u02B1\x07@\x02\x02\u02B0\u02AA" + + "\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B15\x03\x02\x02\x02\u02B2" + + "\u02B3\x05\b\x05\x02\u02B3\u02B4\x07\x02\x02\x03\u02B4\u02BC\x03\x02\x02" + + "\x02\u02B5\u02B6\x05.\x18\x02\u02B6\u02B7\x07\x02\x02\x03\u02B7\u02BC" + + "\x03\x02\x02\x02\u02B8\u02B9\x07E\x02\x02\u02B9\u02BC\x07\x02\x02\x03" + + "\u02BA\u02BC\x07\x02\x02\x03\u02BB\u02B2\x03\x02\x02\x02\u02BB\u02B5\x03" + + "\x02\x02\x02\u02BB\u02B8\x03\x02\x02\x02\u02BB\u02BA\x03\x02\x02\x02\u02BC" + + "7\x03\x02\x02\x02\u02BD\u02C0\x05:\x1E\x02\u02BE\u02C0\x05<\x1F\x02\u02BF" + + "\u02BD\x03\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C09\x03\x02\x02" + + "\x02\u02C1\u02C2\x05@!\x02\u02C2\u02C3\x07\x1D\x02\x02\u02C3\u02C4\x05" + + ".\x18\x02\u02C4\u02D3\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02\u02C6\u02CB" + + "\x05@!\x02\u02C7\u02C8\x07\n\x02\x02\u02C8\u02CA\x05@!\x02\u02C9\u02C7" + + "\x03\x02\x02\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02" + + "\u02CB\u02CC\x03\x02\x02\x02\u02CC\u02CE\x03\x02\x02\x02\u02CD\u02CB\x03" + + "\x02\x02\x02\u02CE\u02CF\x07@\x02\x02\u02CF\u02D0\x07\x1D\x02\x02\u02D0" + + "\u02D1\x05.\x18\x02\u02D1\u02D3\x03\x02\x02\x02\u02D2\u02C1\x03\x02\x02" + + "\x02\u02D2\u02C5\x03\x02\x02\x02\u02D3;\x03\x02\x02\x02\u02D4\u02D5\x07" + + "?\x02\x02\u02D5\u02D6\x07?\x02\x02\u02D6\u02D9\x05@!\x02\u02D7\u02D8\x07" + + "\n\x02\x02\u02D8\u02DA\x05@!\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB" + + "\x03\x02\x02\x02\u02DB\u02D9\x03\x02\x02\x02\u02DB\u02DC\x03\x02\x02\x02" + + "\u02DC\u02DD\x03\x02\x02\x02\u02DD\u02DE\x07@\x02\x02\u02DE\u02DF\x07" + + "@\x02\x02\u02DF\u02E0\x07\x1D\x02\x02\u02E0\u02E1\x05.\x18\x02\u02E1=" + + "\x03\x02\x02\x02\u02E2\u02E5\x07\'\x02\x02\u02E3\u02E5\x05P)\x02\u02E4" + + "\u02E2\x03\x02\x02\x02\u02E4\u02E3\x03\x02\x02\x02\u02E5?\x03\x02\x02" + + "\x02\u02E6\u02E7\x05> \x02\u02E7A\x03\x02\x02\x02\u02E8\u02EB\x075\x02" + + "\x02\u02E9\u02EB\x05P)\x02\u02EA\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03" + + "\x02\x02\x02\u02EBC\x03\x02\x02\x02\u02EC\u02F1\x05.\x18\x02\u02ED\u02EE" + + "\x07\n\x02\x02\u02EE\u02F0\x05.\x18\x02\u02EF\u02ED\x03\x02\x02\x02\u02F0" + + "\u02F3\x03\x02\x02\x02\u02F1\u02EF\x03\x02\x02\x02\u02F1\u02F2\x03\x02" + + "\x02\x02\u02F2E\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F4\u02F5" + + "\x05R*\x02\u02F5\u02F6\x07\x07\x02\x02\u02F6\u02F7\x05.\x18\x02\u02F7" + + "\u02FB\x03\x02\x02\x02\u02F8\u02F9\x07(\x02\x02\u02F9\u02FB\x05.\x18\x02" + + "\u02FA\u02F4\x03\x02\x02\x02\u02FA\u02F8\x03\x02\x02\x02\u02FBG\x03\x02" + + "\x02\x02\u02FC\u02FF\x05P)\x02\u02FD\u02FF\t\x05\x02\x02\u02FE\u02FC\x03" + + "\x02\x02\x02\u02FE\u02FD\x03\x02\x02\x02\u02FFI\x03\x02\x02\x02\u0300" + + "\u0303\x05P)\x02\u0301\u0303\t\x06\x02\x02\u0302\u0300\x03\x02\x02\x02" + + "\u0302\u0301\x03\x02\x02\x02\u0303K\x03\x02\x02\x02\u0304\u0305\t\x07" + + "\x02\x02\u0305M\x03\x02\x02\x02\u0306\u0307\t\b\x02\x02\u0307O\x03\x02" + + "\x02\x02\u0308\u030D\x05T+\x02\u0309\u030A\x07)\x02\x02\u030A\u030C\x05" + + "T+\x02\u030B\u0309\x03\x02\x02\x02\u030C\u030F\x03\x02\x02\x02\u030D\u030B" + + "\x03\x02\x02\x02\u030D\u030E\x03\x02\x02\x02\u030EQ\x03\x02\x02\x02\u030F" + + "\u030D\x03\x02\x02\x02\u0310\u0315\x05T+\x02\u0311\u0312\x05P)\x02\u0312" + + "\u0313\b*\x01\x02\u0313\u0315\x03\x02\x02\x02\u0314\u0310\x03\x02\x02" + + "\x02\u0314\u0311\x03\x02\x02\x02\u0315S\x03\x02\x02\x02\u0316\u0317\t" + + "\t\x02\x02\u0317U\x03\x02\x02\x02WY`iq\x8A\x94\x97\x9C\xAB\xB2\xB6\xB9" + + "\xC7\xD0\xD5\xD8\xDF\xE7\xED\xF2\xFD\u0105\u010B\u010F\u0111\u011C\u011E" + + "\u012D\u0135\u0144\u014C\u014E\u015F\u0162\u0165\u017C\u0180\u0186\u0192" + + "\u01A1\u01A6\u01A8\u01B8\u01BE\u01C2\u01CB\u01DD\u01E1\u01EC\u01F0\u01FC" + + "\u0200\u020B\u020F\u0217\u0221\u0225\u022F\u0233\u023D\u0240\u0243\u025C" + + "\u0283\u0286\u028D\u028F\u0296\u029D\u02A4\u02AD\u02B0\u02BB\u02BF\u02CB" + + "\u02D2\u02DB\u02E4\u02EA\u02F1\u02FA\u02FE\u0302\u030D\u0314"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4356,8 +4525,8 @@ export class TypeAbstractDefContext extends TypeDefContext { } } export class TypeAliasDefContext extends TypeDefContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public type(): TypeContext { @@ -4389,19 +4558,12 @@ 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 typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + public sumTypeDefinition(): SumTypeDefinitionContext { + return this.getRuleContext(0, SumTypeDefinitionContext); } constructor(ctx: TypeDefContext) { super(ctx.parent, ctx.invokingState); @@ -4430,6 +4592,88 @@ export class TypeSumDefContext extends TypeDefContext { } +export class TypeDefHeadContext extends ParserRuleContext { + public _typeName!: QualIdContext; + public _typeVar!: TypeVarContext; + public _typeVars: TypeVarContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + public typeVar(): TypeVarContext[]; + public typeVar(i: number): TypeVarContext; + public typeVar(i?: number): TypeVarContext | TypeVarContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeVarContext); + } else { + return this.getRuleContext(i, TypeVarContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeDefHead; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeDefHead) { + listener.enterTypeDefHead(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeDefHead) { + listener.exitTypeDefHead(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeDefHead) { + return visitor.visitTypeDefHead(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SumTypeDefinitionContext extends ParserRuleContext { + 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); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_sumTypeDefinition; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterSumTypeDefinition) { + listener.enterSumTypeDefinition(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitSumTypeDefinition) { + listener.exitSumTypeDefinition(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitSumTypeDefinition) { + return visitor.visitSumTypeDefinition(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class TypeSumVariantContext extends ParserRuleContext { public _sumLabel!: SimpleIdContext; public simpleId(): SimpleIdContext { @@ -4995,8 +5239,8 @@ export class TypeTupleContext extends TypeContext { } } export class TypeRecContext extends TypeContext { - public row(): RowContext { - return this.getRuleContext(0, RowContext); + public row(): RowContext | undefined { + return this.tryGetRuleContext(0, RowContext); } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); @@ -5101,28 +5345,30 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeVarContext extends TypeContext { - public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } +export class TypeVarCaseContext extends TypeContext { + public typeVar(): TypeVarContext { + return this.getRuleContext(0, TypeVarContext); + } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeVar) { - listener.enterTypeVar(this); + if (listener.enterTypeVarCase) { + listener.enterTypeVarCase(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeVar) { - listener.exitTypeVar(this); + if (listener.exitTypeVarCase) { + listener.exitTypeVarCase(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeVar) { - return visitor.visitTypeVar(this); + if (visitor.visitTypeVarCase) { + return visitor.visitTypeVarCase(this); } else { return visitor.visitChildren(this); } @@ -5188,6 +5434,74 @@ export class TypeParenContext extends TypeContext { } } } +export class TypeAppContext extends TypeContext { + public _typeCtor!: TypeContext; + public _type!: TypeContext; + public _typeArg: TypeContext[] = []; + public type(): TypeContext[]; + public type(i: number): TypeContext; + public type(i?: number): TypeContext | TypeContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeContext); + } else { + return this.getRuleContext(i, TypeContext); + } + } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeApp) { + listener.enterTypeApp(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeApp) { + listener.exitTypeApp(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeApp) { + return visitor.visitTypeApp(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeVarContext extends ParserRuleContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeVar; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} export class RowContext extends ParserRuleContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 19a707994..4d01a74d9 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -184,12 +188,12 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeVar` + * Visit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeVar?: (ctx: TypeVarContext) => Result; + visitTypeVarCase?: (ctx: TypeVarCaseContext) => Result; /** * Visit a parse tree produced by the `typeConst` @@ -207,6 +211,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeParen?: (ctx: TypeParenContext) => Result; + /** + * Visit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeApp?: (ctx: TypeAppContext) => Result; + /** * Visit a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -577,6 +589,20 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeDef?: (ctx: TypeDefContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeDefHead?: (ctx: TypeDefHeadContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => Result; + /** * Visit a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -654,6 +680,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitType?: (ctx: TypeContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeVar?: (ctx: TypeVarContext) => Result; + /** * Visit a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index b8602e60e..53985dd18 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -203,6 +203,9 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } + case 'app': + case 'abs': + throw new Error('TODO This should be impossible?') } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2e733d0dd..3f3eb6963 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -86,6 +86,10 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType + enterAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + exitAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + enterAppType?: (type: t.QuintAppType) => t.QuintAppType + exitAppType?: (type: t.QuintAppType) => t.QuintAppType /** Row types */ enterRow?: (row: t.Row) => t.Row @@ -254,6 +258,37 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } } break + + case 'abs': + { + if (transformer.enterAbsType) { + newType = transformer.enterAbsType(newType) + } + + newType.vars = newType.vars.map(v => transformType(transformer, v) as t.QuintVarType) + newType.body = transformType(transformer, newType.body) + + if (transformer.exitAbsType) { + newType = transformer.exitAbsType(newType) + } + } + break + + case 'app': + { + if (transformer.enterAppType) { + newType = transformer.enterAppType(newType) + } + + newType.ctor = transformType(transformer, newType.ctor) + newType.args = newType.args.map(v => transformType(transformer, v)) + + if (transformer.exitAppType) { + newType = transformer.exitAppType(newType) + } + } + break + default: unreachable(newType) } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 609b62105..282f048ec 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -93,6 +93,10 @@ export interface IRVisitor { exitRecordType?: (_type: t.QuintRecordType) => void enterSumType?: (_type: t.QuintSumType) => void exitSumType?: (_type: t.QuintSumType) => void + enterAppType?: (_type: t.QuintAppType) => void + exitAppType?: (_type: t.QuintAppType) => void + enterAbsType?: (_type: t.QuintAbsType) => void + exitAbsType?: (_type: t.QuintAbsType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -245,6 +249,20 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break + case 'abs': + visitor.enterAbsType?.(type) + type.vars.map(t => walkType(visitor, t)) + walkType(visitor, type.body) + visitor.exitAbsType?.(type) + break + + case 'app': + visitor.enterAppType?.(type) + walkType(visitor, type.ctor) + type.args.map(t => walkType(visitor, t)) + visitor.exitAppType?.(type) + break + default: unreachable(type) } diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f2ea096f6..274ce939e 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -187,6 +187,16 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } + case 'abs': { + const vars = type.vars.map(typeToString).join(', ') + const body = typeToString(type.body) + return `Λ(${vars}).${body}` + } + case 'app': { + const abs = typeToString(type.ctor) + const args = type.args.map(typeToString).join(', ') + return `${abs}[${args}]` + } } } diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index af87b4408..133f6aeb8 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,17 +98,27 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } -/// Type abstraction: Λτ.Τ +/** Type abstraction + * + * In System-F, this corresponds to Λτ1.(...(Λτ2.(Τ)). + */ export interface QuintAbsType extends WithOptionalId { kind: 'abs' - vars: QuintVarType + vars: QuintVarType[] /** The bound variables */ + body: QuintType /** The body of the abstraction */ } -/// Type application: (Λτ.Τ)υ +/** Type application: (Λτ.Τ)υ + * + * In system-F, this corresponds to (Λτ.Τ)υ + * + * Type application is only well well-formed if `ctor` is (resolved to) an + * n-ary type abstraction, and `args.length === n` + */ export interface QuintAppType extends WithOptionalId { kind: 'app' - abs: QuintAbsType - arg: QuintType + ctor: QuintType /** The type "constructor" applied */ + args: QuintType[] /** The arguments to which the constructor is applied */ } /** diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f1e38a236..b90220d2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -19,9 +19,12 @@ import { } from '../ir/quintIr' import { ConcreteFixedRow, + QuintAbsType, + QuintAppType, QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, @@ -36,6 +39,7 @@ import { zip } from '../util' import { QuintError } from '../quintError' import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' import { Loc } from '../ErrorMessage' +import { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -363,36 +367,49 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type Alias = set(int) + // TODO + // type Alias = Set(int) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { - const name = ctx.qualId()!.text - const type = this.popType().value const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + // NOTE: `rhs` must precede `typeVariables` due to the stack order! + const rhs = this.popType().unwrap(() => + fail('internal error: type alias declaration parsed with no right hand side') + ) + const typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) + if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const def: QuintTypeDef = { - id, - kind: 'typedef', - name, - type, - } + const type: QuintType = + typeVariables.length === 0 + ? rhs // A monomorphic type declaration + : { id: this.getId(ctx), kind: 'abs', vars: typeVariables, body: rhs } // A polymorphic type declaration + const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) } // type T = | A | B(t1) | C(t2) exitTypeSumDef(ctx: p.TypeSumDefContext) { - const name = ctx._typeName!.text! const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + const typeVars = this.popTypeDefHeadTypeVars(defHead) + // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const type: QuintSumType = { id, kind: 'sum', fields: row } - const typeName: QuintConstType = { id, kind: 'const', name } + const sumType: QuintSumType = { id, kind: 'sum', fields: row } + const type: QuintSumType | QuintAbsType = + typeVars.length === 0 + ? sumType // A monomorphic type + : { id: this.getId(ctx), kind: 'abs', vars: typeVars, body: sumType } // A polymorphic type + const def: QuintTypeDef = { id: id, name, @@ -400,6 +417,13 @@ export class ToIrListener implements QuintListener { type, } + // Used for annotations in the variant constructors + const typeConst: QuintConstType = { id, kind: 'const', name } + const constructorReturnType: QuintConstType | QuintAppType = + typeVars.length === 0 + ? typeConst // For a monomorphic type annotation + : { id: this.getId(ctx), kind: 'app', ctor: typeConst, args: typeVars } // A polymorphic type annotation + // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression // into the sum type by wrapping it in a label @@ -423,7 +447,7 @@ export class ToIrListener implements QuintListener { // val a: T = A(42) // val b: T = B // ``` - const constructors: QuintOpDef[] = zip(fields, ctx.typeSumVariant()).map( + const constructors: QuintOpDef[] = zip(fields, ctx.sumTypeDefinition().typeSumVariant()).map( ([{ fieldName, fieldType }, variantCtx]) => { // Mangle the parameter name to avoid clashes // This shouldn't be visible to users @@ -448,7 +472,7 @@ export class ToIrListener implements QuintListener { // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) - typeAnnotation = typeName + typeAnnotation = constructorReturnType expr = { id: this.getId(variantCtx), kind: 'app', @@ -474,7 +498,7 @@ export class ToIrListener implements QuintListener { args: [label, wrappedExpr], } - typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } + typeAnnotation = { kind: 'oper', args: [fieldType], res: constructorReturnType } expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } @@ -485,6 +509,26 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def, ...constructors) } + // Pop all the type variables in the head of a type def from the type stack + // E.g., for a type def like + // + // type Foo[a,b,c] = ... + // + // Return the type variables [a, b, c] + private popTypeDefHeadTypeVars(ctx: p.TypeDefHeadContext): QuintVarType[] { + return ( + ctx._typeVars + .map( + _ => + this.popType().unwrap(() => + fail('internal error: type parameter parsed with no type variable') + ) as QuintVarType + ) + // The stack stores the variables in reverse order + .reverse() + ) + } + exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value @@ -1047,6 +1091,21 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + exitTypeApp(ctx: p.TypeAppContext) { + const id = this.getId(ctx) + const args: QuintType[] = ctx._typeArg + .map(_ => + // We require that there is one parsed type for each typeArg recorded + this.popType().unwrap() + ) // The stack stores the arguments in reverse order + .reverse() + // The next type on the stack after the args should be the applied + // type constructor + const ctor = this.popType().unwrap() + this.typeStack.push({ id, kind: 'app', ctor, args }) + } + + // TODO: replace with general type application // a set type, e.g., set(int) exitTypeSet(ctx: p.TypeSetContext) { const last = this.popType().unwrap() @@ -1054,6 +1113,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'set', elem: last }) } + // TODO: replace with general type application // a list type, e.g., list(int) exitTypeList(ctx: p.TypeListContext) { const top = this.popType().unwrap() diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index b67b9a1e2..2fccad980 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,6 +47,8 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' + /* QNT010: Lower case simple identifiers */ + | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 1414556a0..607b13554 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,6 +29,7 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme +// TODO: Why aren't we noting type variables in the schema here? export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..9b3382cd4 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,6 +391,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } + // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -416,6 +417,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } + // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index 49fbe496e..a1f4f9c73 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -98,7 +98,12 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } - // The basic types have no variables, so cannot + case 'abs': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + case 'app': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + + // The basic types have no variables, so don't require substitution case 'int': case 'bool': case 'str': diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 290fc921f..c3c41d5a3 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -855,5 +855,52 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), enteredTypes) assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) + + it('finds type abstractions', () => { + const quintModule = buildModuleWithDecls(['type StrMap[a] = str -> a']) + + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAbsType(type: QuintType): void { + this.entered.push(type) + } + + exitAbsType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['Λ(a).(str -> a)'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) + + it('finds type applications', () => { + const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAppType(type: QuintType): void { + this.entered.push(type) + } + + exitAppType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['StrMap[int]'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) }) }) diff --git a/quint/test/ir/IRprinting.test.ts b/quint/test/ir/IRprinting.test.ts index dc8df1eb0..f5035f22c 100644 --- a/quint/test/ir/IRprinting.test.ts +++ b/quint/test/ir/IRprinting.test.ts @@ -249,4 +249,10 @@ describe('typeToString', () => { const expectedType = '(A(int) | B)' assert.deepEqual(typeToString(type), expectedType) }) + + it('pretty prints type applications', () => { + const input = 'Result[ok, err]' + const type = buildType(input) + assert.deepEqual(typeToString(type), input) + }) }) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 42f7d55b7..dbead2601 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -103,7 +103,7 @@ describe('parsing', () => { readQuint('SuperSpec'), 'mocked_path/testFixture/SuperSpec.qnt' ) - assert.isEmpty(result.errors) + assert.deepEqual(result.errors, []) }) it('parses SuperSpec correctly', () => { @@ -118,6 +118,10 @@ describe('parsing', () => { parseAndCompare('_1043sumTypeDecl') }) + it('parses polymorphic type declarations', () => { + parseAndCompare('_1045polymorphicTypeDecl') + }) + it('parses match expressions', () => { parseAndCompare('_1044matchExpression') }) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 762a55f53..133c0c011 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -96,20 +96,29 @@ describe('parseType', () => { ) }) + it('parses type application', () => { + const type = parseType('Foo[int, bool, str]') + + assert.isTrue(type.isRight()) + type.map(value => + assert.deepEqual(value, { + kind: 'app', + ctor: { kind: 'const', name: 'Foo', id: 1n }, + args: [ + { kind: 'int', id: 2n }, + { kind: 'bool', id: 3n }, + { kind: 'str', id: 4n }, + ], + id: 5n, + }) + ) + }) + it('throws error when type is invalid', () => { - const type = parseType('Set[bool, int]') + const type = parseType('Set(int)') assert.isTrue(type.isLeft()) - type.mapLeft(error => - assert.sameDeepMembers(error, [ - { - // TODO We should not expect a '=>' here, - // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input ',' expecting {'->', '=>', ']'}", - locs: [{ start: { line: 0, col: 8, index: 8 }, end: { line: 0, col: 8, index: 8 } }], - }, - ]) - ) + type.mapLeft(error => assert.deepEqual(error[0].explanation, "missing '[' at '('")) }) it('throws error when row separators are invalid', () => { @@ -121,7 +130,7 @@ describe('parseType', () => { { // TODO We should not expect a '=>' here, // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input '|' expecting {',', '->', '=>'}", + explanation: "mismatched input '|' expecting '}'", locs: [{ start: { line: 0, col: 11, index: 11 }, end: { line: 0, col: 11, index: 11 } }], }, ]) diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 32b335531..0849ac06c 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From a7ac9db67a78eab924efd952ba89c64fd288911f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:51:03 -0500 Subject: [PATCH 210/428] Ass missing test fixtures --- quint/testFixture/_1045polymorphicTypeDecl.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.map.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.qnt | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.map.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.qnt diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json new file mode 100644 index 000000000..1bdc18f98 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":35,"name":"m","declarations":[{"id":14,"kind":"typedef","name":"MapApp","type":{"id":15,"kind":"abs","vars":[{"id":7,"kind":"var","name":"a"},{"id":8,"kind":"var","name":"b"}],"body":{"id":13,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":11,"kind":"fun","arg":{"id":9,"kind":"var","name":"a"},"res":{"id":10,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":12,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":6,"kind":"abs","vars":[{"id":1,"kind":"var","name":"a"}],"body":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":28,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":18,"kind":"var","name":"ok"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__OkParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":25}]}}},{"id":34,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":19,"kind":"var","name":"err"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":33,"kind":"lambda","params":[{"id":30,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":32,"kind":"app","opcode":"variant","args":[{"id":29,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":31}]}}}]}],"table":{"20":{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},"25":{"id":24,"name":"__OkParam","kind":"param"},"31":{"id":30,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json new file mode 100644 index 000000000..b83f0ae3a --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"7":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"8":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"9":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"10":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"12":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"13":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"14":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"15":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"16":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"17":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"20":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"21":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"22":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"25":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"26":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"27":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"28":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"31":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"32":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"33":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"34":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"35":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt new file mode 100644 index 000000000..423c76fe0 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -0,0 +1,7 @@ +module m { + type MonoPair[a] = (a, a) + type MapApp[a, b] = (a -> b, a) + type Result[ok, err] = + | Ok(ok) + | Err(err) +} From cd592bbbb5ff59033369c593820a8b54cf0623a7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:55:09 -0500 Subject: [PATCH 211/428] Add abs and app to server completion --- vscode/quint-vscode/server/src/complete.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index 4d899eeeb..e823d9660 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,6 +219,8 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': + case 'abs': + case 'app': return [] } } From 323305899cc43bb5d5fd3e742bb86fa0fe7ade18 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:25:04 -0500 Subject: [PATCH 212/428] Add missing graphics case --- quint/src/graphics.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 53985dd18..ad11919a9 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -9,7 +9,7 @@ */ import chalk from 'chalk' -import { strict as assert } from 'assert' +import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -204,8 +204,10 @@ export function prettyQuintType(type: QuintType): Doc { return prettySumRow(type.fields) } case 'app': + const args = type.args.map(prettyQuintType) + return group([prettyQuintType(type), text('['), ...args, text(']')]) case 'abs': - throw new Error('TODO This should be impossible?') + fail('internal error: type abstraction should never be printed for users in graphics') } } From c79a8cf1e0845e3ddb3610c13cd600b5ad741403 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:52:32 -0500 Subject: [PATCH 213/428] Cleanup and comment correction --- quint/src/parsing/ToIrListener.ts | 12 +++++++++--- quint/src/quintError.ts | 2 -- quint/src/types/constraintGenerator.ts | 2 -- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index b90220d2a..9ae21c8b5 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -367,8 +367,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // TODO - // type Alias = Set(int) + // E.g., + // + // - type Alias = Set(int) + // - type Constr[a, b] = (Set(a), Set(b)) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) @@ -393,7 +395,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type T = | A | B(t1) | C(t2) + // E.g., + // + // - type T = | A | B(t1) | C(t2) + // - type Result[ok, err] = | Ok(ok) | Err(err) exitTypeSumDef(ctx: p.TypeSumDefContext) { const id = this.getId(ctx) @@ -1091,6 +1096,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + // E.g., Result[int, str] exitTypeApp(ctx: p.TypeAppContext) { const id = this.getId(ctx) const args: QuintType[] = ctx._typeArg diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 2fccad980..b67b9a1e2 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,8 +47,6 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' - /* QNT010: Lower case simple identifiers */ - | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 9b3382cd4..e17bdcafa 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,7 +391,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -417,7 +416,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } - // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { From fa7a65615224103e13e5d33d858fab79c9f4d58d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:38:45 -0500 Subject: [PATCH 214/428] Fix lints --- quint/src/graphics.ts | 5 +++-- quint/src/runtime/impl/compilerImpl.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index ad11919a9..1bcfb5575 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,8 +8,8 @@ * See LICENSE in the project root for license information. */ +import { strict as assert, fail } from 'assert' import chalk from 'chalk' -import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -203,9 +203,10 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } - case 'app': + case 'app': { const args = type.args.map(prettyQuintType) return group([prettyQuintType(type), text('['), ...args, text(']')]) + } case 'abs': fail('internal error: type abstraction should never be printed for users in graphics') } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 9c50081b8..1e08509e2 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1407,7 +1407,8 @@ export class CompilerVisitor implements IRVisitor { }, } }) - // In case the case of reps, we have multiple copies of the same action. This is why all occurrences have the same id. + // In case the case of reps, we have multiple copies of the same action. + // This is why all occurrences have the same id. return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() From 02567d323890cc0d1cec46b821cee655b6f969b8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:25 -0500 Subject: [PATCH 215/428] Update quint/src/parsing/ToIrListener.ts Co-authored-by: Gabriela Moreira --- quint/src/parsing/ToIrListener.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 9ae21c8b5..ffa81a062 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -369,8 +369,8 @@ export class ToIrListener implements QuintListener { // E.g., // - // - type Alias = Set(int) - // - type Constr[a, b] = (Set(a), Set(b)) + // - type Alias = Set[int] + // - type Constr[a, b] = (Set[a], Set[b]) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) From 0316cd85b363d097f4e3b256c33cc22d822cb2dc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:37 -0500 Subject: [PATCH 216/428] Update quint/src/ir/quintTypes.ts Co-authored-by: Gabriela Moreira --- quint/src/ir/quintTypes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index 133f6aeb8..cddd85672 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -110,7 +110,7 @@ export interface QuintAbsType extends WithOptionalId { /** Type application: (Λτ.Τ)υ * - * In system-F, this corresponds to (Λτ.Τ)υ + * In System-F, this corresponds to (Λτ.Τ)υ * * Type application is only well well-formed if `ctor` is (resolved to) an * n-ary type abstraction, and `args.length === n` From eca5e836f8ccb5375105eea8163c79adb79e3069 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 20:20:51 -0500 Subject: [PATCH 217/428] Add explanatory comment --- quint/src/types/base.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 607b13554..23f357f21 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,7 +29,8 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme -// TODO: Why aren't we noting type variables in the schema here? +// Does not bind any type variables in `type`, which we take to assume +// that `type` has no free variables in the context. export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } From 4e63d54470746e65b8d19bfb40060379bf417b50 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:02:35 -0500 Subject: [PATCH 218/428] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55600156c..537bcec52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + +- Improved error reporting for runtime errors during simulation (#1349). + ### Deprecated ### Removed ### Fixed From a6e3baac8cdd5f9492cefc245fdc6a83d78ab15d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:03:07 -0500 Subject: [PATCH 219/428] Release v0.18.2 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 16 +++++++++++++--- quint/src/version.ts | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 537bcec52..0e5cd0750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.2 -- 2024-01-26 + ### Added ### Changed diff --git a/quint/package-lock.json b/quint/package-lock.json index b86cf5d2e..8895afdbb 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index dc71566b5..11a87c0c9 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,8 +1,14 @@ { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "description": "Core tool for the Quint specification language", - "keywords": ["temporal", "logic", "formal", "specification", "verification"], + "keywords": [ + "temporal", + "logic", + "formal", + "specification", + "verification" + ], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -29,7 +35,11 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": ["README.md", "dist/**/*", "test/**/*.ts"], + "files": [ + "README.md", + "dist/**/*", + "test/**/*.ts" + ], "engines": { "node": ">=18" }, diff --git a/quint/src/version.ts b/quint/src/version.ts index 9e6c4eefb..72277b158 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.1' +export const version = '0.18.2' From ca9a2da4c86c94a6ecda24daf0a8fd744a25c93e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:24:25 -0500 Subject: [PATCH 220/428] VSCode Release v0.13.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 38cfc2d55..75173fcbf 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.2 -- 2024-01-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.1 -- 2024-01-16 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 9aa7ebee9..e94ab4fd7 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.1", + "version": "0.13.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.1", + "version": "0.13.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b4b0221bb..74a68f0c3 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.1", + "version": "0.13.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index c7a4a6808..ca849a944 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.1", + "version": "0.13.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.1", + "version": "0.13.2", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.1", + "@informalsystems/quint": "^0.18.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", - "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", + "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", - "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", + "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index ae36975f3..a1c880a36 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.1", + "version": "0.13.2", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.1", + "@informalsystems/quint": "^0.18.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From cd15d6cb428ca6e109b070f00d662b2c79f73aa9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 14:32:17 -0500 Subject: [PATCH 221/428] Include result data in typechecking error outcome This was meant to be included, and ensures we have more helpful error data when diagnosing erroneous outcomes. --- quint/src/cliCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 1742eebab..3a3bbe1b1 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -255,12 +255,12 @@ export function mkErrorMessage(sourceMap: SourceMap): (_: QuintError) => ErrorMe */ export async function typecheck(parsed: ParsedStage): Promise> { const { table, modules, sourceMap } = parsed - const typechecking = { ...parsed, stage: 'typechecking' as stage } const [errorMap, result] = analyzeModules(table, modules) + const typechecking = { ...parsed, ...result, stage: 'typechecking' as stage } if (errorMap.length === 0) { - return right({ ...typechecking, ...result }) + return right(typechecking) } else { const errors = errorMap.map(mkErrorMessage(sourceMap)) return cliErr('typechecking failed', { ...typechecking, errors }) From f14daed800b287f61fd65c5114cc6ff31eba06ae Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 19:52:27 -0500 Subject: [PATCH 222/428] Add regression test for #1356 --- quint/test/effects/inferrer.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/quint/test/effects/inferrer.test.ts b/quint/test/effects/inferrer.test.ts index 188e635cc..25afaf776 100644 --- a/quint/test/effects/inferrer.test.ts +++ b/quint/test/effects/inferrer.test.ts @@ -207,6 +207,19 @@ describe('inferEffects', () => { assert.deepEqual(effectForDef(defs, effects, 'CoolAction'), expectedEffect) }) + it('avoids invalid cyclical binding error (regression on #1356)', () => { + const defs = [ + `pure def foo(s: int, g: int => int): int = { + val r = if (true) s else g(s) + g(r) + }`, + ] + + const [errors, _] = inferEffectsForDefs(defs) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + }) + it('returns error when operator signature is not unifiable with args', () => { const defs = [`def a = S.map(p => x' = p)`] From 251ed27d7f5f6637cfe129e88508e0ad4c8381ee Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 19:52:43 -0500 Subject: [PATCH 223/428] Use our zip util --- quint/src/effects/inferrer.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index addf5ebc5..e31f08e69 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -37,7 +37,7 @@ import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } f import { getSignatures, standardPropagation } from './builtinSignatures' import { FreshVarGenerator } from '../FreshVarGenerator' import { effectToString } from './printing' -import { zip } from 'lodash' +import { zip } from '../util' import { addNamespaces } from './namespaces' export type EffectInferenceResult = [Map, Map] @@ -185,11 +185,6 @@ export class EffectInferrer implements IRVisitor { effects, expr.args.map(a => a.id) ).forEach(([effect, id]) => { - if (!effect || !id) { - // Impossible: effects and expr.args are the same length - throw new Error(`Expected ${expr.args.length} effects, but got ${effects.length}`) - } - const r = applySubstitution(s, effect).map(toScheme) this.addToResults(id, r) }) From 49301095f0513c0c52664a21c9fccbb809b00b3f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 17:17:01 -0500 Subject: [PATCH 224/428] Simplify effect inference --- quint/src/effects/inferrer.ts | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index e31f08e69..b4450a948 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -149,23 +149,13 @@ export class EffectInferrer implements IRVisitor { } this.location = `Trying to infer effect for operator application in ${expressionToString(expr)}` - const paramsResult = mergeInMany( - expr.args.map((a: QuintEx) => { - return this.fetchResult(a.id).map(e => this.newInstance(e)) - }) - ) - const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } - const arrowEffect = paramsResult - .map(params => { - const effect: Effect = { - kind: 'arrow', - params, - result: resultEffect, - } + // Fetch all the effects for the arguments + const argEffects = mergeInMany(expr.args.map((a: QuintEx) => this.fetchResult(a.id).map(e => e.effect))) - return effect - }) + const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } + const arrowEffect = argEffects + .map((params: Effect[]): Effect => ({ kind: 'arrow', params, result: resultEffect })) .chain(e => applySubstitution(this.substitutions, e)) this.effectForName(expr.opcode, expr.id, expr.args.length) @@ -180,7 +170,7 @@ export class EffectInferrer implements IRVisitor { .chain(s => { this.substitutions = s - paramsResult.map(effects => + argEffects.map(effects => zip( effects, expr.args.map(a => a.id) From 065b254221fee9444033239ed783dce4f888a346 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:11:29 -0500 Subject: [PATCH 225/428] Correct unification of "effect entities" Closes #1356 Accomplished by removing an erroneous occurs check. --- quint/src/effects/base.ts | 21 +++++++-- quint/test/effects/base.test.ts | 75 +++++++++++++++------------------ 2 files changed, 50 insertions(+), 46 deletions(-) diff --git a/quint/src/effects/base.ts b/quint/src/effects/base.ts index 1b466a7c0..2676b4dd6 100644 --- a/quint/src/effects/base.ts +++ b/quint/src/effects/base.ts @@ -178,10 +178,23 @@ function bindEffect(name: string, effect: Effect): Either } function bindEntity(name: string, entity: Entity): Either { - if (entityNames(entity).includes(name)) { - return left(`Can't bind ${name} to ${entityToString(entity)}: cyclical binding`) - } else { - return right([{ kind: 'entity', name, value: entity }]) + switch (entity.kind) { + case 'concrete': + case 'variable': + return right([{ kind: 'entity', name, value: entity }]) + case 'union': + if (entityNames(entity).includes(name)) { + // An entity variable (which always stands for a set of state variables) + // unifies with the union of entities that may include include itself, + // iff the variables unify. + // + // I.e.: + // + // (v1 =.= v1 ∪ ... ∪ vn) <=> (v1 =.= ... =.= vn) + return right(entity.entities.map(e => ({ kind: 'entity', name, value: e }))) + } else { + return right([{ kind: 'entity', name, value: entity }]) + } } } diff --git a/quint/test/effects/base.test.ts b/quint/test/effects/base.test.ts index 0176016d4..65839a132 100644 --- a/quint/test/effects/base.test.ts +++ b/quint/test/effects/base.test.ts @@ -375,48 +375,39 @@ describe('unify', () => { assert.isTrue(result.isLeft()) }) - it('returs error when entity names are cyclical', () => { - const e1 = parseEffectOrThrow('Read[v1]') - const e2 = parseEffectOrThrow('Read[v1, v2]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Read[v1] and Read[v1, v2]', - children: [ - { - location: 'Trying to unify entities [v1] and [v1, v2]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) - }) - - it('returs error when entity names are cyclical in other way', () => { - const e1 = parseEffectOrThrow('Temporal[v1, v2]') - const e2 = parseEffectOrThrow('Temporal[v1]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Temporal[v1, v2] and Temporal[v1]', - children: [ - { - location: 'Trying to unify entities [v1, v2] and [v1]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) + it('can unify entities when a single variable in the lhs appears in a union on the rhs', () => { + // E.g., given the unification problem + // + // v1 =.= v1 ∪ v2 + // + // We should be able to form a valid substitution iff v1 =.= v2, since + // this then simplifies to + // + // v1 =.= v1 + // + // NOTE: This test was inverted after an incorrect occurs check was + // causing erroneous effect checking failures, as reported in + // https://github.com/informalsystems/quint/issues/1356 + // + // Occurs checks are called for to prevent the attempt to unify a free + // variable with a term that includes that variable as a subterm. E.g., `X + // =.= foo(a, X)`, which can never be resolved into a ground term. + // However, despite appearances, the unification of so called "entity + // unions", as in the example above is not such a case. Each "entity + // variable" stands for a set of possible state variables. As such, the + // unification problem above can be expanded to + // + // v1 ∪ {} =.= v1 ∪ v2 ∪ {} + // + // Which helps make clear why the unification succeeds iff v1 =.= v2. + const read1 = parseEffectOrThrow('Read[v1]') + const read2 = parseEffectOrThrow('Read[v1, v2]') + assert.isTrue(unify(read1, read2).isRight()) + + // Check the symmetrical case. + const temporal1 = parseEffectOrThrow('Temporal[v1, v2]') + const temporal2 = parseEffectOrThrow('Temporal[v1]') + assert.isTrue(unify(temporal1, temporal2).isRight()) }) }) }) From cdde148a24920432c31c24ed9c12d1912e479aa9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:33:17 -0500 Subject: [PATCH 226/428] Clean up logic and comments --- quint/src/effects/base.ts | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/quint/src/effects/base.ts b/quint/src/effects/base.ts index 2676b4dd6..73b5bf94f 100644 --- a/quint/src/effects/base.ts +++ b/quint/src/effects/base.ts @@ -81,11 +81,11 @@ export interface StateVariable { * entity variable or a combination of other entities. */ export type Entity = - /* A list of state variables */ + /* A set of state variables, represented as a list */ | { kind: 'concrete'; stateVariables: StateVariable[] } - /* A variable representing some entity */ + /* A variable representing some set of entities */ | { kind: 'variable'; name: string; reference?: bigint } - /* A combination of entities */ + /* The union of sets of entities, represented as a list */ | { kind: 'union'; entities: Entity[] } /* @@ -177,23 +177,35 @@ function bindEffect(name: string, effect: Effect): Either } } -function bindEntity(name: string, entity: Entity): Either { +function bindEntity(name: string, entity: Entity): Substitutions { switch (entity.kind) { case 'concrete': case 'variable': - return right([{ kind: 'entity', name, value: entity }]) + return [{ kind: 'entity', name, value: entity }] case 'union': if (entityNames(entity).includes(name)) { // An entity variable (which always stands for a set of state variables) - // unifies with the union of entities that may include include itself, - // iff the variables unify. + // unifies with the union of n sets of entities that may include itself, + // iff it unifies with each set. // // I.e.: // // (v1 =.= v1 ∪ ... ∪ vn) <=> (v1 =.= ... =.= vn) - return right(entity.entities.map(e => ({ kind: 'entity', name, value: e }))) + // + // We call this function recursively because, in the general case, + // occurrences of `v1` may be nested, as in: + // + // v1 =.= v1 ∪ (v2 ∪ (v3 ∪ v1)) ∪ v4 + // + // In practice, we are flattening unions before we call this function, + // but solving the general case ensures we preserve correct behavior + // even if this function is used on its own, without incurring any + // notable overhead when `entities` is already flat. + return entity.entities.flatMap(e => bindEntity(name, e)) } else { - return right([{ kind: 'entity', name, value: entity }]) + // Otherwise, the variable may be bound to the union of the entities + // without qualification. + return [{ kind: 'entity', name, value: entity }] } } } @@ -334,9 +346,9 @@ export function unifyEntities(va: Entity, vb: Entity): Either buildErrorLeaf(location, msg)) + return right(bindEntity(v1.name, v2)) } else if (v2.kind === 'variable') { - return bindEntity(v2.name, v1).mapLeft(msg => buildErrorLeaf(location, msg)) + return right(bindEntity(v2.name, v1)) } else if (isEqual(v1, v2)) { return right([]) } else if (v1.kind === 'union' && v2.kind === 'concrete') { From 65d06ef7e55b46e2db8c27944d2b60474343eb87 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 7 Feb 2024 16:38:17 -0500 Subject: [PATCH 227/428] Update quint/test/effects/base.test.ts Co-authored-by: Gabriela Moreira --- quint/test/effects/base.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/test/effects/base.test.ts b/quint/test/effects/base.test.ts index 65839a132..d17ec5164 100644 --- a/quint/test/effects/base.test.ts +++ b/quint/test/effects/base.test.ts @@ -383,7 +383,7 @@ describe('unify', () => { // We should be able to form a valid substitution iff v1 =.= v2, since // this then simplifies to // - // v1 =.= v1 + // v1 =.= v1 =.= v2 // // NOTE: This test was inverted after an incorrect occurs check was // causing erroneous effect checking failures, as reported in From 4ffa585a466886e6ab6f5a78b75b1c7ba3543a93 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:45:15 -0500 Subject: [PATCH 228/428] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e5cd0750..055f8a8e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Erroneous effect checking failure resulting from invalid occurs check. This + error prevented some valid specs from being simulated or verified (#1359). + ### Security ## v0.18.2 -- 2024-01-26 From f009af2d7b1e8c254d6a065ce1ffe545fe7a5e7b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 7 Feb 2024 16:40:49 -0500 Subject: [PATCH 229/428] Revert "Simplify effect inference" This reverts commit 49301095f0513c0c52664a21c9fccbb809b00b3f. --- quint/src/effects/inferrer.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index b4450a948..e31f08e69 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -149,13 +149,23 @@ export class EffectInferrer implements IRVisitor { } this.location = `Trying to infer effect for operator application in ${expressionToString(expr)}` - - // Fetch all the effects for the arguments - const argEffects = mergeInMany(expr.args.map((a: QuintEx) => this.fetchResult(a.id).map(e => e.effect))) + const paramsResult = mergeInMany( + expr.args.map((a: QuintEx) => { + return this.fetchResult(a.id).map(e => this.newInstance(e)) + }) + ) const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } - const arrowEffect = argEffects - .map((params: Effect[]): Effect => ({ kind: 'arrow', params, result: resultEffect })) + const arrowEffect = paramsResult + .map(params => { + const effect: Effect = { + kind: 'arrow', + params, + result: resultEffect, + } + + return effect + }) .chain(e => applySubstitution(this.substitutions, e)) this.effectForName(expr.opcode, expr.id, expr.args.length) @@ -170,7 +180,7 @@ export class EffectInferrer implements IRVisitor { .chain(s => { this.substitutions = s - argEffects.map(effects => + paramsResult.map(effects => zip( effects, expr.args.map(a => a.id) From 4af1dd8444574db71f030983c567f597366a4a4f Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 8 Feb 2024 08:49:34 -0300 Subject: [PATCH 230/428] Ensure ITF is produced also on successful runs --- quint/io-cli-tests.md | 19 +++++++++++++++++++ quint/src/cliCommands.ts | 20 ++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 915fa5ae4..3f3d3e663 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -683,6 +683,25 @@ rm out-itf-example.itf.json ] ``` +### Run without violation outputs ITF + + +``` +quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt +cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' +rm out-itf-example.itf.json +``` + + +``` +[ + "alice", + { + "#bigint": "0" + } +] +``` + ### Test outputs ITF TODO: output states after fix: https://github.com/informalsystems/quint/issues/288 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 3a3bbe1b1..a23b3178d 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -549,6 +549,16 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Thu, 8 Feb 2024 08:54:19 -0300 Subject: [PATCH 231/428] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 055f8a8e9..059c992fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Erroneous effect checking failure resulting from invalid occurs check. This error prevented some valid specs from being simulated or verified (#1359). +- Regression on ITF production, where we stopped producing ITF traces on + successful runs (#1362) ### Security From 3bc132d0e84bc1d27647019cf9dec3fcc7b6331f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 8 Feb 2024 14:29:55 -0500 Subject: [PATCH 232/428] Support producing multiple traces from runs Closes #1360 --- quint/io-cli-tests.md | 18 ++++++++-- quint/src/cli.ts | 7 +++- quint/src/cliCommands.ts | 72 +++++++++++++++++++++++++--------------- quint/src/simulation.ts | 18 +++++----- 4 files changed, 76 insertions(+), 39 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 3f3d3e663..cb909148e 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -669,7 +669,7 @@ error: Invariant violated quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 \ --invariant=totalSupplyDoesNotOverflowInv \ ../examples/solidity/Coin/coin.qnt -cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' +cat out-itf-example.itf.json | jq '.[0].states[0]."balances"."#map"[0]' rm out-itf-example.itf.json ``` @@ -688,7 +688,7 @@ rm out-itf-example.itf.json ``` quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt -cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' +cat out-itf-example.itf.json | jq '.[0].states[0]."balances"."#map"[0]' rm out-itf-example.itf.json ``` @@ -702,6 +702,20 @@ rm out-itf-example.itf.json ] ``` +### Run to generate multiple ITF traces + + +``` +quint run --out-itf=out-itf-example.itf.json --n-traces=5 --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt +cat out-itf-example.itf.json | jq 'length' +rm out-itf-example.itf.json +``` + + +``` +5 +``` + ### Test outputs ITF TODO: output states after fix: https://github.com/informalsystems/quint/issues/288 diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 21df3eb7d..ccd6e2ff1 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -153,10 +153,15 @@ const runCmd = { type: 'string', }) .option('max-samples', { - desc: 'the maximum on the number of traces to try', + desc: 'the maximum number of runs to attempt before giving up', type: 'number', default: 10000, }) + .option('n-traces', { + desc: 'how many traces to generate (only affects output to out-itf)', + type: 'number', + default: 1, + }) .option('max-steps', { desc: 'the maximum on the number of steps in every trace', type: 'number', diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index a23b3178d..6bec75160 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -24,7 +24,7 @@ import { } from './parsing/quintParserFrontend' import { ErrorMessage } from './ErrorMessage' -import { Either, left, right } from '@sweet-monads/either' +import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' import { ReplOptions, quintRepl } from './repl' @@ -35,8 +35,8 @@ import { DocumentationEntry, produceDocs, toMarkdown } from './docs' import { QuintError, quintErrorToString } from './quintError' import { TestOptions, TestResult, compileAndTest } from './runtime/testing' import { IdGenerator, newIdGenerator } from './idGenerator' -import { SimulatorOptions, compileAndRun } from './simulation' -import { ofItf, toItf } from './itf' +import { SimulatorOptions, compileAndRun, SimulatorResult, Outcome } from './simulation' +import { ItfTrace, ofItf, toItf } from './itf' import { printExecutionFrameRec, printTrace, terminalWidth } from './graphics' import { verbosity } from './verbosity' import { Rng, newRng } from './rng' @@ -518,22 +518,6 @@ export async function runSimulator(prev: TypecheckedStage): Promise => + toItf(result.vars, result.states).map(itf => [result.outcome, itf]) + ) + ).map(traceResults => { + const jsonObj = traceResults.map(([outcome, trace]) => addItfHeader(prev.args.input, outcome.status, trace)) writeToJson(prev.args.outItf, jsonObj) - } else { - return cliErr(`ITF conversion failed: ${trace.value}`, { ...simulator, errors: [] }) + }) + + if (itfOutResult.isLeft()) { + return cliErr(`ITF conversion failed: ${itfOutResult.value}`, { ...simulator, errors: [] }) } + } else if (results.length > 1) { + console.log( + `${results.length} traces where generated, but only the first failure or last success is printed to the console` + ) + console.log(`to view all the traces in the output file, rerun with the same seed and supply --out-itf`) } + const result = + results.find(r => r.outcome.status === 'error' || r.outcome.status === 'violation') ?? results[results.length - 1] + switch (result.outcome.status) { case 'error': return cliErr('Runtime error', { @@ -573,11 +590,12 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Thu, 8 Feb 2024 16:48:44 -0500 Subject: [PATCH 233/428] Release v0.18.3 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 059c992fc..fd011a24d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.3 -- 2024-02-08 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 8895afdbb..76a99dd10 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 11a87c0c9..0cb51a8d0 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 72277b158..8172abdfa 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.2' +export const version = '0.18.3' From 1d537de7107aedf13f11affacaee2a13f01007b9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 8 Feb 2024 17:07:40 -0500 Subject: [PATCH 234/428] VSCode Release v0.13.7 --- vscode/quint-vscode/CHANGELOG.md | 45 ++++++++++++++++++++ vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 ++++---- vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 59 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 75173fcbf..2c8eb0c06 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.7 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.6 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.5 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.4 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.3 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.2 -- 2024-01-26 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index e94ab4fd7..1b7f69401 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.2", + "version": "0.13.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.2", + "version": "0.13.7", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 74a68f0c3..10eb198ad 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.2", + "version": "0.13.7", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index ca849a944..d0ffde05d 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.2", + "version": "0.13.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.2", + "version": "0.13.7", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.2", + "@informalsystems/quint": "^0.18.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", - "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", + "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", - "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", + "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index a1c880a36..f416bbaa8 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.2", + "version": "0.13.7", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.2", + "@informalsystems/quint": "^0.18.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From d442edfc0fbb0aeff71b10a4e821feaa4c139fff Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 15 Feb 2024 12:08:27 -0500 Subject: [PATCH 235/428] Clean up operDef grammar Keeping the exact same meaning, but greater clarity on the rules. --- quint/src/generated/Quint.g4 | 30 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 1871 ++++++++++++++-------------- 3 files changed, 970 insertions(+), 933 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 95154347f..d027fc90d 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -39,17 +39,25 @@ declaration : 'const' qualId ':' type # const ; // An operator definition. -// We embed two kinds of parameters right in this rule. -// Otherwise, the parser would start recognizing parameters everywhere. -operDef : qualifier normalCallName - ( /* ML-like parameter lists */ - '(' (parameter (',' parameter)*)? ')' (':' type)? - | ':' type - /* C-like parameter lists */ - | '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type - )? - ('=' expr)? ';'? - ; +operDef + : qualifier normalCallName + // Unannotated parameter list + ('(' (parameter (',' parameter)*)? ')')? + // Optional type annotation using the deprecated format + // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 + (':' type)? + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + | qualifier normalCallName + // Fully annotated parameter lists + '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + ; typeDef : 'type' qualId # typeAbstractDef diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 781eec423..20af851ff 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -190,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 793, 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, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 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, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 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, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 179, 10, 6, 3, 6, 3, 6, 5, 6, 183, 10, 6, 3, 6, 5, 6, 186, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 200, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 207, 10, 8, 12, 8, 14, 8, 210, 11, 8, 3, 8, 3, 8, 5, 8, 214, 10, 8, 3, 9, 5, 9, 217, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 222, 10, 9, 12, 9, 14, 9, 225, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 262, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 268, 10, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 5, 13, 274, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 285, 10, 14, 5, 14, 287, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 300, 10, 15, 12, 15, 14, 15, 303, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 310, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 323, 10, 15, 12, 15, 14, 15, 326, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 333, 10, 15, 5, 15, 335, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 350, 10, 20, 12, 20, 14, 20, 353, 11, 20, 5, 20, 355, 10, 20, 3, 20, 5, 20, 358, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 379, 10, 20, 12, 20, 14, 20, 382, 11, 20, 3, 20, 5, 20, 385, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 403, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 416, 10, 20, 12, 20, 14, 20, 419, 11, 20, 3, 20, 3, 20, 7, 20, 423, 10, 20, 12, 20, 14, 20, 426, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 439, 10, 22, 12, 22, 14, 22, 442, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 447, 10, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 460, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 476, 10, 24, 12, 24, 14, 24, 479, 11, 24, 3, 24, 5, 24, 482, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 491, 10, 24, 12, 24, 14, 24, 494, 11, 24, 3, 24, 5, 24, 497, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 507, 10, 24, 12, 24, 14, 24, 510, 11, 24, 3, 24, 5, 24, 513, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 522, 10, 24, 12, 24, 14, 24, 525, 11, 24, 3, 24, 5, 24, 528, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 544, 10, 24, 12, 24, 14, 24, 547, 11, 24, 3, 24, 5, 24, 550, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 558, 10, 24, 12, 24, 14, 24, 561, 11, 24, 3, 24, 5, 24, 564, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 572, 10, 24, 12, 24, 14, 24, 575, 11, 24, 5, 24, 577, 10, 24, 3, 24, 5, 24, 580, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 605, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 644, 10, 24, 3, 24, 5, 24, 647, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 654, 10, 24, 12, 24, 14, 24, 657, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 663, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 668, 10, 25, 12, 25, 14, 25, 671, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 677, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 686, 10, 27, 3, 27, 5, 27, 689, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 700, 10, 28, 3, 29, 3, 29, 5, 29, 704, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 714, 10, 30, 12, 30, 14, 30, 717, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 723, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 730, 10, 31, 13, 31, 14, 31, 731, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 747, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 752, 10, 35, 12, 35, 14, 35, 755, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 763, 10, 36, 3, 37, 3, 37, 5, 37, 767, 10, 37, 3, 38, 3, 38, 5, 38, 771, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 780, 10, 41, 12, 41, 14, 41, 783, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 789, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 890, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 199, 3, 2, 2, 2, 14, 201, 3, 2, 2, 2, 16, 216, 3, 2, 2, 2, 18, 226, 3, 2, 2, 2, 20, 233, 3, 2, 2, 2, 22, 253, 3, 2, 2, 2, 24, 273, 3, 2, 2, 2, 26, 286, 3, 2, 2, 2, 28, 334, 3, 2, 2, 2, 30, 336, 3, 2, 2, 2, 32, 338, 3, 2, 2, 2, 34, 340, 3, 2, 2, 2, 36, 342, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 427, 3, 2, 2, 2, 42, 450, 3, 2, 2, 2, 44, 452, 3, 2, 2, 2, 46, 604, 3, 2, 2, 2, 48, 658, 3, 2, 2, 2, 50, 676, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 699, 3, 2, 2, 2, 56, 703, 3, 2, 2, 2, 58, 722, 3, 2, 2, 2, 60, 724, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 742, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 748, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 766, 3, 2, 2, 2, 74, 770, 3, 2, 2, 2, 76, 772, 3, 2, 2, 2, 78, 774, 3, 2, 2, 2, 80, 776, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 790, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 178, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 156, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 157, 5, 38, 20, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 179, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 179, 5, 38, 20, 2, 160, 161, 7, 63, 2, 2, 161, 162, 5, 64, 33, 2, 162, 163, 7, 7, 2, 2, 163, 171, 5, 38, 20, 2, 164, 165, 7, 10, 2, 2, 165, 166, 5, 64, 33, 2, 166, 167, 7, 7, 2, 2, 167, 168, 5, 38, 20, 2, 168, 170, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 142, 3, 2, 2, 2, 178, 158, 3, 2, 2, 2, 178, 160, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 181, 7, 62, 2, 2, 181, 183, 5, 46, 24, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 185, 3, 2, 2, 2, 184, 186, 7, 11, 2, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 11, 3, 2, 2, 2, 187, 188, 7, 12, 2, 2, 188, 200, 5, 80, 41, 2, 189, 190, 7, 12, 2, 2, 190, 191, 5, 14, 8, 2, 191, 192, 7, 62, 2, 2, 192, 193, 5, 38, 20, 2, 193, 200, 3, 2, 2, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 16, 9, 2, 198, 200, 3, 2, 2, 2, 199, 187, 3, 2, 2, 2, 199, 189, 3, 2, 2, 2, 199, 194, 3, 2, 2, 2, 200, 13, 3, 2, 2, 2, 201, 213, 5, 80, 41, 2, 202, 203, 7, 13, 2, 2, 203, 208, 5, 40, 21, 2, 204, 205, 7, 10, 2, 2, 205, 207, 5, 40, 21, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 214, 3, 2, 2, 2, 213, 202, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 15, 3, 2, 2, 2, 215, 217, 7, 15, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 223, 5, 18, 10, 2, 219, 220, 7, 15, 2, 2, 220, 222, 5, 18, 10, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 17, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 231, 5, 82, 42, 2, 227, 228, 7, 63, 2, 2, 228, 229, 5, 38, 20, 2, 229, 230, 7, 64, 2, 2, 230, 232, 3, 2, 2, 2, 231, 227, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 16, 2, 2, 234, 237, 5, 80, 41, 2, 235, 236, 7, 7, 2, 2, 236, 238, 5, 38, 20, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 7, 62, 2, 2, 240, 242, 5, 46, 24, 2, 241, 243, 7, 11, 2, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 21, 3, 2, 2, 2, 244, 254, 7, 17, 2, 2, 245, 254, 7, 18, 2, 2, 246, 247, 7, 19, 2, 2, 247, 254, 7, 17, 2, 2, 248, 249, 7, 19, 2, 2, 249, 254, 7, 18, 2, 2, 250, 254, 7, 20, 2, 2, 251, 254, 7, 21, 2, 2, 252, 254, 7, 22, 2, 2, 253, 244, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 246, 3, 2, 2, 2, 253, 248, 3, 2, 2, 2, 253, 250, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 23, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 257, 5, 32, 17, 2, 257, 258, 7, 24, 2, 2, 258, 261, 5, 66, 34, 2, 259, 260, 7, 25, 2, 2, 260, 262, 5, 36, 19, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 274, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 267, 5, 32, 17, 2, 265, 266, 7, 26, 2, 2, 266, 268, 5, 32, 17, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 270, 7, 25, 2, 2, 270, 272, 5, 36, 19, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 255, 3, 2, 2, 2, 273, 263, 3, 2, 2, 2, 274, 25, 3, 2, 2, 2, 275, 276, 7, 27, 2, 2, 276, 277, 5, 32, 17, 2, 277, 278, 7, 24, 2, 2, 278, 279, 5, 66, 34, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 284, 5, 32, 17, 2, 282, 283, 7, 26, 2, 2, 283, 285, 5, 32, 17, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 287, 3, 2, 2, 2, 286, 275, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 287, 27, 3, 2, 2, 2, 288, 289, 7, 23, 2, 2, 289, 290, 5, 30, 16, 2, 290, 291, 7, 63, 2, 2, 291, 292, 5, 32, 17, 2, 292, 293, 7, 62, 2, 2, 293, 301, 5, 46, 24, 2, 294, 295, 7, 10, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 298, 5, 46, 24, 2, 298, 300, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 305, 7, 64, 2, 2, 305, 306, 7, 24, 2, 2, 306, 309, 7, 53, 2, 2, 307, 308, 7, 25, 2, 2, 308, 310, 5, 36, 19, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 335, 3, 2, 2, 2, 311, 312, 7, 23, 2, 2, 312, 313, 5, 30, 16, 2, 313, 314, 7, 63, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 62, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 10, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 321, 5, 46, 24, 2, 321, 323, 3, 2, 2, 2, 322, 317, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 328, 7, 64, 2, 2, 328, 329, 7, 26, 2, 2, 329, 332, 5, 34, 18, 2, 330, 331, 7, 25, 2, 2, 331, 333, 5, 36, 19, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 288, 3, 2, 2, 2, 334, 311, 3, 2, 2, 2, 335, 29, 3, 2, 2, 2, 336, 337, 5, 80, 41, 2, 337, 31, 3, 2, 2, 2, 338, 339, 5, 80, 41, 2, 339, 33, 3, 2, 2, 2, 340, 341, 5, 80, 41, 2, 341, 35, 3, 2, 2, 2, 342, 343, 7, 42, 2, 2, 343, 37, 3, 2, 2, 2, 344, 345, 8, 20, 1, 2, 345, 354, 7, 63, 2, 2, 346, 351, 5, 38, 20, 2, 347, 348, 7, 10, 2, 2, 348, 350, 5, 38, 20, 2, 349, 347, 3, 2, 2, 2, 350, 353, 3, 2, 2, 2, 351, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 354, 346, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 357, 3, 2, 2, 2, 356, 358, 7, 10, 2, 2, 357, 356, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 7, 64, 2, 2, 360, 361, 7, 29, 2, 2, 361, 403, 5, 38, 20, 14, 362, 363, 7, 65, 2, 2, 363, 364, 7, 13, 2, 2, 364, 365, 5, 38, 20, 2, 365, 366, 7, 14, 2, 2, 366, 403, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 403, 3, 2, 2, 2, 372, 373, 7, 63, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 10, 2, 2, 375, 380, 5, 38, 20, 2, 376, 377, 7, 10, 2, 2, 377, 379, 5, 38, 20, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 384, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 385, 7, 10, 2, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 7, 64, 2, 2, 387, 403, 3, 2, 2, 2, 388, 390, 7, 4, 2, 2, 389, 391, 5, 42, 22, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 403, 7, 5, 2, 2, 393, 403, 7, 30, 2, 2, 394, 403, 7, 31, 2, 2, 395, 403, 7, 32, 2, 2, 396, 403, 5, 40, 21, 2, 397, 403, 5, 80, 41, 2, 398, 399, 7, 63, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 64, 2, 2, 401, 403, 3, 2, 2, 2, 402, 344, 3, 2, 2, 2, 402, 362, 3, 2, 2, 2, 402, 367, 3, 2, 2, 2, 402, 372, 3, 2, 2, 2, 402, 388, 3, 2, 2, 2, 402, 393, 3, 2, 2, 2, 402, 394, 3, 2, 2, 2, 402, 395, 3, 2, 2, 2, 402, 396, 3, 2, 2, 2, 402, 397, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 424, 3, 2, 2, 2, 404, 405, 12, 16, 2, 2, 405, 406, 7, 28, 2, 2, 406, 423, 5, 38, 20, 16, 407, 408, 12, 15, 2, 2, 408, 409, 7, 29, 2, 2, 409, 423, 5, 38, 20, 15, 410, 411, 12, 3, 2, 2, 411, 412, 7, 13, 2, 2, 412, 417, 5, 38, 20, 2, 413, 414, 7, 10, 2, 2, 414, 416, 5, 38, 20, 2, 415, 413, 3, 2, 2, 2, 416, 419, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 420, 421, 7, 14, 2, 2, 421, 423, 3, 2, 2, 2, 422, 404, 3, 2, 2, 2, 422, 407, 3, 2, 2, 2, 422, 410, 3, 2, 2, 2, 423, 426, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 39, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 428, 7, 67, 2, 2, 428, 41, 3, 2, 2, 2, 429, 430, 5, 44, 23, 2, 430, 431, 7, 7, 2, 2, 431, 432, 5, 38, 20, 2, 432, 440, 3, 2, 2, 2, 433, 434, 7, 10, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 439, 3, 2, 2, 2, 438, 433, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 446, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 447, 7, 10, 2, 2, 444, 445, 7, 15, 2, 2, 445, 447, 5, 84, 43, 2, 446, 443, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 451, 3, 2, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 84, 43, 2, 450, 429, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 43, 3, 2, 2, 2, 452, 453, 5, 82, 42, 2, 453, 45, 3, 2, 2, 2, 454, 455, 8, 24, 1, 2, 455, 605, 5, 56, 29, 2, 456, 457, 5, 72, 37, 2, 457, 459, 7, 63, 2, 2, 458, 460, 5, 68, 35, 2, 459, 458, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 64, 2, 2, 462, 605, 3, 2, 2, 2, 463, 464, 7, 52, 2, 2, 464, 605, 5, 46, 24, 27, 465, 466, 5, 80, 41, 2, 466, 467, 7, 34, 2, 2, 467, 468, 7, 62, 2, 2, 468, 469, 5, 46, 24, 23, 469, 605, 3, 2, 2, 2, 470, 471, 7, 45, 2, 2, 471, 472, 7, 4, 2, 2, 472, 477, 5, 46, 24, 2, 473, 474, 7, 10, 2, 2, 474, 476, 5, 46, 24, 2, 475, 473, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 480, 482, 7, 10, 2, 2, 481, 480, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 7, 5, 2, 2, 484, 605, 3, 2, 2, 2, 485, 486, 7, 46, 2, 2, 486, 487, 7, 4, 2, 2, 487, 492, 5, 46, 24, 2, 488, 489, 7, 10, 2, 2, 489, 491, 5, 46, 24, 2, 490, 488, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 497, 7, 10, 2, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 5, 2, 2, 499, 605, 3, 2, 2, 2, 500, 605, 5, 48, 25, 2, 501, 502, 7, 35, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 46, 24, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 46, 24, 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, 605, 3, 2, 2, 2, 516, 517, 7, 36, 2, 2, 517, 518, 7, 4, 2, 2, 518, 523, 5, 46, 24, 2, 519, 520, 7, 10, 2, 2, 520, 522, 5, 46, 24, 2, 521, 519, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 527, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 528, 7, 10, 2, 2, 527, 526, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 5, 2, 2, 530, 605, 3, 2, 2, 2, 531, 536, 5, 80, 41, 2, 532, 536, 7, 44, 2, 2, 533, 536, 7, 43, 2, 2, 534, 536, 7, 42, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 605, 3, 2, 2, 2, 537, 538, 7, 63, 2, 2, 538, 539, 5, 46, 24, 2, 539, 540, 7, 10, 2, 2, 540, 545, 5, 46, 24, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 46, 24, 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, 550, 7, 10, 2, 2, 549, 548, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 552, 7, 64, 2, 2, 552, 605, 3, 2, 2, 2, 553, 554, 7, 4, 2, 2, 554, 559, 5, 70, 36, 2, 555, 556, 7, 10, 2, 2, 556, 558, 5, 70, 36, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 564, 7, 10, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 5, 2, 2, 566, 605, 3, 2, 2, 2, 567, 576, 7, 13, 2, 2, 568, 573, 5, 46, 24, 2, 569, 570, 7, 10, 2, 2, 570, 572, 5, 46, 24, 2, 571, 569, 3, 2, 2, 2, 572, 575, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 7, 10, 2, 2, 579, 578, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 605, 7, 14, 2, 2, 582, 583, 7, 37, 2, 2, 583, 584, 7, 63, 2, 2, 584, 585, 5, 46, 24, 2, 585, 586, 7, 64, 2, 2, 586, 587, 5, 46, 24, 2, 587, 588, 7, 38, 2, 2, 588, 589, 5, 46, 24, 7, 589, 605, 3, 2, 2, 2, 590, 591, 5, 10, 6, 2, 591, 592, 5, 46, 24, 6, 592, 605, 3, 2, 2, 2, 593, 594, 5, 20, 11, 2, 594, 595, 5, 46, 24, 5, 595, 605, 3, 2, 2, 2, 596, 597, 7, 63, 2, 2, 597, 598, 5, 46, 24, 2, 598, 599, 7, 64, 2, 2, 599, 605, 3, 2, 2, 2, 600, 601, 7, 4, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 5, 2, 2, 603, 605, 3, 2, 2, 2, 604, 454, 3, 2, 2, 2, 604, 456, 3, 2, 2, 2, 604, 463, 3, 2, 2, 2, 604, 465, 3, 2, 2, 2, 604, 470, 3, 2, 2, 2, 604, 485, 3, 2, 2, 2, 604, 500, 3, 2, 2, 2, 604, 501, 3, 2, 2, 2, 604, 516, 3, 2, 2, 2, 604, 535, 3, 2, 2, 2, 604, 537, 3, 2, 2, 2, 604, 553, 3, 2, 2, 2, 604, 567, 3, 2, 2, 2, 604, 582, 3, 2, 2, 2, 604, 590, 3, 2, 2, 2, 604, 593, 3, 2, 2, 2, 604, 596, 3, 2, 2, 2, 604, 600, 3, 2, 2, 2, 605, 655, 3, 2, 2, 2, 606, 607, 12, 28, 2, 2, 607, 608, 7, 33, 2, 2, 608, 654, 5, 46, 24, 28, 609, 610, 12, 26, 2, 2, 610, 611, 9, 2, 2, 2, 611, 654, 5, 46, 24, 27, 612, 613, 12, 25, 2, 2, 613, 614, 9, 3, 2, 2, 614, 654, 5, 46, 24, 26, 615, 616, 12, 24, 2, 2, 616, 617, 9, 4, 2, 2, 617, 654, 5, 46, 24, 25, 618, 619, 12, 22, 2, 2, 619, 620, 7, 62, 2, 2, 620, 621, 5, 46, 24, 23, 621, 622, 8, 24, 1, 2, 622, 654, 3, 2, 2, 2, 623, 624, 12, 20, 2, 2, 624, 625, 7, 45, 2, 2, 625, 654, 5, 46, 24, 21, 626, 627, 12, 18, 2, 2, 627, 628, 7, 46, 2, 2, 628, 654, 5, 46, 24, 19, 629, 630, 12, 17, 2, 2, 630, 631, 7, 47, 2, 2, 631, 654, 5, 46, 24, 18, 632, 633, 12, 16, 2, 2, 633, 634, 7, 48, 2, 2, 634, 654, 5, 46, 24, 17, 635, 636, 12, 10, 2, 2, 636, 637, 7, 28, 2, 2, 637, 654, 5, 46, 24, 11, 638, 639, 12, 32, 2, 2, 639, 640, 7, 24, 2, 2, 640, 646, 5, 74, 38, 2, 641, 643, 7, 63, 2, 2, 642, 644, 5, 68, 35, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 647, 7, 64, 2, 2, 646, 641, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 654, 3, 2, 2, 2, 648, 649, 12, 29, 2, 2, 649, 650, 7, 13, 2, 2, 650, 651, 5, 46, 24, 2, 651, 652, 7, 14, 2, 2, 652, 654, 3, 2, 2, 2, 653, 606, 3, 2, 2, 2, 653, 609, 3, 2, 2, 2, 653, 612, 3, 2, 2, 2, 653, 615, 3, 2, 2, 2, 653, 618, 3, 2, 2, 2, 653, 623, 3, 2, 2, 2, 653, 626, 3, 2, 2, 2, 653, 629, 3, 2, 2, 2, 653, 632, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 638, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 47, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 50, 2, 2, 659, 660, 5, 46, 24, 2, 660, 662, 7, 4, 2, 2, 661, 663, 7, 15, 2, 2, 662, 661, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 669, 5, 50, 26, 2, 665, 666, 7, 15, 2, 2, 666, 668, 5, 50, 26, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 672, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 5, 2, 2, 673, 49, 3, 2, 2, 2, 674, 677, 5, 52, 27, 2, 675, 677, 7, 39, 2, 2, 676, 674, 3, 2, 2, 2, 676, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 679, 7, 29, 2, 2, 679, 680, 5, 46, 24, 2, 680, 51, 3, 2, 2, 2, 681, 688, 5, 82, 42, 2, 682, 685, 7, 63, 2, 2, 683, 686, 5, 82, 42, 2, 684, 686, 7, 39, 2, 2, 685, 683, 3, 2, 2, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 7, 64, 2, 2, 688, 682, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 53, 3, 2, 2, 2, 690, 691, 5, 8, 5, 2, 691, 692, 7, 2, 2, 3, 692, 700, 3, 2, 2, 2, 693, 694, 5, 46, 24, 2, 694, 695, 7, 2, 2, 3, 695, 700, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 700, 7, 2, 2, 3, 698, 700, 7, 2, 2, 3, 699, 690, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 55, 3, 2, 2, 2, 701, 704, 5, 58, 30, 2, 702, 704, 5, 60, 31, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 57, 3, 2, 2, 2, 705, 706, 5, 64, 33, 2, 706, 707, 7, 29, 2, 2, 707, 708, 5, 46, 24, 2, 708, 723, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 715, 5, 64, 33, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 64, 33, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 7, 64, 2, 2, 719, 720, 7, 29, 2, 2, 720, 721, 5, 46, 24, 2, 721, 723, 3, 2, 2, 2, 722, 705, 3, 2, 2, 2, 722, 709, 3, 2, 2, 2, 723, 59, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 729, 5, 64, 33, 2, 727, 728, 7, 10, 2, 2, 728, 730, 5, 64, 33, 2, 729, 727, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 7, 64, 2, 2, 734, 735, 7, 64, 2, 2, 735, 736, 7, 29, 2, 2, 736, 737, 5, 46, 24, 2, 737, 61, 3, 2, 2, 2, 738, 741, 7, 39, 2, 2, 739, 741, 5, 80, 41, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 743, 5, 62, 32, 2, 743, 65, 3, 2, 2, 2, 744, 747, 7, 53, 2, 2, 745, 747, 5, 80, 41, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 67, 3, 2, 2, 2, 748, 753, 5, 46, 24, 2, 749, 750, 7, 10, 2, 2, 750, 752, 5, 46, 24, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 69, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 5, 82, 42, 2, 757, 758, 7, 7, 2, 2, 758, 759, 5, 46, 24, 2, 759, 763, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 763, 5, 46, 24, 2, 762, 756, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 767, 5, 80, 41, 2, 765, 767, 9, 5, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 73, 3, 2, 2, 2, 768, 771, 5, 80, 41, 2, 769, 771, 9, 6, 2, 2, 770, 768, 3, 2, 2, 2, 770, 769, 3, 2, 2, 2, 771, 75, 3, 2, 2, 2, 772, 773, 9, 7, 2, 2, 773, 77, 3, 2, 2, 2, 774, 775, 9, 8, 2, 2, 775, 79, 3, 2, 2, 2, 776, 781, 5, 84, 43, 2, 777, 778, 7, 41, 2, 2, 778, 780, 5, 84, 43, 2, 779, 777, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 81, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 5, 80, 41, 2, 786, 787, 8, 42, 1, 2, 787, 789, 3, 2, 2, 2, 788, 784, 3, 2, 2, 2, 788, 785, 3, 2, 2, 2, 789, 83, 3, 2, 2, 2, 790, 791, 9, 9, 2, 2, 791, 85, 3, 2, 2, 2, 87, 89, 96, 105, 113, 138, 148, 151, 156, 171, 178, 182, 185, 199, 208, 213, 216, 223, 231, 237, 242, 253, 261, 267, 271, 273, 284, 286, 301, 309, 324, 332, 334, 351, 354, 357, 380, 384, 390, 402, 417, 422, 424, 440, 446, 450, 459, 477, 481, 492, 496, 508, 512, 523, 527, 535, 545, 549, 559, 563, 573, 576, 579, 604, 643, 646, 653, 655, 662, 669, 676, 685, 688, 699, 703, 715, 722, 731, 740, 746, 753, 762, 766, 770, 781, 788] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 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, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 5, 6, 155, 10, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 5, 6, 166, 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, 179, 10, 6, 12, 6, 14, 6, 182, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 189, 10, 6, 3, 6, 5, 6, 192, 10, 6, 5, 6, 194, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 208, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 215, 10, 8, 12, 8, 14, 8, 218, 11, 8, 3, 8, 3, 8, 5, 8, 222, 10, 8, 3, 9, 5, 9, 225, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 230, 10, 9, 12, 9, 14, 9, 233, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 240, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 251, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 262, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 270, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 3, 13, 3, 13, 5, 13, 280, 10, 13, 5, 13, 282, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 293, 10, 14, 5, 14, 295, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 308, 10, 15, 12, 15, 14, 15, 311, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 318, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 331, 10, 15, 12, 15, 14, 15, 334, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 341, 10, 15, 5, 15, 343, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 358, 10, 20, 12, 20, 14, 20, 361, 11, 20, 5, 20, 363, 10, 20, 3, 20, 5, 20, 366, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 387, 10, 20, 12, 20, 14, 20, 390, 11, 20, 3, 20, 5, 20, 393, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 399, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 411, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 424, 10, 20, 12, 20, 14, 20, 427, 11, 20, 3, 20, 3, 20, 7, 20, 431, 10, 20, 12, 20, 14, 20, 434, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 447, 10, 22, 12, 22, 14, 22, 450, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 5, 22, 459, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 468, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 484, 10, 24, 12, 24, 14, 24, 487, 11, 24, 3, 24, 5, 24, 490, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 499, 10, 24, 12, 24, 14, 24, 502, 11, 24, 3, 24, 5, 24, 505, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 515, 10, 24, 12, 24, 14, 24, 518, 11, 24, 3, 24, 5, 24, 521, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 530, 10, 24, 12, 24, 14, 24, 533, 11, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 544, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 552, 10, 24, 12, 24, 14, 24, 555, 11, 24, 3, 24, 5, 24, 558, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 755, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 760, 10, 35, 12, 35, 14, 35, 763, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 771, 10, 36, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 788, 10, 41, 12, 41, 14, 41, 791, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 797, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 193, 3, 2, 2, 2, 12, 207, 3, 2, 2, 2, 14, 209, 3, 2, 2, 2, 16, 224, 3, 2, 2, 2, 18, 234, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 261, 3, 2, 2, 2, 24, 281, 3, 2, 2, 2, 26, 294, 3, 2, 2, 2, 28, 342, 3, 2, 2, 2, 30, 344, 3, 2, 2, 2, 32, 346, 3, 2, 2, 2, 34, 348, 3, 2, 2, 2, 36, 350, 3, 2, 2, 2, 38, 410, 3, 2, 2, 2, 40, 435, 3, 2, 2, 2, 42, 458, 3, 2, 2, 2, 44, 460, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 754, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 770, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 796, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 154, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 7, 64, 2, 2, 154, 142, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 157, 7, 7, 2, 2, 157, 159, 5, 38, 20, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 161, 7, 62, 2, 2, 161, 163, 5, 46, 24, 2, 162, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 165, 3, 2, 2, 2, 164, 166, 7, 11, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 194, 3, 2, 2, 2, 167, 168, 5, 22, 12, 2, 168, 169, 5, 72, 37, 2, 169, 170, 7, 63, 2, 2, 170, 171, 5, 64, 33, 2, 171, 172, 7, 7, 2, 2, 172, 180, 5, 38, 20, 2, 173, 174, 7, 10, 2, 2, 174, 175, 5, 64, 33, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 180, 3, 2, 2, 2, 183, 184, 7, 64, 2, 2, 184, 185, 7, 7, 2, 2, 185, 188, 5, 38, 20, 2, 186, 187, 7, 62, 2, 2, 187, 189, 5, 46, 24, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 7, 11, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 140, 3, 2, 2, 2, 193, 167, 3, 2, 2, 2, 194, 11, 3, 2, 2, 2, 195, 196, 7, 12, 2, 2, 196, 208, 5, 80, 41, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 38, 20, 2, 201, 208, 3, 2, 2, 2, 202, 203, 7, 12, 2, 2, 203, 204, 5, 14, 8, 2, 204, 205, 7, 62, 2, 2, 205, 206, 5, 16, 9, 2, 206, 208, 3, 2, 2, 2, 207, 195, 3, 2, 2, 2, 207, 197, 3, 2, 2, 2, 207, 202, 3, 2, 2, 2, 208, 13, 3, 2, 2, 2, 209, 221, 5, 80, 41, 2, 210, 211, 7, 13, 2, 2, 211, 216, 5, 40, 21, 2, 212, 213, 7, 10, 2, 2, 213, 215, 5, 40, 21, 2, 214, 212, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 220, 7, 14, 2, 2, 220, 222, 3, 2, 2, 2, 221, 210, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 15, 3, 2, 2, 2, 223, 225, 7, 15, 2, 2, 224, 223, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 231, 5, 18, 10, 2, 227, 228, 7, 15, 2, 2, 228, 230, 5, 18, 10, 2, 229, 227, 3, 2, 2, 2, 230, 233, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 17, 3, 2, 2, 2, 233, 231, 3, 2, 2, 2, 234, 239, 5, 82, 42, 2, 235, 236, 7, 63, 2, 2, 236, 237, 5, 38, 20, 2, 237, 238, 7, 64, 2, 2, 238, 240, 3, 2, 2, 2, 239, 235, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 19, 3, 2, 2, 2, 241, 242, 7, 16, 2, 2, 242, 245, 5, 80, 41, 2, 243, 244, 7, 7, 2, 2, 244, 246, 5, 38, 20, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 62, 2, 2, 248, 250, 5, 46, 24, 2, 249, 251, 7, 11, 2, 2, 250, 249, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 21, 3, 2, 2, 2, 252, 262, 7, 17, 2, 2, 253, 262, 7, 18, 2, 2, 254, 255, 7, 19, 2, 2, 255, 262, 7, 17, 2, 2, 256, 257, 7, 19, 2, 2, 257, 262, 7, 18, 2, 2, 258, 262, 7, 20, 2, 2, 259, 262, 7, 21, 2, 2, 260, 262, 7, 22, 2, 2, 261, 252, 3, 2, 2, 2, 261, 253, 3, 2, 2, 2, 261, 254, 3, 2, 2, 2, 261, 256, 3, 2, 2, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 262, 23, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 265, 5, 32, 17, 2, 265, 266, 7, 24, 2, 2, 266, 269, 5, 66, 34, 2, 267, 268, 7, 25, 2, 2, 268, 270, 5, 36, 19, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 282, 3, 2, 2, 2, 271, 272, 7, 23, 2, 2, 272, 275, 5, 32, 17, 2, 273, 274, 7, 26, 2, 2, 274, 276, 5, 32, 17, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 278, 7, 25, 2, 2, 278, 280, 5, 36, 19, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 263, 3, 2, 2, 2, 281, 271, 3, 2, 2, 2, 282, 25, 3, 2, 2, 2, 283, 284, 7, 27, 2, 2, 284, 285, 5, 32, 17, 2, 285, 286, 7, 24, 2, 2, 286, 287, 5, 66, 34, 2, 287, 295, 3, 2, 2, 2, 288, 289, 7, 27, 2, 2, 289, 292, 5, 32, 17, 2, 290, 291, 7, 26, 2, 2, 291, 293, 5, 32, 17, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 283, 3, 2, 2, 2, 294, 288, 3, 2, 2, 2, 295, 27, 3, 2, 2, 2, 296, 297, 7, 23, 2, 2, 297, 298, 5, 30, 16, 2, 298, 299, 7, 63, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 309, 5, 46, 24, 2, 302, 303, 7, 10, 2, 2, 303, 304, 5, 32, 17, 2, 304, 305, 7, 62, 2, 2, 305, 306, 5, 46, 24, 2, 306, 308, 3, 2, 2, 2, 307, 302, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 312, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 313, 7, 64, 2, 2, 313, 314, 7, 24, 2, 2, 314, 317, 7, 53, 2, 2, 315, 316, 7, 25, 2, 2, 316, 318, 5, 36, 19, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 343, 3, 2, 2, 2, 319, 320, 7, 23, 2, 2, 320, 321, 5, 30, 16, 2, 321, 322, 7, 63, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 332, 5, 46, 24, 2, 325, 326, 7, 10, 2, 2, 326, 327, 5, 32, 17, 2, 327, 328, 7, 62, 2, 2, 328, 329, 5, 46, 24, 2, 329, 331, 3, 2, 2, 2, 330, 325, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 332, 3, 2, 2, 2, 335, 336, 7, 64, 2, 2, 336, 337, 7, 26, 2, 2, 337, 340, 5, 34, 18, 2, 338, 339, 7, 25, 2, 2, 339, 341, 5, 36, 19, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 296, 3, 2, 2, 2, 342, 319, 3, 2, 2, 2, 343, 29, 3, 2, 2, 2, 344, 345, 5, 80, 41, 2, 345, 31, 3, 2, 2, 2, 346, 347, 5, 80, 41, 2, 347, 33, 3, 2, 2, 2, 348, 349, 5, 80, 41, 2, 349, 35, 3, 2, 2, 2, 350, 351, 7, 42, 2, 2, 351, 37, 3, 2, 2, 2, 352, 353, 8, 20, 1, 2, 353, 362, 7, 63, 2, 2, 354, 359, 5, 38, 20, 2, 355, 356, 7, 10, 2, 2, 356, 358, 5, 38, 20, 2, 357, 355, 3, 2, 2, 2, 358, 361, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 362, 354, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 64, 2, 2, 368, 369, 7, 29, 2, 2, 369, 411, 5, 38, 20, 14, 370, 371, 7, 65, 2, 2, 371, 372, 7, 13, 2, 2, 372, 373, 5, 38, 20, 2, 373, 374, 7, 14, 2, 2, 374, 411, 3, 2, 2, 2, 375, 376, 7, 66, 2, 2, 376, 377, 7, 13, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 14, 2, 2, 379, 411, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 382, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 388, 5, 38, 20, 2, 384, 385, 7, 10, 2, 2, 385, 387, 5, 38, 20, 2, 386, 384, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 392, 3, 2, 2, 2, 390, 388, 3, 2, 2, 2, 391, 393, 7, 10, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 411, 3, 2, 2, 2, 396, 398, 7, 4, 2, 2, 397, 399, 5, 42, 22, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 7, 5, 2, 2, 401, 411, 7, 30, 2, 2, 402, 411, 7, 31, 2, 2, 403, 411, 7, 32, 2, 2, 404, 411, 5, 40, 21, 2, 405, 411, 5, 80, 41, 2, 406, 407, 7, 63, 2, 2, 407, 408, 5, 38, 20, 2, 408, 409, 7, 64, 2, 2, 409, 411, 3, 2, 2, 2, 410, 352, 3, 2, 2, 2, 410, 370, 3, 2, 2, 2, 410, 375, 3, 2, 2, 2, 410, 380, 3, 2, 2, 2, 410, 396, 3, 2, 2, 2, 410, 401, 3, 2, 2, 2, 410, 402, 3, 2, 2, 2, 410, 403, 3, 2, 2, 2, 410, 404, 3, 2, 2, 2, 410, 405, 3, 2, 2, 2, 410, 406, 3, 2, 2, 2, 411, 432, 3, 2, 2, 2, 412, 413, 12, 16, 2, 2, 413, 414, 7, 28, 2, 2, 414, 431, 5, 38, 20, 16, 415, 416, 12, 15, 2, 2, 416, 417, 7, 29, 2, 2, 417, 431, 5, 38, 20, 15, 418, 419, 12, 3, 2, 2, 419, 420, 7, 13, 2, 2, 420, 425, 5, 38, 20, 2, 421, 422, 7, 10, 2, 2, 422, 424, 5, 38, 20, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 14, 2, 2, 429, 431, 3, 2, 2, 2, 430, 412, 3, 2, 2, 2, 430, 415, 3, 2, 2, 2, 430, 418, 3, 2, 2, 2, 431, 434, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 39, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 436, 7, 67, 2, 2, 436, 41, 3, 2, 2, 2, 437, 438, 5, 44, 23, 2, 438, 439, 7, 7, 2, 2, 439, 440, 5, 38, 20, 2, 440, 448, 3, 2, 2, 2, 441, 442, 7, 10, 2, 2, 442, 443, 5, 44, 23, 2, 443, 444, 7, 7, 2, 2, 444, 445, 5, 38, 20, 2, 445, 447, 3, 2, 2, 2, 446, 441, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 454, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 455, 7, 10, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 84, 43, 2, 454, 451, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 3, 2, 2, 2, 456, 457, 7, 15, 2, 2, 457, 459, 5, 84, 43, 2, 458, 437, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 43, 3, 2, 2, 2, 460, 461, 5, 82, 42, 2, 461, 45, 3, 2, 2, 2, 462, 463, 8, 24, 1, 2, 463, 613, 5, 56, 29, 2, 464, 465, 5, 72, 37, 2, 465, 467, 7, 63, 2, 2, 466, 468, 5, 68, 35, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 64, 2, 2, 470, 613, 3, 2, 2, 2, 471, 472, 7, 52, 2, 2, 472, 613, 5, 46, 24, 27, 473, 474, 5, 80, 41, 2, 474, 475, 7, 34, 2, 2, 475, 476, 7, 62, 2, 2, 476, 477, 5, 46, 24, 23, 477, 613, 3, 2, 2, 2, 478, 479, 7, 45, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 46, 24, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 46, 24, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 613, 3, 2, 2, 2, 493, 494, 7, 46, 2, 2, 494, 495, 7, 4, 2, 2, 495, 500, 5, 46, 24, 2, 496, 497, 7, 10, 2, 2, 497, 499, 5, 46, 24, 2, 498, 496, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 503, 505, 7, 10, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 5, 2, 2, 507, 613, 3, 2, 2, 2, 508, 613, 5, 48, 25, 2, 509, 510, 7, 35, 2, 2, 510, 511, 7, 4, 2, 2, 511, 516, 5, 46, 24, 2, 512, 513, 7, 10, 2, 2, 513, 515, 5, 46, 24, 2, 514, 512, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 520, 3, 2, 2, 2, 518, 516, 3, 2, 2, 2, 519, 521, 7, 10, 2, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 5, 2, 2, 523, 613, 3, 2, 2, 2, 524, 525, 7, 36, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 46, 24, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 46, 24, 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, 613, 3, 2, 2, 2, 539, 544, 5, 80, 41, 2, 540, 544, 7, 44, 2, 2, 541, 544, 7, 43, 2, 2, 542, 544, 7, 42, 2, 2, 543, 539, 3, 2, 2, 2, 543, 540, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 542, 3, 2, 2, 2, 544, 613, 3, 2, 2, 2, 545, 546, 7, 63, 2, 2, 546, 547, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 553, 5, 46, 24, 2, 549, 550, 7, 10, 2, 2, 550, 552, 5, 46, 24, 2, 551, 549, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 7, 10, 2, 2, 557, 556, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 7, 64, 2, 2, 560, 613, 3, 2, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 70, 36, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 70, 36, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 464, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 473, 3, 2, 2, 2, 612, 478, 3, 2, 2, 2, 612, 493, 3, 2, 2, 2, 612, 508, 3, 2, 2, 2, 612, 509, 3, 2, 2, 2, 612, 524, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 545, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 28, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 28, 617, 618, 12, 26, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 27, 620, 621, 12, 25, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 26, 623, 624, 12, 24, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 25, 626, 627, 12, 22, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 23, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 20, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 21, 634, 635, 12, 18, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 19, 637, 638, 12, 17, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 18, 640, 641, 12, 16, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 17, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 32, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 74, 38, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 68, 35, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 29, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 82, 42, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 82, 42, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 80, 41, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 80, 41, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 67, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 69, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 82, 42, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 71, 3, 2, 2, 2, 772, 775, 5, 80, 41, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 80, 41, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 79, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 84, 43, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 81, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 84, 43, 2, 793, 794, 5, 80, 41, 2, 794, 795, 8, 42, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 83, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 85, 3, 2, 2, 2, 90, 89, 96, 105, 113, 138, 148, 151, 154, 158, 162, 165, 180, 188, 191, 193, 207, 216, 221, 224, 231, 239, 245, 250, 261, 269, 275, 279, 281, 292, 294, 309, 317, 332, 340, 342, 359, 362, 365, 388, 392, 398, 410, 425, 430, 432, 448, 454, 458, 467, 485, 489, 500, 504, 516, 520, 531, 535, 543, 553, 557, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 53294b225..b243c6b7d 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -465,134 +465,158 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.enterOuterAlt(_localctx, 1); - { - this.state = 138; - this.qualifier(); - this.state = 139; - this.normalCallName(); - this.state = 176; + this.state = 191; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: + this.enterOuterAlt(_localctx, 1); { - this.state = 140; - this.match(QuintParser.LPAREN); - this.state = 149; + this.state = 138; + this.qualifier(); + this.state = 139; + this.normalCallName(); + this.state = 152; this._errHandler.sync(this); - _la = this._input.LA(1); - if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { + switch ( this.interpreter.adaptivePredict(this._input, 7, this._ctx) ) { + case 1: { - this.state = 141; - this.parameter(); - this.state = 146; + this.state = 140; + this.match(QuintParser.LPAREN); + this.state = 149; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__7) { + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - { - this.state = 142; - this.match(QuintParser.T__7); - this.state = 143; + this.state = 141; this.parameter(); - } - } - this.state = 148; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 142; + this.match(QuintParser.T__7); + this.state = 143; + this.parameter(); + } + } + this.state = 148; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } } + + this.state = 151; + this.match(QuintParser.RPAREN); } + break; } - - this.state = 151; - this.match(QuintParser.RPAREN); - this.state = 154; + this.state = 156; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 152; + this.state = 154; this.match(QuintParser.T__4); - this.state = 153; + this.state = 155; this.type(0); } } + this.state = 160; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 158; + this.match(QuintParser.ASGN); + this.state = 159; + this.expr(0); + } + } + + this.state = 163; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__8) { + { + this.state = 162; + this.match(QuintParser.T__8); + } } - break; - case 2: - { - this.state = 156; - this.match(QuintParser.T__4); - this.state = 157; - this.type(0); } break; - case 3: + case 2: + this.enterOuterAlt(_localctx, 2); { - this.state = 158; + this.state = 165; + this.qualifier(); + this.state = 166; + this.normalCallName(); + this.state = 167; this.match(QuintParser.LPAREN); { - this.state = 159; + this.state = 168; this.parameter(); - this.state = 160; + this.state = 169; this.match(QuintParser.T__4); - this.state = 161; + this.state = 170; this.type(0); - this.state = 169; + this.state = 178; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 162; + this.state = 171; this.match(QuintParser.T__7); - this.state = 163; + this.state = 172; this.parameter(); - this.state = 164; + this.state = 173; this.match(QuintParser.T__4); - this.state = 165; + this.state = 174; this.type(0); } } - this.state = 171; + this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 172; + this.state = 181; this.match(QuintParser.RPAREN); - this.state = 173; + this.state = 182; this.match(QuintParser.T__4); - this.state = 174; + this.state = 183; this.type(0); + this.state = 186; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 184; + this.match(QuintParser.ASGN); + this.state = 185; + this.expr(0); + } } - break; - } - this.state = 180; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.ASGN) { - { - this.state = 178; - this.match(QuintParser.ASGN); - this.state = 179; - this.expr(0); - } - } - this.state = 183; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 182; - this.match(QuintParser.T__8); + this.state = 189; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__8) { + { + this.state = 188; + this.match(QuintParser.T__8); + } } - } + } + break; } } catch (re) { @@ -614,16 +638,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 197; + this.state = 205; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 185; + this.state = 193; this.match(QuintParser.T__9); - this.state = 186; + this.state = 194; this.qualId(); } break; @@ -632,13 +656,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 187; + this.state = 195; this.match(QuintParser.T__9); - this.state = 188; + this.state = 196; this.typeDefHead(); - this.state = 189; + this.state = 197; this.match(QuintParser.ASGN); - this.state = 190; + this.state = 198; this.type(0); } break; @@ -647,13 +671,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 192; + this.state = 200; this.match(QuintParser.T__9); - this.state = 193; + this.state = 201; this.typeDefHead(); - this.state = 194; + this.state = 202; this.match(QuintParser.ASGN); - this.state = 195; + this.state = 203; this.sumTypeDefinition(); } break; @@ -681,36 +705,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 199; + this.state = 207; _localctx._typeName = this.qualId(); - this.state = 211; + this.state = 219; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 200; + this.state = 208; this.match(QuintParser.T__10); - this.state = 201; + this.state = 209; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); - this.state = 206; + this.state = 214; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 202; + this.state = 210; this.match(QuintParser.T__7); - this.state = 203; + this.state = 211; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 208; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 209; + this.state = 217; this.match(QuintParser.T__11); } } @@ -739,31 +763,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 214; + this.state = 222; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 213; + this.state = 221; this.match(QuintParser.T__12); } } - this.state = 216; + this.state = 224; this.typeSumVariant(); - this.state = 221; + this.state = 229; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 217; + this.state = 225; this.match(QuintParser.T__12); - this.state = 218; + this.state = 226; this.typeSumVariant(); } } - this.state = 223; + this.state = 231; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -791,18 +815,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 224; + this.state = 232; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 229; + this.state = 237; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 225; + this.state = 233; this.match(QuintParser.LPAREN); - this.state = 226; + this.state = 234; this.type(0); - this.state = 227; + this.state = 235; this.match(QuintParser.RPAREN); } } @@ -831,32 +855,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 231; + this.state = 239; this.match(QuintParser.T__13); - this.state = 232; + this.state = 240; this.qualId(); - this.state = 235; + this.state = 243; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 233; + this.state = 241; this.match(QuintParser.T__4); - this.state = 234; + this.state = 242; this.type(0); } } - this.state = 237; + this.state = 245; this.match(QuintParser.ASGN); - this.state = 238; + this.state = 246; this.expr(0); - this.state = 240; + this.state = 248; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 239; + this.state = 247; this.match(QuintParser.T__8); } } @@ -882,13 +906,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 251; + this.state = 259; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 242; + this.state = 250; this.match(QuintParser.T__14); } break; @@ -896,7 +920,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 243; + this.state = 251; this.match(QuintParser.T__15); } break; @@ -904,9 +928,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 244; + this.state = 252; this.match(QuintParser.T__16); - this.state = 245; + this.state = 253; this.match(QuintParser.T__14); } break; @@ -914,9 +938,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 246; + this.state = 254; this.match(QuintParser.T__16); - this.state = 247; + this.state = 255; this.match(QuintParser.T__15); } break; @@ -924,7 +948,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 248; + this.state = 256; this.match(QuintParser.T__17); } break; @@ -932,7 +956,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 249; + this.state = 257; this.match(QuintParser.T__18); } break; @@ -940,7 +964,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 250; + this.state = 258; this.match(QuintParser.T__19); } break; @@ -966,28 +990,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 271; + this.state = 279; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 253; + this.state = 261; this.match(QuintParser.T__20); - this.state = 254; + this.state = 262; this.name(); - this.state = 255; + this.state = 263; this.match(QuintParser.T__21); - this.state = 256; + this.state = 264; this.identOrStar(); - this.state = 259; + this.state = 267; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 257; + this.state = 265; this.match(QuintParser.T__22); - this.state = 258; + this.state = 266; this.fromSource(); } } @@ -998,30 +1022,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 261; + this.state = 269; this.match(QuintParser.T__20); - this.state = 262; + this.state = 270; this.name(); - this.state = 265; + this.state = 273; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 263; + this.state = 271; this.match(QuintParser.T__23); - this.state = 264; + this.state = 272; this.name(); } } - this.state = 269; + this.state = 277; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 267; + this.state = 275; this.match(QuintParser.T__22); - this.state = 268; + this.state = 276; this.fromSource(); } } @@ -1050,19 +1074,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 284; + this.state = 292; 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 = 273; + this.state = 281; this.match(QuintParser.T__24); - this.state = 274; + this.state = 282; this.name(); - this.state = 275; + this.state = 283; this.match(QuintParser.T__21); - this.state = 276; + this.state = 284; this.identOrStar(); } break; @@ -1070,18 +1094,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 278; + this.state = 286; this.match(QuintParser.T__24); - this.state = 279; + this.state = 287; this.name(); - this.state = 282; + this.state = 290; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 280; + this.state = 288; this.match(QuintParser.T__23); - this.state = 281; + this.state = 289; this.name(); } } @@ -1110,60 +1134,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 332; + this.state = 340; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 286; + this.state = 294; this.match(QuintParser.T__20); - this.state = 287; + this.state = 295; this.moduleName(); - this.state = 288; + this.state = 296; this.match(QuintParser.LPAREN); { - this.state = 289; + this.state = 297; this.name(); - this.state = 290; + this.state = 298; this.match(QuintParser.ASGN); - this.state = 291; - this.expr(0); this.state = 299; + this.expr(0); + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 292; + this.state = 300; this.match(QuintParser.T__7); - this.state = 293; + this.state = 301; this.name(); - this.state = 294; + this.state = 302; this.match(QuintParser.ASGN); - this.state = 295; + this.state = 303; this.expr(0); } } - this.state = 301; + this.state = 309; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 302; + this.state = 310; this.match(QuintParser.RPAREN); - this.state = 303; + this.state = 311; this.match(QuintParser.T__21); - this.state = 304; + this.state = 312; this.match(QuintParser.MUL); - this.state = 307; + this.state = 315; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 305; + this.state = 313; this.match(QuintParser.T__22); - this.state = 306; + this.state = 314; this.fromSource(); } } @@ -1174,54 +1198,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 309; + this.state = 317; this.match(QuintParser.T__20); - this.state = 310; + this.state = 318; this.moduleName(); - this.state = 311; + this.state = 319; this.match(QuintParser.LPAREN); { - this.state = 312; + this.state = 320; this.name(); - this.state = 313; + this.state = 321; this.match(QuintParser.ASGN); - this.state = 314; - this.expr(0); this.state = 322; + this.expr(0); + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 315; + this.state = 323; this.match(QuintParser.T__7); - this.state = 316; + this.state = 324; this.name(); - this.state = 317; + this.state = 325; this.match(QuintParser.ASGN); - this.state = 318; + this.state = 326; this.expr(0); } } - this.state = 324; + this.state = 332; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 325; + this.state = 333; this.match(QuintParser.RPAREN); - this.state = 326; + this.state = 334; this.match(QuintParser.T__23); - this.state = 327; + this.state = 335; this.qualifiedName(); - this.state = 330; + this.state = 338; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 328; + this.state = 336; this.match(QuintParser.T__22); - this.state = 329; + this.state = 337; this.fromSource(); } } @@ -1251,7 +1275,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 334; + this.state = 342; this.qualId(); } } @@ -1276,7 +1300,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 336; + this.state = 344; this.qualId(); } } @@ -1301,7 +1325,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 338; + this.state = 346; this.qualId(); } } @@ -1326,7 +1350,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 340; + this.state = 348; this.match(QuintParser.STRING); } } @@ -1364,60 +1388,60 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 400; + this.state = 408; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 351; this.match(QuintParser.LPAREN); - this.state = 352; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 344; + this.state = 352; this.type(0); - this.state = 349; + this.state = 357; 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) { if (_alt === 1) { { { - this.state = 345; + this.state = 353; this.match(QuintParser.T__7); - this.state = 346; + this.state = 354; this.type(0); } } } - this.state = 351; + this.state = 359; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 355; + this.state = 363; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 354; + this.state = 362; this.match(QuintParser.T__7); } } - this.state = 357; + this.state = 365; this.match(QuintParser.RPAREN); - this.state = 358; + this.state = 366; this.match(QuintParser.T__26); - this.state = 359; + this.state = 367; this.type(12); } break; @@ -1427,13 +1451,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 360; + this.state = 368; this.match(QuintParser.SET); - this.state = 361; + this.state = 369; this.match(QuintParser.T__10); - this.state = 362; + this.state = 370; this.type(0); - this.state = 363; + this.state = 371; this.match(QuintParser.T__11); } break; @@ -1443,13 +1467,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 365; + this.state = 373; this.match(QuintParser.LIST); - this.state = 366; + this.state = 374; this.match(QuintParser.T__10); - this.state = 367; + this.state = 375; this.type(0); - this.state = 368; + this.state = 376; this.match(QuintParser.T__11); } break; @@ -1459,43 +1483,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 378; this.match(QuintParser.LPAREN); - this.state = 371; + this.state = 379; this.type(0); - this.state = 372; + this.state = 380; this.match(QuintParser.T__7); - this.state = 373; + this.state = 381; this.type(0); - this.state = 378; + this.state = 386; 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) { { { - this.state = 374; + this.state = 382; this.match(QuintParser.T__7); - this.state = 375; + this.state = 383; this.type(0); } } } - this.state = 380; + this.state = 388; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 382; + this.state = 390; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 381; + this.state = 389; this.match(QuintParser.T__7); } } - this.state = 384; + this.state = 392; this.match(QuintParser.RPAREN); } break; @@ -1505,19 +1529,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 386; + this.state = 394; this.match(QuintParser.T__1); - this.state = 388; + this.state = 396; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 387; + this.state = 395; this.row(); } } - this.state = 390; + this.state = 398; this.match(QuintParser.T__2); } break; @@ -1527,7 +1551,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 391; + this.state = 399; this.match(QuintParser.T__27); } break; @@ -1537,7 +1561,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 392; + this.state = 400; this.match(QuintParser.T__28); } break; @@ -1547,7 +1571,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 393; + this.state = 401; this.match(QuintParser.T__29); } break; @@ -1557,7 +1581,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 394; + this.state = 402; this.typeVar(); } break; @@ -1567,7 +1591,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 395; + this.state = 403; this.qualId(); } break; @@ -1577,19 +1601,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 404; this.match(QuintParser.LPAREN); - this.state = 397; + this.state = 405; this.type(0); - this.state = 398; + this.state = 406; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 422; + this.state = 430; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1597,20 +1621,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 420; + this.state = 428; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 402; + this.state = 410; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 403; + this.state = 411; this.match(QuintParser.T__25); - this.state = 404; + this.state = 412; this.type(14); } break; @@ -1619,13 +1643,13 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 405; + this.state = 413; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 406; + this.state = 414; this.match(QuintParser.T__26); - this.state = 407; + this.state = 415; this.type(13); } break; @@ -1635,34 +1659,34 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 408; + this.state = 416; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } { - this.state = 409; + this.state = 417; this.match(QuintParser.T__10); - this.state = 410; + this.state = 418; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 415; + this.state = 423; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 411; + this.state = 419; this.match(QuintParser.T__7); - this.state = 412; + this.state = 420; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 417; + this.state = 425; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 418; + this.state = 426; this.match(QuintParser.T__11); } } @@ -1670,9 +1694,9 @@ export class QuintParser extends Parser { } } } - this.state = 424; + this.state = 432; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } } } @@ -1697,7 +1721,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 425; + this.state = 433; this.match(QuintParser.LOW_ID); } } @@ -1721,7 +1745,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 448; + this.state = 456; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1729,50 +1753,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 427; + this.state = 435; this.rowLabel(); - this.state = 428; + this.state = 436; this.match(QuintParser.T__4); - this.state = 429; + this.state = 437; this.type(0); } - this.state = 438; + this.state = 446; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 431; + this.state = 439; this.match(QuintParser.T__7); - this.state = 432; + this.state = 440; this.rowLabel(); - this.state = 433; + this.state = 441; this.match(QuintParser.T__4); - this.state = 434; + this.state = 442; this.type(0); } } } - this.state = 440; + this.state = 448; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 444; + this.state = 452; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 441; + this.state = 449; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 442; + this.state = 450; this.match(QuintParser.T__12); { - this.state = 443; + this.state = 451; _localctx._rowVar = this.identifier(); } } @@ -1787,10 +1811,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 446; + this.state = 454; this.match(QuintParser.T__12); { - this.state = 447; + this.state = 455; _localctx._rowVar = this.identifier(); } } @@ -1820,7 +1844,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 450; + this.state = 458; this.simpleId("record"); } } @@ -1858,16 +1882,16 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 602; + this.state = 610; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 453; + this.state = 461; this.lambda(); } break; @@ -1877,21 +1901,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 454; + this.state = 462; this.normalCallName(); - this.state = 455; + this.state = 463; this.match(QuintParser.LPAREN); - this.state = 457; + this.state = 465; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 456; + this.state = 464; this.argList(); } } - this.state = 459; + this.state = 467; this.match(QuintParser.RPAREN); } break; @@ -1901,9 +1925,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 469; this.match(QuintParser.MINUS); - this.state = 462; + this.state = 470; this.expr(25); } break; @@ -1913,13 +1937,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 471; this.qualId(); - this.state = 464; + this.state = 472; this.match(QuintParser.T__31); - this.state = 465; + this.state = 473; this.match(QuintParser.ASGN); - this.state = 466; + this.state = 474; this.expr(21); } break; @@ -1929,41 +1953,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 468; + this.state = 476; this.match(QuintParser.AND); - this.state = 469; + this.state = 477; this.match(QuintParser.T__1); - this.state = 470; + this.state = 478; this.expr(0); - this.state = 475; + this.state = 483; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 471; + this.state = 479; this.match(QuintParser.T__7); - this.state = 472; + this.state = 480; this.expr(0); } } } - this.state = 477; + this.state = 485; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 479; + this.state = 487; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 478; + this.state = 486; this.match(QuintParser.T__7); } } - this.state = 481; + this.state = 489; this.match(QuintParser.T__2); } break; @@ -1973,41 +1997,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 483; + this.state = 491; this.match(QuintParser.OR); - this.state = 484; + this.state = 492; this.match(QuintParser.T__1); - this.state = 485; + this.state = 493; this.expr(0); - this.state = 490; + this.state = 498; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 486; + this.state = 494; this.match(QuintParser.T__7); - this.state = 487; + this.state = 495; this.expr(0); } } } - this.state = 492; + this.state = 500; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 494; + this.state = 502; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 493; + this.state = 501; this.match(QuintParser.T__7); } } - this.state = 496; + this.state = 504; this.match(QuintParser.T__2); } break; @@ -2017,7 +2041,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 498; + this.state = 506; this.matchSumExpr(); } break; @@ -2027,41 +2051,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 499; + this.state = 507; this.match(QuintParser.T__32); - this.state = 500; + this.state = 508; this.match(QuintParser.T__1); - this.state = 501; + this.state = 509; this.expr(0); - this.state = 506; + this.state = 514; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 502; + this.state = 510; this.match(QuintParser.T__7); - this.state = 503; + this.state = 511; this.expr(0); } } } - this.state = 508; + this.state = 516; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 510; + this.state = 518; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 509; + this.state = 517; this.match(QuintParser.T__7); } } - this.state = 512; + this.state = 520; this.match(QuintParser.T__2); } break; @@ -2071,41 +2095,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 514; + this.state = 522; this.match(QuintParser.T__33); - this.state = 515; + this.state = 523; this.match(QuintParser.T__1); - this.state = 516; + this.state = 524; this.expr(0); - this.state = 521; + this.state = 529; 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 = 517; + this.state = 525; this.match(QuintParser.T__7); - this.state = 518; + this.state = 526; this.expr(0); } } } - this.state = 523; + this.state = 531; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 525; + this.state = 533; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 524; + this.state = 532; this.match(QuintParser.T__7); } } - this.state = 527; + this.state = 535; this.match(QuintParser.T__2); } break; @@ -2115,31 +2139,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 533; + this.state = 541; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 529; + this.state = 537; this.qualId(); } break; case QuintParser.INT: { - this.state = 530; + this.state = 538; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 531; + this.state = 539; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 532; + this.state = 540; this.match(QuintParser.STRING); } break; @@ -2154,43 +2178,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 535; + this.state = 543; this.match(QuintParser.LPAREN); - this.state = 536; + this.state = 544; this.expr(0); - this.state = 537; + this.state = 545; this.match(QuintParser.T__7); - this.state = 538; + this.state = 546; this.expr(0); - this.state = 543; + this.state = 551; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 539; + this.state = 547; this.match(QuintParser.T__7); - this.state = 540; + this.state = 548; this.expr(0); } } } - this.state = 545; + this.state = 553; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 547; + this.state = 555; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 546; + this.state = 554; this.match(QuintParser.T__7); } } - this.state = 549; + this.state = 557; this.match(QuintParser.RPAREN); } break; @@ -2200,39 +2224,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 551; + this.state = 559; this.match(QuintParser.T__1); - this.state = 552; + this.state = 560; this.recElem(); - this.state = 557; + this.state = 565; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 553; + this.state = 561; this.match(QuintParser.T__7); - this.state = 554; + this.state = 562; this.recElem(); } } } - this.state = 559; + this.state = 567; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 561; + this.state = 569; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 560; + this.state = 568; this.match(QuintParser.T__7); } } - this.state = 563; + this.state = 571; this.match(QuintParser.T__2); } break; @@ -2242,47 +2266,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 565; + this.state = 573; this.match(QuintParser.T__10); - this.state = 574; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 566; + this.state = 574; this.expr(0); - this.state = 571; + this.state = 579; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 567; + this.state = 575; this.match(QuintParser.T__7); - this.state = 568; + this.state = 576; this.expr(0); } } } - this.state = 573; + this.state = 581; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 577; + this.state = 585; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 576; + this.state = 584; this.match(QuintParser.T__7); } } - this.state = 579; + this.state = 587; this.match(QuintParser.T__11); } break; @@ -2292,19 +2316,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 580; + this.state = 588; this.match(QuintParser.T__34); - this.state = 581; + this.state = 589; this.match(QuintParser.LPAREN); - this.state = 582; + this.state = 590; this.expr(0); - this.state = 583; + this.state = 591; this.match(QuintParser.RPAREN); - this.state = 584; + this.state = 592; this.expr(0); - this.state = 585; + this.state = 593; this.match(QuintParser.T__35); - this.state = 586; + this.state = 594; this.expr(5); } break; @@ -2314,9 +2338,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 596; this.operDef(); - this.state = 589; + this.state = 597; this.expr(4); } break; @@ -2326,9 +2350,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 591; + this.state = 599; this.nondetOperDef(); - this.state = 592; + this.state = 600; this.expr(3); } break; @@ -2338,11 +2362,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 594; + this.state = 602; this.match(QuintParser.LPAREN); - this.state = 595; + this.state = 603; this.expr(0); - this.state = 596; + this.state = 604; this.match(QuintParser.RPAREN); } break; @@ -2352,19 +2376,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 598; + this.state = 606; this.match(QuintParser.T__1); - this.state = 599; + this.state = 607; this.expr(0); - this.state = 600; + this.state = 608; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 653; + this.state = 661; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2372,20 +2396,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 651; + this.state = 659; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 604; + this.state = 612; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 605; + this.state = 613; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 606; + this.state = 614; this.expr(26); } break; @@ -2394,11 +2418,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 607; + this.state = 615; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 608; + this.state = 616; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2411,7 +2435,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 609; + this.state = 617; this.expr(25); } break; @@ -2420,11 +2444,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 610; + this.state = 618; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 611; + this.state = 619; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2437,7 +2461,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 612; + this.state = 620; this.expr(24); } break; @@ -2446,11 +2470,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 613; + this.state = 621; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 614; + this.state = 622; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2463,7 +2487,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 615; + this.state = 623; this.expr(23); } break; @@ -2472,13 +2496,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 616; + this.state = 624; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 617; + this.state = 625; this.match(QuintParser.ASGN); - this.state = 618; + this.state = 626; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2491,13 +2515,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 629; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 622; + this.state = 630; this.match(QuintParser.AND); - this.state = 623; + this.state = 631; this.expr(19); } break; @@ -2506,13 +2530,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; + this.state = 632; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 625; + this.state = 633; this.match(QuintParser.OR); - this.state = 626; + this.state = 634; this.expr(17); } break; @@ -2521,13 +2545,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 627; + this.state = 635; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 628; + this.state = 636; this.match(QuintParser.IFF); - this.state = 629; + this.state = 637; this.expr(16); } break; @@ -2536,13 +2560,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 630; + this.state = 638; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 631; + this.state = 639; this.match(QuintParser.IMPLIES); - this.state = 632; + this.state = 640; this.expr(15); } break; @@ -2551,13 +2575,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 633; + this.state = 641; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 634; + this.state = 642; this.match(QuintParser.T__25); - this.state = 635; + this.state = 643; this.expr(9); } break; @@ -2566,32 +2590,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 636; + this.state = 644; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 637; + this.state = 645; this.match(QuintParser.T__21); - this.state = 638; + this.state = 646; this.nameAfterDot(); - this.state = 644; + this.state = 652; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 639; + this.state = 647; this.match(QuintParser.LPAREN); - this.state = 641; + this.state = 649; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 640; + this.state = 648; this.argList(); } } - this.state = 643; + this.state = 651; this.match(QuintParser.RPAREN); } break; @@ -2603,24 +2627,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 646; + this.state = 654; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 647; + this.state = 655; this.match(QuintParser.T__10); - this.state = 648; + this.state = 656; this.expr(0); - this.state = 649; + this.state = 657; this.match(QuintParser.T__11); } break; } } } - this.state = 655; + this.state = 663; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } } } @@ -2646,43 +2670,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 656; + this.state = 664; this.match(QuintParser.MATCH); - this.state = 657; + this.state = 665; this.expr(0); - this.state = 658; + this.state = 666; this.match(QuintParser.T__1); - this.state = 660; + this.state = 668; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 659; + this.state = 667; this.match(QuintParser.T__12); } } - this.state = 662; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 667; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 663; + this.state = 671; this.match(QuintParser.T__12); - this.state = 664; + this.state = 672; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 669; + this.state = 677; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 670; + this.state = 678; this.match(QuintParser.T__2); } } @@ -2707,28 +2731,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 674; + this.state = 682; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 672; + this.state = 680; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 673; + this.state = 681; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 676; + this.state = 684; this.match(QuintParser.T__26); - this.state = 677; + this.state = 685; this.expr(0); } } @@ -2755,36 +2779,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 679; + this.state = 687; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 686; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 680; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 683; + this.state = 691; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 681; + this.state = 689; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 682; + this.state = 690; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 685; + this.state = 693; this.match(QuintParser.RPAREN); } } @@ -2810,15 +2834,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 697; + this.state = 705; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 72, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 688; + this.state = 696; this.declaration(); - this.state = 689; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2826,9 +2850,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 691; + this.state = 699; this.expr(0); - this.state = 692; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2836,9 +2860,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 694; + this.state = 702; this.match(QuintParser.DOCCOMMENT); - this.state = 695; + this.state = 703; this.match(QuintParser.EOF); } break; @@ -2846,7 +2870,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 696; + this.state = 704; this.match(QuintParser.EOF); } break; @@ -2871,13 +2895,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 701; + this.state = 709; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 699; + this.state = 707; this.lambdaUnsugared(); } break; @@ -2885,7 +2909,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 700; + this.state = 708; this.lambdaTupleSugar(); } break; @@ -2911,7 +2935,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 720; + this.state = 728; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2919,42 +2943,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 703; + this.state = 711; this.parameter(); - this.state = 704; + this.state = 712; this.match(QuintParser.T__26); - this.state = 705; + this.state = 713; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 707; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 708; + this.state = 716; this.parameter(); - this.state = 713; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 709; + this.state = 717; this.match(QuintParser.T__7); - this.state = 710; + this.state = 718; this.parameter(); } } - this.state = 715; + this.state = 723; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 716; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 717; + this.state = 725; this.match(QuintParser.T__26); - this.state = 718; + this.state = 726; this.expr(0); } break; @@ -2984,35 +3008,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 722; + this.state = 730; this.match(QuintParser.LPAREN); - this.state = 723; + this.state = 731; this.match(QuintParser.LPAREN); - this.state = 724; + this.state = 732; this.parameter(); - this.state = 727; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 725; + this.state = 733; this.match(QuintParser.T__7); - this.state = 726; + this.state = 734; this.parameter(); } } - this.state = 729; + this.state = 737; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 731; + this.state = 739; this.match(QuintParser.RPAREN); - this.state = 732; + this.state = 740; this.match(QuintParser.RPAREN); - this.state = 733; + this.state = 741; this.match(QuintParser.T__26); - this.state = 734; + this.state = 742; this.expr(0); } } @@ -3035,13 +3059,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 738; + this.state = 746; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 736; + this.state = 744; this.match(QuintParser.T__36); } break; @@ -3049,7 +3073,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 737; + this.state = 745; this.qualId(); } break; @@ -3078,7 +3102,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 740; + this.state = 748; this.identOrHole(); } } @@ -3101,13 +3125,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 744; + this.state = 752; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 742; + this.state = 750; this.match(QuintParser.MUL); } break; @@ -3115,7 +3139,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 743; + this.state = 751; this.qualId(); } break; @@ -3145,21 +3169,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 754; this.expr(0); - this.state = 751; + this.state = 759; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 747; + this.state = 755; this.match(QuintParser.T__7); - this.state = 748; + this.state = 756; this.expr(0); } } - this.state = 753; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3184,27 +3208,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 760; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 762; this.simpleId("record"); - this.state = 755; + this.state = 763; this.match(QuintParser.T__4); - this.state = 756; + this.state = 764; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 758; + this.state = 766; this.match(QuintParser.T__37); - this.state = 759; + this.state = 767; this.expr(0); } break; @@ -3232,14 +3256,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 764; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; + this.state = 770; this.qualId(); } break; @@ -3252,7 +3276,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 763; + this.state = 771; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3291,14 +3315,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 768; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 766; + this.state = 774; this.qualId(); } break; @@ -3308,7 +3332,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 767; + this.state = 775; _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))) { @@ -3349,7 +3373,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 778; _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); @@ -3385,7 +3409,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 772; + this.state = 780; _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); @@ -3421,25 +3445,25 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 782; this.identifier(); - this.state = 779; + this.state = 787; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 775; + this.state = 783; this.match(QuintParser.T__38); - this.state = 776; + this.state = 784; this.identifier(); } } } - this.state = 781; + this.state = 789; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } } } @@ -3462,13 +3486,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 786; + this.state = 794; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 84, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 790; this.identifier(); } break; @@ -3476,7 +3500,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 783; + this.state = 791; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3512,7 +3536,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 788; + this.state = 796; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3607,7 +3631,7 @@ 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\x03H\u0319\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\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" + @@ -3622,99 +3646,100 @@ export class QuintParser extends Parser { "\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\x8B\n\x05\x03" + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + - "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\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\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x05\x06\xB3\n\x06\x03\x06\x03\x06\x05\x06\xB7" + - "\n\x06\x03\x06\x05\x06\xBA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xC8\n" + - "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xCF\n\b\f\b\x0E\b\xD2\v\b\x03" + - "\b\x03\b\x05\b\xD6\n\b\x03\t\x05\t\xD9\n\t\x03\t\x03\t\x03\t\x07\t\xDE" + - "\n\t\f\t\x0E\t\xE1\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE8\n\n\x03" + - "\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03\r" + - "\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0106\n\r\x03\r\x03\r\x03\r\x03\r" + - "\x05\r\u010C\n\r\x03\r\x03\r\x05\r\u0110\n\r\x05\r\u0112\n\r\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u011D" + - "\n\x0E\x05\x0E\u011F\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u012C\n\x0F\f\x0F" + - "\x0E\x0F\u012F\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0136" + - "\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0143\n\x0F\f\x0F\x0E\x0F\u0146\v\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u014D\n\x0F\x05\x0F\u014F" + - "\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03\x13" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u015E\n\x14\f\x14\x0E" + - "\x14\u0161\v\x14\x05\x14\u0163\n\x14\x03\x14\x05\x14\u0166\n\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u017B\n\x14\f\x14\x0E\x14\u017E\v\x14\x03\x14\x05\x14\u0181\n" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14" + - "\u0193\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A0\n\x14\f\x14\x0E\x14\u01A3\v" + - "\x14\x03\x14\x03\x14\x07\x14\u01A7\n\x14\f\x14\x0E\x14\u01AA\v\x14\x03" + + "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x05\x06\x9B\n\x06\x03\x06\x03" + + "\x06\x05\x06\x9F\n\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x05\x06" + + "\xA6\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\xB3\n\x06\f\x06\x0E\x06\xB6\v\x06" + + "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xBD\n\x06\x03\x06\x05" + + "\x06\xC0\n\x06\x05\x06\xC2\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xD0\n" + + "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD7\n\b\f\b\x0E\b\xDA\v\b\x03" + + "\b\x03\b\x05\b\xDE\n\b\x03\t\x05\t\xE1\n\t\x03\t\x03\t\x03\t\x07\t\xE6" + + "\n\t\f\t\x0E\t\xE9\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xF0\n\n\x03" + + "\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x03\v\x05\v\xFB\n\v\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0106\n\f\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010E\n\r\x03\r\x03\r\x03\r\x03" + + "\r\x05\r\u0114\n\r\x03\r\x03\r\x05\r\u0118\n\r\x05\r\u011A\n\r\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E" + + "\u0125\n\x0E\x05\x0E\u0127\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0134\n\x0F\f" + + "\x0F\x0E\x0F\u0137\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + + "\u013E\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u014B\n\x0F\f\x0F\x0E\x0F\u014E\v" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0155\n\x0F\x05\x0F" + + "\u0157\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03" + + "\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0166\n\x14\f\x14" + + "\x0E\x14\u0169\v\x14\x05\x14\u016B\n\x14\x03\x14\x05\x14\u016E\n\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x07\x14\u0183\n\x14\f\x14\x0E\x14\u0186\v\x14\x03\x14\x05\x14\u0189" + + "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018F\n\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + + "\x14\u019B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A8\n\x14\f\x14\x0E\x14\u01AB" + + "\v\x14\x03\x14\x03\x14\x07\x14\u01AF\n\x14\f\x14\x0E\x14\u01B2\v\x14\x03" + "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u01B7\n\x16\f\x16\x0E\x16\u01BA\v\x16\x03\x16\x03" + - "\x16\x03\x16\x05\x16\u01BF\n\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01CC\n\x18" + + "\x16\x03\x16\x07\x16\u01BF\n\x16\f\x16\x0E\x16\u01C2\v\x16\x03\x16\x03" + + "\x16\x03\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x05\x16\u01CB\n\x16\x03" + + "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01D4\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01DC\n\x18\f\x18\x0E" + - "\x18\u01DF\v\x18\x03\x18\x05\x18\u01E2\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EB\n\x18\f\x18\x0E\x18\u01EE\v" + - "\x18\x03\x18\x05\x18\u01F1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x07\x18\u01FB\n\x18\f\x18\x0E\x18\u01FE\v\x18" + - "\x03\x18\x05\x18\u0201\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u020A\n\x18\f\x18\x0E\x18\u020D\v\x18\x03\x18\x05" + - "\x18\u0210\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0220" + - "\n\x18\f\x18\x0E\x18\u0223\v\x18\x03\x18\x05\x18\u0226\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u022E\n\x18\f\x18\x0E\x18" + - "\u0231\v\x18\x03\x18\x05\x18\u0234\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u023C\n\x18\f\x18\x0E\x18\u023F\v\x18\x05\x18" + - "\u0241\n\x18\x03\x18\x05\x18\u0244\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01E4\n\x18\f\x18\x0E" + + "\x18\u01E7\v\x18\x03\x18\x05\x18\u01EA\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F3\n\x18\f\x18\x0E\x18\u01F6\v" + + "\x18\x03\x18\x05\x18\u01F9\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x07\x18\u0203\n\x18\f\x18\x0E\x18\u0206\v\x18" + + "\x03\x18\x05\x18\u0209\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0212\n\x18\f\x18\x0E\x18\u0215\v\x18\x03\x18\x05" + + "\x18\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0220\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0228" + + "\n\x18\f\x18\x0E\x18\u022B\v\x18\x03\x18\x05\x18\u022E\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18" + + "\u0239\v\x18\x03\x18\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18" + + "\u0249\n\x18\x03\x18\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u025D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x18\x05\x18\u0265\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0284\n\x18\x03\x18\x05\x18" + - "\u0287\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u028E\n\x18" + - "\f\x18\x0E\x18\u0291\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0297" + - "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u029C\n\x19\f\x19\x0E\x19\u029F" + - "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02A5\n\x1A\x03\x1A\x03" + - "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02AE\n\x1B\x03\x1B" + - "\x05\x1B\u02B1\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x05\x1C\u02BC\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C0" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18" + + "\u028F\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18" + + "\f\x18\x0E\x18\u0299\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F" + + "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7" + + "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B" + + "\x05\x1B\u02B9\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8" + "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x07\x1E\u02CA\n\x1E\f\x1E\x0E\x1E\u02CD\v\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x03\x1E\x05\x1E\u02D3\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + - "\x1F\u02DA\n\x1F\r\x1F\x0E\x1F\u02DB\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + - "\x1F\x03 \x03 \x05 \u02E5\n \x03!\x03!\x03\"\x03\"\x05\"\u02EB\n\"\x03" + - "#\x03#\x03#\x07#\u02F0\n#\f#\x0E#\u02F3\v#\x03$\x03$\x03$\x03$\x03$\x03" + - "$\x05$\u02FB\n$\x03%\x03%\x05%\u02FF\n%\x03&\x03&\x05&\u0303\n&\x03\'" + - "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u030C\n)\f)\x0E)\u030F\v)\x03*\x03" + - "*\x03*\x03*\x05*\u0315\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + + "\x07\x1E\u02D2\n\x1E\f\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x05\x1E\u02DB\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + + "\x1F\u02E2\n\x1F\r\x1F\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + + "\x1F\x03 \x03 \x05 \u02ED\n \x03!\x03!\x03\"\x03\"\x05\"\u02F3\n\"\x03" + + "#\x03#\x03#\x07#\u02F8\n#\f#\x0E#\u02FB\v#\x03$\x03$\x03$\x03$\x03$\x03" + + "$\x05$\u0303\n$\x03%\x03%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u0314\n)\f)\x0E)\u0317\v)\x03*\x03" + + "*\x03*\x03*\x05*\u031D\n*\x03+\x03+\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.\x02" + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + - "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u037A\x02W\x03\x02" + + "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02W\x03\x02" + "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + - "\n\x8C\x03\x02\x02\x02\f\xC7\x03\x02\x02\x02\x0E\xC9\x03\x02\x02\x02\x10" + - "\xD8\x03\x02\x02\x02\x12\xE2\x03\x02\x02\x02\x14\xE9\x03\x02\x02\x02\x16" + - "\xFD\x03\x02\x02\x02\x18\u0111\x03\x02\x02\x02\x1A\u011E\x03\x02\x02\x02" + - "\x1C\u014E\x03\x02\x02\x02\x1E\u0150\x03\x02\x02\x02 \u0152\x03\x02\x02" + - "\x02\"\u0154\x03\x02\x02\x02$\u0156\x03\x02\x02\x02&\u0192\x03\x02\x02" + - "\x02(\u01AB\x03\x02\x02\x02*\u01C2\x03\x02\x02\x02,\u01C4\x03\x02\x02" + - "\x02.\u025C\x03\x02\x02\x020\u0292\x03\x02\x02\x022\u02A4\x03\x02\x02" + - "\x024\u02A9\x03\x02\x02\x026\u02BB\x03\x02\x02\x028\u02BF\x03\x02\x02" + - "\x02:\u02D2\x03\x02\x02\x02<\u02D4\x03\x02\x02\x02>\u02E4\x03\x02\x02" + - "\x02@\u02E6\x03\x02\x02\x02B\u02EA\x03\x02\x02\x02D\u02EC\x03\x02\x02" + - "\x02F\u02FA\x03\x02\x02\x02H\u02FE\x03\x02\x02\x02J\u0302\x03\x02\x02" + - "\x02L\u0304\x03\x02\x02\x02N\u0306\x03\x02\x02\x02P\u0308\x03\x02\x02" + - "\x02R\u0314\x03\x02\x02\x02T\u0316\x03\x02\x02\x02VX\x05\x04\x03\x02W" + - "V\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + + "\n\xC1\x03\x02\x02\x02\f\xCF\x03\x02\x02\x02\x0E\xD1\x03\x02\x02\x02\x10" + + "\xE0\x03\x02\x02\x02\x12\xEA\x03\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16" + + "\u0105\x03\x02\x02\x02\x18\u0119\x03\x02\x02\x02\x1A\u0126\x03\x02\x02" + + "\x02\x1C\u0156\x03\x02\x02\x02\x1E\u0158\x03\x02\x02\x02 \u015A\x03\x02" + + "\x02\x02\"\u015C\x03\x02\x02\x02$\u015E\x03\x02\x02\x02&\u019A\x03\x02" + + "\x02\x02(\u01B3\x03\x02\x02\x02*\u01CA\x03\x02\x02\x02,\u01CC\x03\x02" + + "\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03\x02" + + "\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03\x02" + + "\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03\x02" + + "\x02\x02@\u02EE\x03\x02\x02\x02B\u02F2\x03\x02\x02\x02D\u02F4\x03\x02" + + "\x02\x02F\u0302\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03\x02" + + "\x02\x02L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02" + + "\x02\x02R\u031C\x03\x02\x02\x02T\u031E\x03\x02\x02\x02VX\x05\x04\x03\x02" + + "WV\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + @@ -3731,299 +3756,303 @@ export class QuintParser extends Parser { "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + - "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\xB2\x05H%\x02\x8E\x97" + + "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\x9A\x05H%\x02\x8E\x97" + "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + - "\x99\x9C\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9D\x05&\x14\x02\x9C" + - "\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02\x02\x9D\xB3\x03\x02\x02\x02\x9E" + - "\x9F\x07\x07\x02\x02\x9F\xB3\x05&\x14\x02\xA0\xA1\x07?\x02\x02\xA1\xA2" + - "\x05@!\x02\xA2\xA3\x07\x07\x02\x02\xA3\xAB\x05&\x14\x02\xA4\xA5\x07\n" + - "\x02\x02\xA5\xA6\x05@!\x02\xA6\xA7\x07\x07\x02\x02\xA7\xA8\x05&\x14\x02" + - "\xA8\xAA\x03\x02\x02\x02\xA9\xA4\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02" + - "\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAE\x03\x02\x02\x02" + - "\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07@\x02\x02\xAF\xB0\x07\x07\x02\x02" + - "\xB0\xB1\x05&\x14\x02\xB1\xB3\x03\x02\x02\x02\xB2\x8E\x03\x02\x02\x02" + - "\xB2\x9E\x03\x02\x02\x02\xB2\xA0\x03\x02\x02\x02\xB2\xB3\x03\x02\x02\x02" + - "\xB3\xB6\x03\x02\x02\x02\xB4\xB5\x07>\x02\x02\xB5\xB7\x05.\x18\x02\xB6" + - "\xB4\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB9\x03\x02\x02\x02\xB8" + - "\xBA\x07\v\x02\x02\xB9\xB8\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA" + - "\v\x03\x02\x02\x02\xBB\xBC\x07\f\x02\x02\xBC\xC8\x05P)\x02\xBD\xBE\x07" + - "\f\x02\x02\xBE\xBF\x05\x0E\b\x02\xBF\xC0\x07>\x02\x02\xC0\xC1\x05&\x14" + - "\x02\xC1\xC8\x03\x02\x02\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + - "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05\x10\t\x02\xC6\xC8\x03\x02\x02\x02\xC7" + - "\xBB\x03\x02\x02\x02\xC7\xBD\x03\x02\x02\x02\xC7\xC2\x03\x02\x02\x02\xC8" + - "\r\x03\x02\x02\x02\xC9\xD5\x05P)\x02\xCA\xCB\x07\r\x02\x02\xCB\xD0\x05" + - "(\x15\x02\xCC\xCD\x07\n\x02\x02\xCD\xCF\x05(\x15\x02\xCE\xCC\x03\x02\x02" + - "\x02\xCF\xD2\x03\x02\x02\x02\xD0\xCE\x03\x02\x02\x02\xD0\xD1\x03\x02\x02" + - "\x02\xD1\xD3\x03\x02\x02\x02\xD2\xD0\x03\x02\x02\x02\xD3\xD4\x07\x0E\x02" + - "\x02\xD4\xD6\x03\x02\x02\x02\xD5\xCA\x03\x02\x02\x02\xD5\xD6\x03\x02\x02" + - "\x02\xD6\x0F\x03\x02\x02\x02\xD7\xD9\x07\x0F\x02\x02\xD8\xD7\x03\x02\x02" + - "\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\xDF\x05\x12\n" + - "\x02\xDB\xDC\x07\x0F\x02\x02\xDC\xDE\x05\x12\n\x02\xDD\xDB\x03\x02\x02" + - "\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02\x02" + - "\x02\xE0\x11\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE7\x05R*\x02" + - "\xE3\xE4\x07?\x02\x02\xE4\xE5\x05&\x14\x02\xE5\xE6\x07@\x02\x02\xE6\xE8" + - "\x03\x02\x02\x02\xE7\xE3\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\x13" + - "\x03\x02\x02\x02\xE9\xEA\x07\x10\x02\x02\xEA\xED\x05P)\x02\xEB\xEC\x07" + - "\x07\x02\x02\xEC\xEE\x05&\x14\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03" + - "\x02\x02\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\x07>\x02\x02\xF0\xF2\x05" + - ".\x18\x02\xF1\xF3\x07\v\x02\x02\xF2\xF1\x03\x02\x02\x02\xF2\xF3\x03\x02" + - "\x02\x02\xF3\x15\x03\x02\x02\x02\xF4\xFE\x07\x11\x02\x02\xF5\xFE\x07\x12" + - "\x02\x02\xF6\xF7\x07\x13\x02\x02\xF7\xFE\x07\x11\x02\x02\xF8\xF9\x07\x13" + - "\x02\x02\xF9\xFE\x07\x12\x02\x02\xFA\xFE\x07\x14\x02\x02\xFB\xFE\x07\x15" + - "\x02\x02\xFC\xFE\x07\x16\x02\x02\xFD\xF4\x03\x02\x02\x02\xFD\xF5\x03\x02" + - "\x02\x02\xFD\xF6\x03\x02\x02\x02\xFD\xF8\x03\x02\x02\x02\xFD\xFA\x03\x02" + - "\x02\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFC\x03\x02\x02\x02\xFE\x17\x03\x02" + - "\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0101\x05 \x11\x02\u0101\u0102" + - "\x07\x18\x02\x02\u0102\u0105\x05B\"\x02\u0103\u0104\x07\x19\x02\x02\u0104" + - "\u0106\x05$\x13\x02\u0105\u0103\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" + - "\x02\u0106\u0112\x03\x02\x02\x02\u0107\u0108\x07\x17\x02\x02\u0108\u010B" + - "\x05 \x11\x02\u0109\u010A\x07\x1A\x02\x02\u010A\u010C\x05 \x11\x02\u010B" + - "\u0109\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02" + - "\x02\x02\u010D\u010E\x07\x19\x02\x02\u010E\u0110\x05$\x13\x02\u010F\u010D" + - "\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0112\x03\x02\x02\x02" + - "\u0111\xFF\x03\x02\x02\x02\u0111\u0107\x03\x02\x02\x02\u0112\x19\x03\x02" + - "\x02\x02\u0113\u0114\x07\x1B\x02\x02\u0114\u0115\x05 \x11\x02\u0115\u0116" + - "\x07\x18\x02\x02\u0116\u0117\x05B\"\x02\u0117\u011F\x03\x02\x02\x02\u0118" + - "\u0119\x07\x1B\x02\x02\u0119\u011C\x05 \x11\x02\u011A\u011B\x07\x1A\x02" + - "\x02\u011B\u011D\x05 \x11\x02\u011C\u011A\x03\x02\x02\x02\u011C\u011D" + - "\x03\x02\x02\x02\u011D\u011F\x03\x02\x02\x02\u011E\u0113\x03\x02\x02\x02" + - "\u011E\u0118\x03\x02\x02\x02\u011F\x1B\x03\x02\x02\x02\u0120\u0121\x07" + - "\x17\x02\x02\u0121\u0122\x05\x1E\x10\x02\u0122\u0123\x07?\x02\x02\u0123" + - "\u0124\x05 \x11\x02\u0124\u0125\x07>\x02\x02\u0125\u012D\x05.\x18\x02" + - "\u0126\u0127\x07\n\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02" + - "\x02\u0129\u012A\x05.\x18\x02\u012A\u012C\x03\x02\x02\x02\u012B\u0126" + - "\x03\x02\x02\x02\u012C\u012F\x03\x02\x02\x02\u012D\u012B\x03\x02\x02\x02" + - "\u012D\u012E\x03\x02\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012D\x03" + - "\x02\x02\x02\u0130\u0131\x07@\x02\x02\u0131\u0132\x07\x18\x02\x02\u0132" + - "\u0135\x075\x02\x02\u0133\u0134\x07\x19\x02\x02\u0134\u0136\x05$\x13\x02" + - "\u0135\u0133\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u014F\x03" + - "\x02\x02\x02\u0137\u0138\x07\x17\x02\x02\u0138\u0139\x05\x1E\x10\x02\u0139" + - "\u013A\x07?\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C\x07>\x02\x02" + - "\u013C\u0144\x05.\x18\x02\u013D\u013E\x07\n\x02\x02\u013E\u013F\x05 \x11" + - "\x02\u013F\u0140\x07>\x02\x02\u0140\u0141\x05.\x18\x02\u0141\u0143\x03" + - "\x02\x02\x02\u0142\u013D\x03\x02\x02\x02\u0143\u0146\x03\x02\x02\x02\u0144" + - "\u0142\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02" + - "\x02\x02\u0146\u0144\x03\x02\x02\x02\u0147\u0148\x07@\x02\x02\u0148\u0149" + - "\x07\x1A\x02\x02\u0149\u014C\x05\"\x12\x02\u014A\u014B\x07\x19\x02\x02" + - "\u014B\u014D\x05$\x13\x02\u014C\u014A\x03\x02\x02\x02\u014C\u014D\x03" + - "\x02\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0120\x03\x02\x02\x02\u014E" + - "\u0137\x03\x02\x02\x02\u014F\x1D\x03\x02\x02\x02\u0150\u0151\x05P)\x02" + - "\u0151\x1F\x03\x02\x02\x02\u0152\u0153\x05P)\x02\u0153!\x03\x02\x02\x02" + - "\u0154\u0155\x05P)\x02\u0155#\x03\x02\x02\x02\u0156\u0157\x07*\x02\x02" + - "\u0157%\x03\x02\x02\x02\u0158\u0159\b\x14\x01\x02\u0159\u0162\x07?\x02" + - "\x02\u015A\u015F\x05&\x14\x02\u015B\u015C\x07\n\x02\x02\u015C\u015E\x05" + - "&\x14\x02\u015D\u015B\x03\x02\x02\x02\u015E\u0161\x03\x02\x02\x02\u015F" + - "\u015D\x03\x02\x02\x02\u015F\u0160\x03\x02\x02\x02\u0160\u0163\x03\x02" + - "\x02\x02\u0161\u015F\x03\x02\x02\x02\u0162\u015A\x03\x02\x02\x02\u0162" + - "\u0163\x03\x02\x02\x02\u0163\u0165\x03\x02\x02\x02\u0164\u0166\x07\n\x02" + - "\x02\u0165\u0164\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + - "\x03\x02\x02\x02\u0167\u0168\x07@\x02\x02\u0168\u0169\x07\x1D\x02\x02" + - "\u0169\u0193\x05&\x14\x0E\u016A\u016B\x07A\x02\x02\u016B\u016C\x07\r\x02" + - "\x02\u016C\u016D\x05&\x14\x02\u016D\u016E\x07\x0E\x02\x02\u016E\u0193" + - "\x03\x02\x02\x02\u016F\u0170\x07B\x02\x02\u0170\u0171\x07\r\x02\x02\u0171" + - "\u0172\x05&\x14\x02\u0172\u0173\x07\x0E\x02\x02\u0173\u0193\x03\x02\x02" + - "\x02\u0174\u0175\x07?\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177\x07" + - "\n\x02\x02\u0177\u017C\x05&\x14\x02\u0178\u0179\x07\n\x02\x02\u0179\u017B" + - "\x05&\x14\x02\u017A\u0178\x03\x02\x02\x02\u017B\u017E\x03\x02\x02\x02" + - "\u017C\u017A\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u0180\x03" + - "\x02\x02\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0181\x07\n\x02\x02\u0180" + - "\u017F\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02" + - "\x02\x02\u0182\u0183\x07@\x02\x02\u0183\u0193\x03\x02\x02\x02\u0184\u0186" + - "\x07\x04\x02\x02\u0185\u0187\x05*\x16\x02\u0186\u0185\x03\x02\x02\x02" + - "\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0193\x07" + - "\x05\x02\x02\u0189\u0193\x07\x1E\x02\x02\u018A\u0193\x07\x1F\x02\x02\u018B" + - "\u0193\x07 \x02\x02\u018C\u0193\x05(\x15\x02\u018D\u0193\x05P)\x02\u018E" + - "\u018F\x07?\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191\x07@\x02\x02" + - "\u0191\u0193\x03\x02\x02\x02\u0192\u0158\x03\x02\x02\x02\u0192\u016A\x03" + - "\x02\x02\x02\u0192\u016F\x03\x02\x02\x02\u0192\u0174\x03\x02\x02\x02\u0192" + - "\u0184\x03\x02\x02\x02\u0192\u0189\x03\x02\x02\x02\u0192\u018A\x03\x02" + - "\x02\x02\u0192\u018B\x03\x02\x02\x02\u0192\u018C\x03\x02\x02\x02\u0192" + - "\u018D\x03\x02\x02\x02\u0192\u018E\x03\x02\x02\x02\u0193\u01A8\x03\x02" + - "\x02\x02\u0194\u0195\f\x10\x02\x02\u0195\u0196\x07\x1C\x02\x02\u0196\u01A7" + - "\x05&\x14\x10\u0197\u0198\f\x0F\x02\x02\u0198\u0199\x07\x1D\x02\x02\u0199" + - "\u01A7\x05&\x14\x0F\u019A\u019B\f\x03\x02\x02\u019B\u019C\x07\r\x02\x02" + - "\u019C\u01A1\x05&\x14\x02\u019D\u019E\x07\n\x02\x02\u019E\u01A0\x05&\x14" + - "\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A3\x03\x02\x02\x02\u01A1\u019F" + - "\x03\x02\x02\x02\u01A1\u01A2\x03\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02" + - "\u01A3\u01A1\x03\x02\x02\x02\u01A4\u01A5\x07\x0E\x02\x02\u01A5\u01A7\x03" + - "\x02\x02\x02\u01A6\u0194\x03\x02\x02\x02\u01A6\u0197\x03\x02\x02\x02\u01A6" + - "\u019A\x03\x02\x02\x02\u01A7\u01AA\x03\x02\x02\x02\u01A8\u01A6\x03\x02" + - "\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\'\x03\x02\x02\x02\u01AA\u01A8" + - "\x03\x02\x02\x02\u01AB\u01AC\x07C\x02\x02\u01AC)\x03\x02\x02\x02\u01AD" + - "\u01AE\x05,\x17\x02\u01AE\u01AF\x07\x07\x02\x02\u01AF\u01B0\x05&\x14\x02" + - "\u01B0\u01B8\x03\x02\x02\x02\u01B1\u01B2\x07\n\x02\x02\u01B2\u01B3\x05" + - ",\x17\x02\u01B3\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01B7" + - "\x03\x02\x02\x02\u01B6\u01B1\x03\x02\x02\x02\u01B7\u01BA\x03\x02\x02\x02" + - "\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BE\x03" + - "\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02\u01BB\u01BF\x07\n\x02\x02\u01BC" + - "\u01BD\x07\x0F\x02\x02\u01BD\u01BF\x05T+\x02\u01BE\u01BB\x03\x02\x02\x02" + - "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C3\x03" + - "\x02\x02\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05T+\x02\u01C2\u01AD" + - "\x03\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3+\x03\x02\x02\x02\u01C4" + - "\u01C5\x05R*\x02\u01C5-\x03\x02\x02\x02\u01C6\u01C7\b\x18\x01\x02\u01C7" + - "\u025D\x058\x1D\x02\u01C8\u01C9\x05H%\x02\u01C9\u01CB\x07?\x02\x02\u01CA" + - "\u01CC\x05D#\x02\u01CB\u01CA\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02" + - "\u01CC\u01CD\x03\x02\x02\x02\u01CD\u01CE\x07@\x02\x02\u01CE\u025D\x03" + - "\x02\x02\x02\u01CF\u01D0\x074\x02\x02\u01D0\u025D\x05.\x18\x1B\u01D1\u01D2" + - "\x05P)\x02\u01D2\u01D3\x07\"\x02\x02\u01D3\u01D4\x07>\x02\x02\u01D4\u01D5" + - "\x05.\x18\x17\u01D5\u025D\x03\x02\x02\x02\u01D6\u01D7\x07-\x02\x02\u01D7" + - "\u01D8\x07\x04\x02\x02\u01D8\u01DD\x05.\x18\x02\u01D9\u01DA\x07\n\x02" + - "\x02\u01DA\u01DC\x05.\x18\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DF" + - "\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02" + - "\u01DE\u01E1\x03\x02\x02\x02\u01DF\u01DD\x03\x02\x02\x02\u01E0\u01E2\x07" + - "\n\x02\x02\u01E1\u01E0\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02\u01E2" + - "\u01E3\x03\x02\x02\x02\u01E3\u01E4\x07\x05\x02\x02\u01E4\u025D\x03\x02" + - "\x02\x02\u01E5\u01E6\x07.\x02\x02\u01E6\u01E7\x07\x04\x02\x02\u01E7\u01EC" + - "\x05.\x18\x02\u01E8\u01E9\x07\n\x02\x02\u01E9\u01EB\x05.\x18\x02\u01EA" + - "\u01E8\x03\x02\x02\x02\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02" + - "\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE" + - "\u01EC\x03\x02\x02\x02\u01EF\u01F1\x07\n\x02\x02\u01F0\u01EF\x03\x02\x02" + - "\x02\u01F0"; + "\x99\x9B\x07@\x02\x02\x9A\x8E\x03\x02\x02\x02\x9A\x9B\x03\x02\x02\x02" + + "\x9B\x9E\x03\x02\x02\x02\x9C\x9D\x07\x07\x02\x02\x9D\x9F\x05&\x14\x02" + + "\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA2\x03\x02\x02\x02" + + "\xA0\xA1\x07>\x02\x02\xA1\xA3\x05.\x18\x02\xA2\xA0\x03\x02\x02\x02\xA2" + + "\xA3\x03\x02\x02\x02\xA3\xA5\x03\x02\x02\x02\xA4\xA6\x07\v\x02\x02\xA5" + + "\xA4\x03\x02\x02\x02\xA5\xA6\x03\x02\x02\x02\xA6\xC2\x03\x02\x02\x02\xA7" + + "\xA8\x05\x16\f\x02\xA8\xA9\x05H%\x02\xA9\xAA\x07?\x02\x02\xAA\xAB\x05" + + "@!\x02\xAB\xAC\x07\x07\x02\x02\xAC\xB4\x05&\x14\x02\xAD\xAE\x07\n\x02" + + "\x02\xAE\xAF\x05@!\x02\xAF\xB0\x07\x07\x02\x02\xB0\xB1\x05&\x14\x02\xB1" + + "\xB3\x03\x02\x02\x02\xB2\xAD\x03\x02\x02\x02\xB3\xB6\x03\x02\x02\x02\xB4" + + "\xB2\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5\xB7\x03\x02\x02\x02\xB6" + + "\xB4\x03\x02\x02\x02\xB7\xB8\x07@\x02\x02\xB8\xB9\x07\x07\x02\x02\xB9" + + "\xBC\x05&\x14\x02\xBA\xBB\x07>\x02\x02\xBB\xBD\x05.\x18\x02\xBC\xBA\x03" + + "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\xC0\x07" + + "\v\x02\x02\xBF\xBE\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC2\x03" + + "\x02\x02\x02\xC1\x8C\x03\x02\x02\x02\xC1\xA7\x03\x02\x02\x02\xC2\v\x03" + + "\x02\x02\x02\xC3\xC4\x07\f\x02\x02\xC4\xD0\x05P)\x02\xC5\xC6\x07\f\x02" + + "\x02\xC6\xC7\x05\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05&\x14\x02\xC9" + + "\xD0\x03\x02\x02\x02\xCA\xCB\x07\f\x02\x02\xCB\xCC\x05\x0E\b\x02\xCC\xCD" + + "\x07>\x02\x02\xCD\xCE\x05\x10\t\x02\xCE\xD0\x03\x02\x02\x02\xCF\xC3\x03" + + "\x02\x02\x02\xCF\xC5\x03\x02\x02\x02\xCF\xCA\x03\x02\x02\x02\xD0\r\x03" + + "\x02\x02\x02\xD1\xDD\x05P)\x02\xD2\xD3\x07\r\x02\x02\xD3\xD8\x05(\x15" + + "\x02\xD4\xD5\x07\n\x02\x02\xD5\xD7\x05(\x15\x02\xD6\xD4\x03\x02\x02\x02" + + "\xD7\xDA\x03\x02\x02\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + + "\xD9\xDB\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02\xDB\xDC\x07\x0E\x02\x02" + + "\xDC\xDE\x03\x02\x02\x02\xDD\xD2\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + + "\xDE\x0F\x03\x02\x02\x02\xDF\xE1\x07\x0F\x02\x02\xE0\xDF\x03\x02\x02\x02" + + "\xE0\xE1\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\xE7\x05\x12\n\x02" + + "\xE3\xE4\x07\x0F\x02\x02\xE4\xE6\x05\x12\n\x02\xE5\xE3\x03\x02\x02\x02" + + "\xE6\xE9\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02" + + "\xE8\x11\x03\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEF\x05R*\x02\xEB" + + "\xEC\x07?\x02\x02\xEC\xED\x05&\x14\x02\xED\xEE\x07@\x02\x02\xEE\xF0\x03" + + "\x02\x02\x02\xEF\xEB\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\x13\x03" + + "\x02\x02\x02\xF1\xF2\x07\x10\x02\x02\xF2\xF5\x05P)\x02\xF3\xF4\x07\x07" + + "\x02\x02\xF4\xF6\x05&\x14\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF6\x03\x02" + + "\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\xF8\x07>\x02\x02\xF8\xFA\x05.\x18" + + "\x02\xF9\xFB\x07\v\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02" + + "\x02\xFB\x15\x03\x02\x02\x02\xFC\u0106\x07\x11\x02\x02\xFD\u0106\x07\x12" + + "\x02\x02\xFE\xFF\x07\x13\x02\x02\xFF\u0106\x07\x11\x02\x02\u0100\u0101" + + "\x07\x13\x02\x02\u0101\u0106\x07\x12\x02\x02\u0102\u0106\x07\x14\x02\x02" + + "\u0103\u0106\x07\x15\x02\x02\u0104\u0106\x07\x16\x02\x02\u0105\xFC\x03" + + "\x02\x02\x02\u0105\xFD\x03\x02\x02\x02\u0105\xFE\x03\x02\x02\x02\u0105" + + "\u0100\x03\x02\x02\x02\u0105\u0102\x03\x02\x02\x02\u0105\u0103\x03\x02" + + "\x02\x02\u0105\u0104\x03\x02\x02\x02\u0106\x17\x03\x02\x02\x02\u0107\u0108" + + "\x07\x17\x02\x02\u0108\u0109\x05 \x11\x02\u0109\u010A\x07\x18\x02\x02" + + "\u010A\u010D\x05B\"\x02\u010B\u010C\x07\x19\x02\x02\u010C\u010E\x05$\x13" + + "\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\u011A" + + "\x03\x02\x02\x02\u010F\u0110\x07\x17\x02\x02\u0110\u0113\x05 \x11\x02" + + "\u0111\u0112\x07\x1A\x02\x02\u0112\u0114\x05 \x11\x02\u0113\u0111\x03" + + "\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115" + + "\u0116\x07\x19\x02\x02\u0116\u0118\x05$\x13\x02\u0117\u0115\x03\x02\x02" + + "\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011A\x03\x02\x02\x02\u0119\u0107" + + "\x03\x02\x02\x02\u0119\u010F\x03\x02\x02\x02\u011A\x19\x03\x02\x02\x02" + + "\u011B\u011C\x07\x1B\x02\x02\u011C\u011D\x05 \x11\x02\u011D\u011E\x07" + + "\x18\x02\x02\u011E\u011F\x05B\"\x02\u011F\u0127\x03\x02\x02\x02\u0120" + + "\u0121\x07\x1B\x02\x02\u0121\u0124\x05 \x11\x02\u0122\u0123\x07\x1A\x02" + + "\x02\u0123\u0125\x05 \x11\x02\u0124\u0122\x03\x02\x02\x02\u0124\u0125" + + "\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126\u011B\x03\x02\x02\x02" + + "\u0126\u0120\x03\x02\x02\x02\u0127\x1B\x03\x02\x02\x02\u0128\u0129\x07" + + "\x17\x02\x02\u0129\u012A\x05\x1E\x10\x02\u012A\u012B\x07?\x02\x02\u012B" + + "\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u0135\x05.\x18\x02" + + "\u012E\u012F\x07\n\x02\x02\u012F\u0130\x05 \x11\x02\u0130\u0131\x07>\x02" + + "\x02\u0131\u0132\x05.\x18\x02\u0132\u0134\x03\x02\x02\x02\u0133\u012E" + + "\x03\x02\x02\x02\u0134\u0137\x03\x02\x02\x02\u0135\u0133\x03\x02\x02\x02" + + "\u0135\u0136\x03\x02\x02\x02\u0136\u0138\x03\x02\x02\x02\u0137\u0135\x03" + + "\x02\x02\x02\u0138\u0139\x07@\x02\x02\u0139\u013A\x07\x18\x02\x02\u013A" + + "\u013D\x075\x02\x02\u013B\u013C\x07\x19\x02\x02\u013C\u013E\x05$\x13\x02" + + "\u013D\u013B\x03\x02\x02\x02\u013D\u013E\x03\x02\x02\x02\u013E\u0157\x03" + + "\x02\x02\x02\u013F\u0140\x07\x17\x02\x02\u0140\u0141\x05\x1E\x10\x02\u0141" + + "\u0142\x07?\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02\x02" + + "\u0144\u014C\x05.\x18\x02\u0145\u0146\x07\n\x02\x02\u0146\u0147\x05 \x11" + + "\x02\u0147\u0148\x07>\x02\x02\u0148\u0149\x05.\x18\x02\u0149\u014B\x03" + + "\x02\x02\x02\u014A\u0145\x03\x02\x02\x02\u014B\u014E\x03\x02\x02\x02\u014C" + + "\u014A\x03\x02\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u014F\x03\x02" + + "\x02\x02\u014E\u014C\x03\x02\x02\x02\u014F\u0150\x07@\x02\x02\u0150\u0151" + + "\x07\x1A\x02\x02\u0151\u0154\x05\"\x12\x02\u0152\u0153\x07\x19\x02\x02" + + "\u0153\u0155\x05$\x13\x02\u0154\u0152\x03\x02\x02\x02\u0154\u0155\x03" + + "\x02\x02\x02\u0155\u0157\x03\x02\x02\x02\u0156\u0128\x03\x02\x02\x02\u0156" + + "\u013F\x03\x02\x02\x02\u0157\x1D\x03\x02\x02\x02\u0158\u0159\x05P)\x02" + + "\u0159\x1F\x03\x02\x02\x02\u015A\u015B\x05P)\x02\u015B!\x03\x02\x02\x02" + + "\u015C\u015D\x05P)\x02\u015D#\x03\x02\x02\x02\u015E\u015F\x07*\x02\x02" + + "\u015F%\x03\x02\x02\x02\u0160\u0161\b\x14\x01\x02\u0161\u016A\x07?\x02" + + "\x02\u0162\u0167\x05&\x14\x02\u0163\u0164\x07\n\x02\x02\u0164\u0166\x05" + + "&\x14\x02\u0165\u0163\x03\x02\x02\x02\u0166\u0169\x03\x02\x02\x02\u0167" + + "\u0165\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016B\x03\x02" + + "\x02\x02\u0169\u0167\x03\x02\x02\x02\u016A\u0162\x03\x02\x02\x02\u016A" + + "\u016B\x03\x02\x02\x02\u016B\u016D\x03\x02\x02\x02\u016C\u016E\x07\n\x02" + + "\x02\u016D\u016C\x03\x02\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u016F" + + "\x03\x02\x02\x02\u016F\u0170\x07@\x02\x02\u0170\u0171\x07\x1D\x02\x02" + + "\u0171\u019B\x05&\x14\x0E\u0172\u0173\x07A\x02\x02\u0173\u0174\x07\r\x02" + + "\x02\u0174\u0175\x05&\x14\x02\u0175\u0176\x07\x0E\x02\x02\u0176\u019B" + + "\x03\x02\x02\x02\u0177\u0178\x07B\x02\x02\u0178\u0179\x07\r\x02\x02\u0179" + + "\u017A\x05&\x14\x02\u017A\u017B\x07\x0E\x02\x02\u017B\u019B\x03\x02\x02" + + "\x02\u017C\u017D\x07?\x02\x02\u017D\u017E\x05&\x14\x02\u017E\u017F\x07" + + "\n\x02\x02\u017F\u0184\x05&\x14\x02\u0180\u0181\x07\n\x02\x02\u0181\u0183" + + "\x05&\x14\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0186\x03\x02\x02\x02" + + "\u0184\u0182\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0188\x03" + + "\x02\x02\x02\u0186\u0184\x03\x02\x02\x02\u0187\u0189\x07\n\x02\x02\u0188" + + "\u0187\x03\x02\x02\x02\u0188\u0189\x03\x02\x02\x02\u0189\u018A\x03\x02" + + "\x02\x02\u018A\u018B\x07@\x02\x02\u018B\u019B\x03\x02\x02\x02\u018C\u018E" + + "\x07\x04\x02\x02\u018D\u018F\x05*\x16\x02\u018E\u018D\x03\x02\x02\x02" + + "\u018E\u018F\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x07" + + "\x05\x02\x02\u0191\u019B\x07\x1E\x02\x02\u0192\u019B\x07\x1F\x02\x02\u0193" + + "\u019B\x07 \x02\x02\u0194\u019B\x05(\x15\x02\u0195\u019B\x05P)\x02\u0196" + + "\u0197\x07?\x02\x02\u0197\u0198\x05&\x14\x02\u0198\u0199\x07@\x02\x02" + + "\u0199\u019B\x03\x02\x02\x02\u019A\u0160\x03\x02\x02\x02\u019A\u0172\x03" + + "\x02\x02\x02\u019A\u0177\x03\x02\x02\x02\u019A\u017C\x03\x02\x02\x02\u019A" + + "\u018C\x03\x02\x02\x02\u019A\u0191\x03\x02\x02\x02\u019A\u0192\x03\x02" + + "\x02\x02\u019A\u0193\x03\x02\x02\x02\u019A\u0194\x03\x02\x02\x02\u019A" + + "\u0195\x03\x02\x02\x02\u019A\u0196\x03\x02\x02\x02\u019B\u01B0\x03\x02" + + "\x02\x02\u019C\u019D\f\x10\x02\x02\u019D\u019E\x07\x1C\x02\x02\u019E\u01AF" + + "\x05&\x14\x10\u019F\u01A0\f\x0F\x02\x02\u01A0\u01A1\x07\x1D\x02\x02\u01A1" + + "\u01AF\x05&\x14\x0F\u01A2\u01A3\f\x03\x02\x02\u01A3\u01A4\x07\r\x02\x02" + + "\u01A4\u01A9\x05&\x14\x02\u01A5\u01A6\x07\n\x02\x02\u01A6\u01A8\x05&\x14" + + "\x02\u01A7\u01A5\x03\x02\x02\x02\u01A8\u01AB\x03\x02\x02\x02\u01A9\u01A7" + + "\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02" + + "\u01AB\u01A9\x03\x02\x02\x02\u01AC\u01AD\x07\x0E\x02\x02\u01AD\u01AF\x03" + + "\x02\x02\x02\u01AE\u019C\x03\x02\x02\x02\u01AE\u019F\x03\x02\x02\x02\u01AE" + + "\u01A2\x03\x02\x02\x02\u01AF\u01B2\x03\x02\x02\x02\u01B0\u01AE\x03\x02" + + "\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\'\x03\x02\x02\x02\u01B2\u01B0" + + "\x03\x02\x02\x02\u01B3\u01B4\x07C\x02\x02\u01B4)\x03\x02\x02\x02\u01B5" + + "\u01B6\x05,\x17\x02\u01B6\u01B7\x07\x07\x02\x02\u01B7\u01B8\x05&\x14\x02" + + "\u01B8\u01C0\x03\x02\x02\x02\u01B9\u01BA\x07\n\x02\x02\u01BA\u01BB\x05" + + ",\x17\x02\u01BB\u01BC\x07\x07\x02\x02\u01BC\u01BD\x05&\x14\x02\u01BD\u01BF" + + "\x03\x02\x02\x02\u01BE\u01B9\x03\x02\x02\x02\u01BF\u01C2\x03\x02\x02\x02" + + "\u01C0\u01BE\x03\x02\x02\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1\u01C6\x03" + + "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3\u01C7\x07\n\x02\x02\u01C4" + + "\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05T+\x02\u01C6\u01C3\x03\x02\x02\x02" + + "\u01C6\u01C4\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CB\x03" + + "\x02\x02\x02\u01C8\u01C9\x07\x0F\x02\x02\u01C9\u01CB\x05T+\x02\u01CA\u01B5" + + "\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB+\x03\x02\x02\x02\u01CC" + + "\u01CD\x05R*\x02\u01CD-\x03\x02\x02\x02\u01CE\u01CF\b\x18\x01\x02\u01CF" + + "\u0265\x058\x1D\x02\u01D0\u01D1\x05H%\x02\u01D1\u01D3\x07?\x02\x02\u01D2" + + "\u01D4\x05D#\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3\u01D4\x03\x02\x02\x02" + + "\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D6\x07@\x02\x02\u01D6\u0265\x03" + + "\x02\x02\x02\u01D7\u01D8\x074\x02\x02\u01D8\u0265\x05.\x18\x1B\u01D9\u01DA" + + "\x05P)\x02\u01DA\u01DB\x07\"\x02\x02\u01DB\u01DC\x07>\x02\x02\u01DC\u01DD" + + "\x05.\x18\x17\u01DD\u0265\x03\x02\x02\x02\u01DE\u01DF\x07-\x02\x02\u01DF" + + "\u01E0\x07\x04\x02\x02\u01E0\u01E5\x05.\x18\x02\u01E1\u01E2\x07\n\x02" + + "\x02\u01E2\u01E4\x05.\x18\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7" + + "\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02" + + "\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07" + + "\n\x02\x02\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA" + + "\u01EB\x03\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0265\x03\x02" + + "\x02\x02\u01ED\u01EE\x07.\x02\x02"; private static readonly _serializedATNSegment1: string = - "\u01F1\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F3\x07\x05" + - "\x02\x02\u01F3\u025D\x03\x02\x02\x02\u01F4\u025D\x050\x19\x02\u01F5\u01F6" + - "\x07#\x02\x02\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x05.\x18\x02\u01F8" + - "\u01F9\x07\n\x02\x02\u01F9\u01FB\x05.\x18\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" + - "\u025D\x03\x02\x02\x02\u0204\u0205\x07$\x02\x02\u0205\u0206\x07\x04\x02" + - "\x02\u0206\u020B\x05.\x18\x02\u0207\u0208\x07\n\x02\x02\u0208\u020A\x05" + - ".\x18\x02\u0209\u0207\x03\x02\x02\x02\u020A\u020D\x03\x02\x02\x02\u020B" + - "\u0209\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x03\x02" + - "\x02\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0210\x07\n\x02\x02\u020F\u020E" + - "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02" + - "\u0211\u0212\x07\x05\x02\x02\u0212\u025D\x03\x02\x02\x02\u0213\u0218\x05" + - "P)\x02\u0214\u0218\x07,\x02\x02\u0215\u0218\x07+\x02\x02\u0216\u0218\x07" + - "*\x02\x02\u0217\u0213\x03\x02\x02\x02\u0217\u0214\x03\x02\x02\x02\u0217" + - "\u0215\x03\x02\x02\x02\u0217\u0216\x03\x02\x02\x02\u0218\u025D\x03\x02" + - "\x02\x02\u0219\u021A\x07?\x02\x02\u021A\u021B\x05.\x18\x02\u021B\u021C" + - "\x07\n\x02\x02\u021C\u0221\x05.\x18\x02\u021D\u021E\x07\n\x02\x02\u021E" + - "\u0220\x05.\x18\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\u0226\x07\n\x02\x02" + - "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + - "\x02\x02\x02\u0227\u0228\x07@\x02\x02\u0228\u025D\x03\x02\x02\x02\u0229" + - "\u022A\x07\x04\x02\x02\u022A\u022F\x05F$\x02\u022B\u022C\x07\n\x02\x02" + - "\u022C\u022E\x05F$\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02" + - "\x02\x02\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230" + - "\u0233\x03\x02\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0234\x07\n\x02" + - "\x02\u0233\u0232\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0235" + - "\x03\x02\x02\x02\u0235\u0236\x07\x05\x02\x02\u0236\u025D\x03\x02\x02\x02" + - "\u0237\u0240\x07\r\x02\x02\u0238\u023D\x05.\x18\x02\u0239\u023A\x07\n" + - "\x02\x02\u023A\u023C\x05.\x18\x02\u023B\u0239\x03\x02\x02\x02\u023C\u023F" + - "\x03\x02\x02\x02\u023D\u023B\x03\x02\x02\x02\u023D\u023E\x03\x02\x02\x02" + - "\u023E\u0241\x03\x02\x02\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0238\x03" + - "\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0243\x03\x02\x02\x02\u0242" + - "\u0244\x07\n\x02\x02\u0243\u0242\x03\x02\x02\x02\u0243\u0244\x03\x02\x02" + - "\x02\u0244\u0245\x03\x02\x02\x02\u0245\u025D\x07\x0E\x02\x02\u0246\u0247" + - "\x07%\x02\x02\u0247\u0248\x07?\x02\x02\u0248\u0249\x05.\x18\x02\u0249" + - "\u024A\x07@\x02\x02\u024A\u024B\x05.\x18\x02\u024B\u024C\x07&\x02\x02" + - "\u024C\u024D\x05.\x18\x07\u024D\u025D\x03\x02\x02\x02\u024E\u024F\x05" + - "\n\x06\x02\u024F\u0250\x05.\x18\x06\u0250\u025D\x03\x02\x02\x02\u0251" + - "\u0252\x05\x14\v\x02\u0252\u0253\x05.\x18\x05\u0253\u025D\x03\x02\x02" + - "\x02\u0254\u0255\x07?\x02\x02\u0255\u0256\x05.\x18\x02\u0256\u0257\x07" + - "@\x02\x02\u0257\u025D\x03\x02\x02\x02\u0258\u0259\x07\x04\x02\x02\u0259" + - "\u025A\x05.\x18\x02\u025A\u025B\x07\x05\x02\x02\u025B\u025D\x03\x02\x02" + - "\x02\u025C\u01C6\x03\x02\x02\x02\u025C\u01C8\x03\x02\x02\x02\u025C\u01CF" + - "\x03\x02\x02\x02\u025C\u01D1\x03\x02\x02\x02\u025C\u01D6\x03\x02\x02\x02" + - "\u025C\u01E5\x03\x02\x02\x02\u025C\u01F4\x03\x02\x02\x02\u025C\u01F5\x03" + - "\x02\x02\x02\u025C\u0204\x03\x02\x02\x02\u025C\u0217\x03\x02\x02\x02\u025C" + - "\u0219\x03\x02\x02\x02\u025C\u0229\x03\x02\x02\x02\u025C\u0237\x03\x02" + - "\x02\x02\u025C\u0246\x03\x02\x02\x02\u025C\u024E\x03\x02\x02\x02\u025C" + - "\u0251\x03\x02\x02\x02\u025C\u0254\x03\x02\x02\x02\u025C\u0258\x03\x02" + - "\x02\x02\u025D\u028F\x03\x02\x02\x02\u025E\u025F\f\x1C\x02\x02\u025F\u0260" + - "\x07!\x02\x02\u0260\u028E\x05.\x18\x1C\u0261\u0262\f\x1A\x02\x02\u0262" + - "\u0263\t\x02\x02\x02\u0263\u028E\x05.\x18\x1B\u0264\u0265\f\x19\x02\x02" + - "\u0265\u0266\t\x03\x02\x02\u0266\u028E\x05.\x18\x1A\u0267\u0268\f\x18" + - "\x02\x02\u0268\u0269\t\x04\x02\x02\u0269\u028E\x05.\x18\x19\u026A\u026B" + - "\f\x16\x02\x02\u026B\u026C\x07>\x02\x02\u026C\u026D\x05.\x18\x17\u026D" + - "\u026E\b\x18\x01\x02\u026E\u028E\x03\x02\x02\x02\u026F\u0270\f\x14\x02" + - "\x02\u0270\u0271\x07-\x02\x02\u0271\u028E\x05.\x18\x15\u0272\u0273\f\x12" + - "\x02\x02\u0273\u0274\x07.\x02\x02\u0274\u028E\x05.\x18\x13\u0275\u0276" + - "\f\x11\x02\x02\u0276\u0277\x07/\x02\x02\u0277\u028E\x05.\x18\x12\u0278" + - "\u0279\f\x10\x02\x02\u0279\u027A\x070\x02\x02\u027A\u028E\x05.\x18\x11" + - "\u027B\u027C\f\n\x02\x02\u027C\u027D\x07\x1C\x02\x02\u027D\u028E\x05." + - "\x18\v\u027E\u027F\f \x02\x02\u027F\u0280\x07\x18\x02\x02\u0280\u0286" + - "\x05J&\x02\u0281\u0283\x07?\x02\x02\u0282\u0284\x05D#\x02\u0283\u0282" + - "\x03\x02\x02\x02\u0283\u0284\x03\x02\x02\x02\u0284\u0285\x03\x02\x02\x02" + - "\u0285\u0287\x07@\x02\x02\u0286\u0281\x03\x02\x02\x02\u0286\u0287\x03" + - "\x02\x02\x02\u0287\u028E\x03\x02\x02\x02\u0288\u0289\f\x1D\x02\x02\u0289" + - "\u028A\x07\r\x02\x02\u028A\u028B\x05.\x18\x02\u028B\u028C\x07\x0E\x02" + - "\x02\u028C\u028E\x03\x02\x02\x02\u028D\u025E\x03\x02\x02\x02\u028D\u0261" + - "\x03\x02\x02\x02\u028D\u0264\x03\x02\x02\x02\u028D\u0267\x03\x02\x02\x02" + - "\u028D\u026A\x03\x02\x02\x02\u028D\u026F\x03\x02\x02\x02\u028D\u0272\x03" + - "\x02\x02\x02\u028D\u0275\x03\x02\x02\x02\u028D\u0278\x03\x02\x02\x02\u028D" + - "\u027B\x03\x02\x02\x02\u028D\u027E\x03\x02\x02\x02\u028D\u0288\x03\x02" + - "\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F\u028D\x03\x02\x02\x02\u028F" + - "\u0290\x03\x02\x02\x02\u0290/\x03\x02\x02\x02\u0291\u028F\x03\x02\x02" + - "\x02\u0292\u0293\x072\x02\x02\u0293\u0294\x05.\x18\x02\u0294\u0296\x07" + - "\x04\x02\x02\u0295\u0297\x07\x0F\x02\x02\u0296\u0295\x03\x02\x02\x02\u0296" + - "\u0297\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298\u029D\x052\x1A" + - "\x02\u0299\u029A\x07\x0F\x02\x02\u029A\u029C\x052\x1A\x02\u029B\u0299" + - "\x03\x02\x02\x02\u029C\u029F\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02" + - "\u029D\u029E\x03\x02\x02\x02\u029E\u02A0\x03\x02\x02\x02\u029F\u029D\x03" + - "\x02\x02\x02\u02A0\u02A1\x07\x05\x02\x02\u02A11\x03\x02\x02\x02\u02A2" + - "\u02A5\x054\x1B\x02\u02A3\u02A5\x07\'\x02\x02\u02A4\u02A2\x03\x02\x02" + - "\x02\u02A4\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + - "\x07\x1D\x02\x02\u02A7\u02A8\x05.\x18\x02\u02A83\x03\x02\x02\x02\u02A9" + - "\u02B0\x05R*\x02\u02AA\u02AD\x07?\x02\x02\u02AB\u02AE\x05R*\x02\u02AC" + - "\u02AE\x07\'\x02\x02\u02AD\u02AB\x03\x02\x02\x02\u02AD\u02AC\x03\x02\x02" + - "\x02\u02AE\u02AF\x03\x02\x02\x02\u02AF\u02B1\x07@\x02\x02\u02B0\u02AA" + - "\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B15\x03\x02\x02\x02\u02B2" + - "\u02B3\x05\b\x05\x02\u02B3\u02B4\x07\x02\x02\x03\u02B4\u02BC\x03\x02\x02" + - "\x02\u02B5\u02B6\x05.\x18\x02\u02B6\u02B7\x07\x02\x02\x03\u02B7\u02BC" + - "\x03\x02\x02\x02\u02B8\u02B9\x07E\x02\x02\u02B9\u02BC\x07\x02\x02\x03" + - "\u02BA\u02BC\x07\x02\x02\x03\u02BB\u02B2\x03\x02\x02\x02\u02BB\u02B5\x03" + - "\x02\x02\x02\u02BB\u02B8\x03\x02\x02\x02\u02BB\u02BA\x03\x02\x02\x02\u02BC" + - "7\x03\x02\x02\x02\u02BD\u02C0\x05:\x1E\x02\u02BE\u02C0\x05<\x1F\x02\u02BF" + - "\u02BD\x03\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C09\x03\x02\x02" + - "\x02\u02C1\u02C2\x05@!\x02\u02C2\u02C3\x07\x1D\x02\x02\u02C3\u02C4\x05" + - ".\x18\x02\u02C4\u02D3\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02\u02C6\u02CB" + - "\x05@!\x02\u02C7\u02C8\x07\n\x02\x02\u02C8\u02CA\x05@!\x02\u02C9\u02C7" + - "\x03\x02\x02\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02" + - "\u02CB\u02CC\x03\x02\x02\x02\u02CC\u02CE\x03\x02\x02\x02\u02CD\u02CB\x03" + - "\x02\x02\x02\u02CE\u02CF\x07@\x02\x02\u02CF\u02D0\x07\x1D\x02\x02\u02D0" + - "\u02D1\x05.\x18\x02\u02D1\u02D3\x03\x02\x02\x02\u02D2\u02C1\x03\x02\x02" + - "\x02\u02D2\u02C5\x03\x02\x02\x02\u02D3;\x03\x02\x02\x02\u02D4\u02D5\x07" + - "?\x02\x02\u02D5\u02D6\x07?\x02\x02\u02D6\u02D9\x05@!\x02\u02D7\u02D8\x07" + - "\n\x02\x02\u02D8\u02DA\x05@!\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB" + - "\x03\x02\x02\x02\u02DB\u02D9\x03\x02\x02\x02\u02DB\u02DC\x03\x02\x02\x02" + - "\u02DC\u02DD\x03\x02\x02\x02\u02DD\u02DE\x07@\x02\x02\u02DE\u02DF\x07" + - "@\x02\x02\u02DF\u02E0\x07\x1D\x02\x02\u02E0\u02E1\x05.\x18\x02\u02E1=" + - "\x03\x02\x02\x02\u02E2\u02E5\x07\'\x02\x02\u02E3\u02E5\x05P)\x02\u02E4" + - "\u02E2\x03\x02\x02\x02\u02E4\u02E3\x03\x02\x02\x02\u02E5?\x03\x02\x02" + - "\x02\u02E6\u02E7\x05> \x02\u02E7A\x03\x02\x02\x02\u02E8\u02EB\x075\x02" + - "\x02\u02E9\u02EB\x05P)\x02\u02EA\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03" + - "\x02\x02\x02\u02EBC\x03\x02\x02\x02\u02EC\u02F1\x05.\x18\x02\u02ED\u02EE" + - "\x07\n\x02\x02\u02EE\u02F0\x05.\x18\x02\u02EF\u02ED\x03\x02\x02\x02\u02F0" + - "\u02F3\x03\x02\x02\x02\u02F1\u02EF\x03\x02\x02\x02\u02F1\u02F2\x03\x02" + - "\x02\x02\u02F2E\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F4\u02F5" + - "\x05R*\x02\u02F5\u02F6\x07\x07\x02\x02\u02F6\u02F7\x05.\x18\x02\u02F7" + - "\u02FB\x03\x02\x02\x02\u02F8\u02F9\x07(\x02\x02\u02F9\u02FB\x05.\x18\x02" + - "\u02FA\u02F4\x03\x02\x02\x02\u02FA\u02F8\x03\x02\x02\x02\u02FBG\x03\x02" + - "\x02\x02\u02FC\u02FF\x05P)\x02\u02FD\u02FF\t\x05\x02\x02\u02FE\u02FC\x03" + - "\x02\x02\x02\u02FE\u02FD\x03\x02\x02\x02\u02FFI\x03\x02\x02\x02\u0300" + - "\u0303\x05P)\x02\u0301\u0303\t\x06\x02\x02\u0302\u0300\x03\x02\x02\x02" + - "\u0302\u0301\x03\x02\x02\x02\u0303K\x03\x02\x02\x02\u0304\u0305\t\x07" + - "\x02\x02\u0305M\x03\x02\x02\x02\u0306\u0307\t\b\x02\x02\u0307O\x03\x02" + - "\x02\x02\u0308\u030D\x05T+\x02\u0309\u030A\x07)\x02\x02\u030A\u030C\x05" + - "T+\x02\u030B\u0309\x03\x02\x02\x02\u030C\u030F\x03\x02\x02\x02\u030D\u030B" + - "\x03\x02\x02\x02\u030D\u030E\x03\x02\x02\x02\u030EQ\x03\x02\x02\x02\u030F" + - "\u030D\x03\x02\x02\x02\u0310\u0315\x05T+\x02\u0311\u0312\x05P)\x02\u0312" + - "\u0313\b*\x01\x02\u0313\u0315\x03\x02\x02\x02\u0314\u0310\x03\x02\x02" + - "\x02\u0314\u0311\x03\x02\x02\x02\u0315S\x03\x02\x02\x02\u0316\u0317\t" + - "\t\x02\x02\u0317U\x03\x02\x02\x02WY`iq\x8A\x94\x97\x9C\xAB\xB2\xB6\xB9" + - "\xC7\xD0\xD5\xD8\xDF\xE7\xED\xF2\xFD\u0105\u010B\u010F\u0111\u011C\u011E" + - "\u012D\u0135\u0144\u014C\u014E\u015F\u0162\u0165\u017C\u0180\u0186\u0192" + - "\u01A1\u01A6\u01A8\u01B8\u01BE\u01C2\u01CB\u01DD\u01E1\u01EC\u01F0\u01FC" + - "\u0200\u020B\u020F\u0217\u0221\u0225\u022F\u0233\u023D\u0240\u0243\u025C" + - "\u0283\u0286\u028D\u028F\u0296\u029D\u02A4\u02AD\u02B0\u02BB\u02BF\u02CB" + - "\u02D2\u02DB\u02E4\u02EA\u02F1\u02FA\u02FE\u0302\u030D\u0314"; + "\u01EE\u01EF\x07\x04\x02\x02\u01EF\u01F4\x05.\x18\x02\u01F0\u01F1\x07" + + "\n\x02\x02\u01F1\u01F3\x05.\x18\x02\u01F2\u01F0\x03\x02\x02\x02\u01F3" + + "\u01F6\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F4\u01F5\x03\x02" + + "\x02\x02\u01F5\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F7" + + "\u01F9\x07\n\x02\x02\u01F8\u01F7\x03\x02\x02\x02\u01F8\u01F9\x03\x02\x02" + + "\x02\u01F9\u01FA\x03\x02\x02\x02\u01FA\u01FB\x07\x05\x02\x02\u01FB\u0265" + + "\x03\x02\x02\x02\u01FC\u0265\x050\x19\x02\u01FD\u01FE\x07#\x02\x02\u01FE" + + "\u01FF\x07\x04\x02\x02\u01FF\u0204\x05.\x18\x02\u0200\u0201\x07\n\x02" + + "\x02\u0201\u0203\x05.\x18\x02\u0202\u0200\x03\x02\x02\x02\u0203\u0206" + + "\x03\x02\x02\x02\u0204\u0202\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02" + + "\u0205\u0208\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0207\u0209\x07" + + "\n\x02\x02\u0208\u0207\x03\x02\x02\x02\u0208\u0209\x03\x02\x02\x02\u0209" + + "\u020A\x03\x02\x02\x02\u020A\u020B\x07\x05\x02\x02\u020B\u0265\x03\x02" + + "\x02\x02\u020C\u020D\x07$\x02\x02\u020D\u020E\x07\x04\x02\x02\u020E\u0213" + + "\x05.\x18\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x05.\x18\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\u0265\x03\x02\x02\x02\u021B\u0220\x05P)\x02\u021C" + + "\u0220\x07,\x02\x02\u021D\u0220\x07+\x02\x02\u021E\u0220\x07*\x02\x02" + + "\u021F\u021B\x03\x02\x02\x02\u021F\u021C\x03\x02\x02\x02\u021F\u021D\x03" + + "\x02\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0265\x03\x02\x02\x02\u0221" + + "\u0222\x07?\x02\x02\u0222\u0223\x05.\x18\x02\u0223\u0224\x07\n\x02\x02" + + "\u0224\u0229\x05.\x18\x02\u0225\u0226\x07\n\x02\x02\u0226\u0228\x05.\x18" + + "\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227" + + "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02" + + "\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x07\n\x02\x02\u022D\u022C\x03" + + "\x02\x02\x02\u022D\u022E\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F" + + "\u0230\x07@\x02\x02\u0230\u0265\x03\x02\x02\x02\u0231\u0232\x07\x04\x02" + + "\x02\u0232\u0237\x05F$\x02\u0233\u0234\x07\n\x02\x02\u0234\u0236\x05F" + + "$\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02\u0237\u0235" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02" + + "\u0239\u0237\x03\x02\x02\x02\u023A\u023C\x07\n\x02\x02\u023B\u023A\x03" + + "\x02\x02\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D\x03\x02\x02\x02\u023D" + + "\u023E\x07\x05\x02\x02\u023E\u0265\x03\x02\x02\x02\u023F\u0248\x07\r\x02" + + "\x02\u0240\u0245\x05.\x18\x02\u0241\u0242\x07\n\x02\x02\u0242\u0244\x05" + + ".\x18\x02\u0243\u0241\x03\x02\x02\x02\u0244\u0247\x03\x02\x02\x02\u0245" + + "\u0243\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246\u0249\x03\x02" + + "\x02\x02\u0247\u0245\x03\x02\x02\x02\u0248\u0240\x03\x02\x02\x02\u0248" + + "\u0249\x03\x02\x02\x02\u0249\u024B\x03\x02\x02\x02\u024A\u024C\x07\n\x02" + + "\x02\u024B\u024A\x03\x02\x02\x02\u024B\u024C\x03\x02\x02\x02\u024C\u024D" + + "\x03\x02\x02\x02\u024D\u0265\x07\x0E\x02\x02\u024E\u024F\x07%\x02\x02" + + "\u024F\u0250\x07?\x02\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07@\x02" + + "\x02\u0252\u0253\x05.\x18\x02\u0253\u0254\x07&\x02\x02\u0254\u0255\x05" + + ".\x18\x07\u0255\u0265\x03\x02\x02\x02\u0256\u0257\x05\n\x06\x02\u0257" + + "\u0258\x05.\x18\x06\u0258\u0265\x03\x02\x02\x02\u0259\u025A\x05\x14\v" + + "\x02\u025A\u025B\x05.\x18\x05\u025B\u0265\x03\x02\x02\x02\u025C\u025D" + + "\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E\u025F\x07@\x02\x02\u025F" + + "\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02\x02\u0261\u0262\x05.\x18" + + "\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265\x03\x02\x02\x02\u0264\u01CE" + + "\x03\x02\x02\x02\u0264\u01D0\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02" + + "\u0264\u01D9\x03\x02\x02\x02\u0264\u01DE\x03\x02\x02\x02\u0264\u01ED\x03" + + "\x02\x02\x02\u0264\u01FC\x03\x02\x02\x02\u0264\u01FD\x03\x02\x02\x02\u0264" + + "\u020C\x03\x02\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u0221\x03\x02" + + "\x02\x02\u0264\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264" + + "\u024E\x03\x02\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02" + + "\x02\x02\u0264\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265" + + "\u0297\x03\x02\x02\x02\u0266\u0267\f\x1C\x02\x02\u0267\u0268\x07!\x02" + + "\x02\u0268\u0296\x05.\x18\x1C\u0269\u026A\f\x1A\x02\x02\u026A\u026B\t" + + "\x02\x02\x02\u026B\u0296\x05.\x18\x1B\u026C\u026D\f\x19\x02\x02\u026D" + + "\u026E\t\x03\x02\x02\u026E\u0296\x05.\x18\x1A\u026F\u0270\f\x18\x02\x02" + + "\u0270\u0271\t\x04\x02\x02\u0271\u0296\x05.\x18\x19\u0272\u0273\f\x16" + + "\x02\x02\u0273\u0274\x07>\x02\x02\u0274\u0275\x05.\x18\x17\u0275\u0276" + + "\b\x18\x01\x02\u0276\u0296\x03\x02\x02\x02\u0277\u0278\f\x14\x02\x02\u0278" + + "\u0279\x07-\x02\x02\u0279\u0296\x05.\x18\x15\u027A\u027B\f\x12\x02\x02" + + "\u027B\u027C\x07.\x02\x02\u027C\u0296\x05.\x18\x13\u027D\u027E\f\x11\x02" + + "\x02\u027E\u027F\x07/\x02\x02\u027F\u0296\x05.\x18\x12\u0280\u0281\f\x10" + + "\x02\x02\u0281\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x11\u0283\u0284" + + "\f\n\x02\x02\u0284\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286" + + "\u0287\f \x02\x02\u0287\u0288\x07\x18\x02\x02\u0288\u028E\x05J&\x02\u0289" + + "\u028B\x07?\x02\x02\u028A\u028C\x05D#\x02\u028B\u028A\x03\x02\x02\x02" + + "\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07" + + "@\x02\x02\u028E\u0289\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + + "\u0296\x03\x02\x02\x02\u0290\u0291\f\x1D\x02\x02\u0291\u0292\x07\r\x02" + + "\x02\u0292\u0293\x05.\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296" + + "\x03\x02\x02\x02\u0295\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02" + + "\u0295\u026C\x03\x02\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03" + + "\x02\x02\x02\u0295\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295" + + "\u027D\x03\x02\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02" + + "\x02\x02\u0295\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296" + + "\u0299\x03\x02\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02" + + "\x02\x02\u0298/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B" + + "\x072\x02\x02\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D" + + "\u029F\x07\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02" + + "\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2" + + "\x07\x0F\x02\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02" + + "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + + "\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + + "\u02A9\x07\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02" + + "\u02AB\u02AD\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03" + + "\x02\x02\x02\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF" + + "\u02B0\x05.\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05R*\x02\u02B2" + + "\u02B5\x07?\x02\x02\u02B3\u02B6\x05R*\x02\u02B4\u02B6\x07\'\x02\x02\u02B5" + + "\u02B3\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02" + + "\x02\x02\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9" + + "\x03\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB" + + "\u02BC\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18" + + "\x02\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1" + + "\x07E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03" + + "\u02C3\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03" + + "\x02\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5" + + "\u02C8\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02" + + "\u02C7\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!" + + "\x02\u02CA\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB" + + "\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF" + + "\u02D0\x07\n\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02" + + "\u02D2\u02D5\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03" + + "\x02\x02\x02\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6" + + "\u02D7\x07@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02" + + "\u02D9\u02DB\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03" + + "\x02\x02\x02\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE" + + "\x07?\x02\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2" + + "\x05@!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3" + + "\u02E1\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02" + + "\x02\x02\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8" + + "\x07\x1D\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA" + + "\u02ED\x07\'\x02\x02\u02EB\u02ED\x05P)\x02\u02EC\u02EA\x03\x02\x02\x02" + + "\u02EC\u02EB\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> " + + "\x02\u02EFA\x03\x02\x02\x02\u02F0\u02F3\x075\x02\x02\u02F1\u02F3\x05P" + + ")\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1\x03\x02\x02\x02\u02F3C\x03" + + "\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5\u02F6\x07\n\x02\x02\u02F6" + + "\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8\u02FB\x03\x02\x02" + + "\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA\x03\x02\x02\x02\u02FAE\x03" + + "\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FD\x05R*\x02\u02FD\u02FE" + + "\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02\u02FF\u0303\x03\x02\x02\x02" + + "\u0300\u0301\x07(\x02\x02\u0301\u0303\x05.\x18\x02\u0302\u02FC\x03\x02" + + "\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303G\x03\x02\x02\x02\u0304\u0307" + + "\x05P)\x02\u0305\u0307\t\x05\x02\x02\u0306\u0304\x03\x02\x02\x02\u0306" + + "\u0305\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B\x05P)\x02\u0309" + + "\u030B\t\x06\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A\u0309\x03\x02\x02" + + "\x02\u030BK\x03\x02\x02\x02\u030C\u030D\t\x07\x02\x02\u030DM\x03\x02\x02" + + "\x02\u030E\u030F\t\b\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0315\x05T+" + + "\x02\u0311\u0312\x07)\x02\x02\u0312\u0314\x05T+\x02\u0313\u0311\x03\x02" + + "\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315\u0313\x03\x02\x02\x02\u0315" + + "\u0316\x03\x02\x02\x02\u0316Q\x03\x02\x02\x02\u0317\u0315\x03\x02\x02" + + "\x02\u0318\u031D\x05T+\x02\u0319\u031A\x05P)\x02\u031A\u031B\b*\x01\x02" + + "\u031B\u031D\x03\x02\x02\x02\u031C\u0318\x03\x02\x02\x02\u031C\u0319\x03" + + "\x02\x02\x02\u031DS\x03\x02\x02\x02\u031E\u031F\t\t\x02\x02\u031FU\x03" + + "\x02\x02\x02ZY`iq\x8A\x94\x97\x9A\x9E\xA2\xA5\xB4\xBC\xBF\xC1\xCF\xD8" + + "\xDD\xE0\xE7\xEF\xF5\xFA\u0105\u010D\u0113\u0117\u0119\u0124\u0126\u0135" + + "\u013D\u014C\u0154\u0156\u0167\u016A\u016D\u0184\u0188\u018E\u019A\u01A9" + + "\u01AE\u01B0\u01C0\u01C6\u01CA\u01D3\u01E5\u01E9\u01F4\u01F8\u0204\u0208" + + "\u0213\u0217\u021F\u0229\u022D\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + + "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + + "\u02E3\u02EC\u02F2\u02F9\u0302\u0306\u030A\u0315\u031C"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, From c653b1c8f6c5f0da9cf11823fe23d18e6b05db1b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 15 Feb 2024 13:49:05 -0500 Subject: [PATCH 236/428] Clean up ToIrListener Remove unneeded mutable vars and checks. --- quint/src/parsing/ToIrListener.ts | 35 +++++++------------------------ 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index ffa81a062..56053b2e1 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -230,36 +230,15 @@ export class ToIrListener implements QuintListener { // does not have a representation for this at the moment { id: this.getId(ctx), kind: 'bool', value: true } - // extract the qualifier - let qualifier: OpQualifier = 'def' - if (ctx.qualifier()) { - const qtext = ctx.qualifier().text - // case distinction to make the type checker happy - if ( - qtext === 'pureval' || - qtext === 'puredef' || - qtext === 'val' || - qtext === 'def' || - qtext === 'action' || - qtext === 'run' || - qtext === 'temporal' - ) { - qualifier = qtext - } - } + // The grammar should guarantee we only parse valid OpQualifiers here + const qualifier: OpQualifier = ctx.qualifier().text as OpQualifier - let body = expr + const body: QuintEx = + params.length === 0 + ? expr + : // if the definition has parameters, introduce a lambda + { id: this.getId(ctx), kind: 'lambda', params, qualifier, expr } - if (params.length > 0) { - // if the definition has parameters, introduce a lambda - body = { - id: this.getId(ctx), - kind: 'lambda', - params, - qualifier, - expr, - } - } const def: QuintOpDef = { id: this.getId(ctx), kind: 'def', From 5955315c76042f64ff20aa56c324e83d4bd9759f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 00:15:24 -0500 Subject: [PATCH 237/428] Parse type annotations into operator params --- quint/src/generated/Quint.g4 | 29 +- quint/src/generated/Quint.interp | 3 +- quint/src/generated/QuintListener.ts | 40 + quint/src/generated/QuintParser.ts | 2156 ++++++++++++---------- quint/src/generated/QuintVisitor.ts | 26 + quint/src/ir/quintIr.ts | 2 +- quint/src/parsing/ToIrListener.ts | 117 +- quint/test/ir/IRFinder.test.ts | 9 +- quint/test/types/inferrer.test.ts | 4 +- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1030const.map.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1031instance.map.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 16 files changed, 1309 insertions(+), 1091 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index d027fc90d..ce8359885 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -25,7 +25,7 @@ documentedDeclaration : DOCCOMMENT* declaration; // a module declaration declaration : 'const' qualId ':' type # const | 'var' qualId ':' type # var - | 'assume' identOrHole '=' expr # assume + | 'assume' (assumeName=identOrHole) '=' expr # assume | instanceMod # instance | operDef # oper | typeDef # typeDefs @@ -41,22 +41,25 @@ declaration : 'const' qualId ':' type # const // An operator definition. operDef : qualifier normalCallName - // Unannotated parameter list - ('(' (parameter (',' parameter)*)? ')')? - // Optional type annotation using the deprecated format - // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 - (':' type)? + // Fully-annotated parameter list with at least one parameter + '(' (annotOperParam+=annotatedParameter (',' annotOperParam+=annotatedParameter)*) ')' + // Mandatory annotation for return type + ':' type // We support header declaration with no implementation for documentation genaration ('=' expr)? // Optionally terminated with a semicolon ';'? - | qualifier normalCallName - // Fully annotated parameter lists - '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type + # annotatedOperDef + | qualifier normalCallName // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 + // Unannotated parameter list + ('(' (operParam+=parameter (',' operParam+=parameter)*)? ')')? + // Optional type annotation using the deprecated format + (':' annotatedRetType=type)? // We support header declaration with no implementation for documentation genaration ('=' expr)? // Optionally terminated with a semicolon ';'? + # deprecatedOperDef ; typeDef @@ -213,10 +216,12 @@ lambdaUnsugared : parameter '=>' expr lambdaTupleSugar : '(' '(' parameter (',' parameter)+ ')' ')' '=>' expr; // an identifier or a hole '_' -identOrHole : '_' | qualId - ; +identOrHole : '_' | qualId; -parameter: identOrHole; +// TODO: Combine these into a single rule that support optionally annotated parameters +// Requires https://github.com/informalsystems/quint/issues/923 +parameter: paramName=identOrHole; +annotatedParameter: paramName=identOrHole ':' type; // an identifier or a star '*' identOrStar : '*' | qualId diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 20af851ff..7f37f7d5e 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -177,6 +177,7 @@ lambdaUnsugared lambdaTupleSugar identOrHole parameter +annotatedParameter identOrStar argList recElem @@ -190,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 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, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 5, 6, 155, 10, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 5, 6, 166, 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, 179, 10, 6, 12, 6, 14, 6, 182, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 189, 10, 6, 3, 6, 5, 6, 192, 10, 6, 5, 6, 194, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 208, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 215, 10, 8, 12, 8, 14, 8, 218, 11, 8, 3, 8, 3, 8, 5, 8, 222, 10, 8, 3, 9, 5, 9, 225, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 230, 10, 9, 12, 9, 14, 9, 233, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 240, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 251, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 262, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 270, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 3, 13, 3, 13, 5, 13, 280, 10, 13, 5, 13, 282, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 293, 10, 14, 5, 14, 295, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 308, 10, 15, 12, 15, 14, 15, 311, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 318, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 331, 10, 15, 12, 15, 14, 15, 334, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 341, 10, 15, 5, 15, 343, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 358, 10, 20, 12, 20, 14, 20, 361, 11, 20, 5, 20, 363, 10, 20, 3, 20, 5, 20, 366, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 387, 10, 20, 12, 20, 14, 20, 390, 11, 20, 3, 20, 5, 20, 393, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 399, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 411, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 424, 10, 20, 12, 20, 14, 20, 427, 11, 20, 3, 20, 3, 20, 7, 20, 431, 10, 20, 12, 20, 14, 20, 434, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 447, 10, 22, 12, 22, 14, 22, 450, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 5, 22, 459, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 468, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 484, 10, 24, 12, 24, 14, 24, 487, 11, 24, 3, 24, 5, 24, 490, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 499, 10, 24, 12, 24, 14, 24, 502, 11, 24, 3, 24, 5, 24, 505, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 515, 10, 24, 12, 24, 14, 24, 518, 11, 24, 3, 24, 5, 24, 521, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 530, 10, 24, 12, 24, 14, 24, 533, 11, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 544, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 552, 10, 24, 12, 24, 14, 24, 555, 11, 24, 3, 24, 5, 24, 558, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 755, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 760, 10, 35, 12, 35, 14, 35, 763, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 771, 10, 36, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 788, 10, 41, 12, 41, 14, 41, 791, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 797, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 193, 3, 2, 2, 2, 12, 207, 3, 2, 2, 2, 14, 209, 3, 2, 2, 2, 16, 224, 3, 2, 2, 2, 18, 234, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 261, 3, 2, 2, 2, 24, 281, 3, 2, 2, 2, 26, 294, 3, 2, 2, 2, 28, 342, 3, 2, 2, 2, 30, 344, 3, 2, 2, 2, 32, 346, 3, 2, 2, 2, 34, 348, 3, 2, 2, 2, 36, 350, 3, 2, 2, 2, 38, 410, 3, 2, 2, 2, 40, 435, 3, 2, 2, 2, 42, 458, 3, 2, 2, 2, 44, 460, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 754, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 770, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 796, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 154, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 7, 64, 2, 2, 154, 142, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 157, 7, 7, 2, 2, 157, 159, 5, 38, 20, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 161, 7, 62, 2, 2, 161, 163, 5, 46, 24, 2, 162, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 165, 3, 2, 2, 2, 164, 166, 7, 11, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 194, 3, 2, 2, 2, 167, 168, 5, 22, 12, 2, 168, 169, 5, 72, 37, 2, 169, 170, 7, 63, 2, 2, 170, 171, 5, 64, 33, 2, 171, 172, 7, 7, 2, 2, 172, 180, 5, 38, 20, 2, 173, 174, 7, 10, 2, 2, 174, 175, 5, 64, 33, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 180, 3, 2, 2, 2, 183, 184, 7, 64, 2, 2, 184, 185, 7, 7, 2, 2, 185, 188, 5, 38, 20, 2, 186, 187, 7, 62, 2, 2, 187, 189, 5, 46, 24, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 7, 11, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 140, 3, 2, 2, 2, 193, 167, 3, 2, 2, 2, 194, 11, 3, 2, 2, 2, 195, 196, 7, 12, 2, 2, 196, 208, 5, 80, 41, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 38, 20, 2, 201, 208, 3, 2, 2, 2, 202, 203, 7, 12, 2, 2, 203, 204, 5, 14, 8, 2, 204, 205, 7, 62, 2, 2, 205, 206, 5, 16, 9, 2, 206, 208, 3, 2, 2, 2, 207, 195, 3, 2, 2, 2, 207, 197, 3, 2, 2, 2, 207, 202, 3, 2, 2, 2, 208, 13, 3, 2, 2, 2, 209, 221, 5, 80, 41, 2, 210, 211, 7, 13, 2, 2, 211, 216, 5, 40, 21, 2, 212, 213, 7, 10, 2, 2, 213, 215, 5, 40, 21, 2, 214, 212, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 220, 7, 14, 2, 2, 220, 222, 3, 2, 2, 2, 221, 210, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 15, 3, 2, 2, 2, 223, 225, 7, 15, 2, 2, 224, 223, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 231, 5, 18, 10, 2, 227, 228, 7, 15, 2, 2, 228, 230, 5, 18, 10, 2, 229, 227, 3, 2, 2, 2, 230, 233, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 17, 3, 2, 2, 2, 233, 231, 3, 2, 2, 2, 234, 239, 5, 82, 42, 2, 235, 236, 7, 63, 2, 2, 236, 237, 5, 38, 20, 2, 237, 238, 7, 64, 2, 2, 238, 240, 3, 2, 2, 2, 239, 235, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 19, 3, 2, 2, 2, 241, 242, 7, 16, 2, 2, 242, 245, 5, 80, 41, 2, 243, 244, 7, 7, 2, 2, 244, 246, 5, 38, 20, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 62, 2, 2, 248, 250, 5, 46, 24, 2, 249, 251, 7, 11, 2, 2, 250, 249, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 21, 3, 2, 2, 2, 252, 262, 7, 17, 2, 2, 253, 262, 7, 18, 2, 2, 254, 255, 7, 19, 2, 2, 255, 262, 7, 17, 2, 2, 256, 257, 7, 19, 2, 2, 257, 262, 7, 18, 2, 2, 258, 262, 7, 20, 2, 2, 259, 262, 7, 21, 2, 2, 260, 262, 7, 22, 2, 2, 261, 252, 3, 2, 2, 2, 261, 253, 3, 2, 2, 2, 261, 254, 3, 2, 2, 2, 261, 256, 3, 2, 2, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 262, 23, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 265, 5, 32, 17, 2, 265, 266, 7, 24, 2, 2, 266, 269, 5, 66, 34, 2, 267, 268, 7, 25, 2, 2, 268, 270, 5, 36, 19, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 282, 3, 2, 2, 2, 271, 272, 7, 23, 2, 2, 272, 275, 5, 32, 17, 2, 273, 274, 7, 26, 2, 2, 274, 276, 5, 32, 17, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 278, 7, 25, 2, 2, 278, 280, 5, 36, 19, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 263, 3, 2, 2, 2, 281, 271, 3, 2, 2, 2, 282, 25, 3, 2, 2, 2, 283, 284, 7, 27, 2, 2, 284, 285, 5, 32, 17, 2, 285, 286, 7, 24, 2, 2, 286, 287, 5, 66, 34, 2, 287, 295, 3, 2, 2, 2, 288, 289, 7, 27, 2, 2, 289, 292, 5, 32, 17, 2, 290, 291, 7, 26, 2, 2, 291, 293, 5, 32, 17, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 283, 3, 2, 2, 2, 294, 288, 3, 2, 2, 2, 295, 27, 3, 2, 2, 2, 296, 297, 7, 23, 2, 2, 297, 298, 5, 30, 16, 2, 298, 299, 7, 63, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 309, 5, 46, 24, 2, 302, 303, 7, 10, 2, 2, 303, 304, 5, 32, 17, 2, 304, 305, 7, 62, 2, 2, 305, 306, 5, 46, 24, 2, 306, 308, 3, 2, 2, 2, 307, 302, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 312, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 313, 7, 64, 2, 2, 313, 314, 7, 24, 2, 2, 314, 317, 7, 53, 2, 2, 315, 316, 7, 25, 2, 2, 316, 318, 5, 36, 19, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 343, 3, 2, 2, 2, 319, 320, 7, 23, 2, 2, 320, 321, 5, 30, 16, 2, 321, 322, 7, 63, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 332, 5, 46, 24, 2, 325, 326, 7, 10, 2, 2, 326, 327, 5, 32, 17, 2, 327, 328, 7, 62, 2, 2, 328, 329, 5, 46, 24, 2, 329, 331, 3, 2, 2, 2, 330, 325, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 332, 3, 2, 2, 2, 335, 336, 7, 64, 2, 2, 336, 337, 7, 26, 2, 2, 337, 340, 5, 34, 18, 2, 338, 339, 7, 25, 2, 2, 339, 341, 5, 36, 19, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 296, 3, 2, 2, 2, 342, 319, 3, 2, 2, 2, 343, 29, 3, 2, 2, 2, 344, 345, 5, 80, 41, 2, 345, 31, 3, 2, 2, 2, 346, 347, 5, 80, 41, 2, 347, 33, 3, 2, 2, 2, 348, 349, 5, 80, 41, 2, 349, 35, 3, 2, 2, 2, 350, 351, 7, 42, 2, 2, 351, 37, 3, 2, 2, 2, 352, 353, 8, 20, 1, 2, 353, 362, 7, 63, 2, 2, 354, 359, 5, 38, 20, 2, 355, 356, 7, 10, 2, 2, 356, 358, 5, 38, 20, 2, 357, 355, 3, 2, 2, 2, 358, 361, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 362, 354, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 64, 2, 2, 368, 369, 7, 29, 2, 2, 369, 411, 5, 38, 20, 14, 370, 371, 7, 65, 2, 2, 371, 372, 7, 13, 2, 2, 372, 373, 5, 38, 20, 2, 373, 374, 7, 14, 2, 2, 374, 411, 3, 2, 2, 2, 375, 376, 7, 66, 2, 2, 376, 377, 7, 13, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 14, 2, 2, 379, 411, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 382, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 388, 5, 38, 20, 2, 384, 385, 7, 10, 2, 2, 385, 387, 5, 38, 20, 2, 386, 384, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 392, 3, 2, 2, 2, 390, 388, 3, 2, 2, 2, 391, 393, 7, 10, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 411, 3, 2, 2, 2, 396, 398, 7, 4, 2, 2, 397, 399, 5, 42, 22, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 7, 5, 2, 2, 401, 411, 7, 30, 2, 2, 402, 411, 7, 31, 2, 2, 403, 411, 7, 32, 2, 2, 404, 411, 5, 40, 21, 2, 405, 411, 5, 80, 41, 2, 406, 407, 7, 63, 2, 2, 407, 408, 5, 38, 20, 2, 408, 409, 7, 64, 2, 2, 409, 411, 3, 2, 2, 2, 410, 352, 3, 2, 2, 2, 410, 370, 3, 2, 2, 2, 410, 375, 3, 2, 2, 2, 410, 380, 3, 2, 2, 2, 410, 396, 3, 2, 2, 2, 410, 401, 3, 2, 2, 2, 410, 402, 3, 2, 2, 2, 410, 403, 3, 2, 2, 2, 410, 404, 3, 2, 2, 2, 410, 405, 3, 2, 2, 2, 410, 406, 3, 2, 2, 2, 411, 432, 3, 2, 2, 2, 412, 413, 12, 16, 2, 2, 413, 414, 7, 28, 2, 2, 414, 431, 5, 38, 20, 16, 415, 416, 12, 15, 2, 2, 416, 417, 7, 29, 2, 2, 417, 431, 5, 38, 20, 15, 418, 419, 12, 3, 2, 2, 419, 420, 7, 13, 2, 2, 420, 425, 5, 38, 20, 2, 421, 422, 7, 10, 2, 2, 422, 424, 5, 38, 20, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 14, 2, 2, 429, 431, 3, 2, 2, 2, 430, 412, 3, 2, 2, 2, 430, 415, 3, 2, 2, 2, 430, 418, 3, 2, 2, 2, 431, 434, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 39, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 436, 7, 67, 2, 2, 436, 41, 3, 2, 2, 2, 437, 438, 5, 44, 23, 2, 438, 439, 7, 7, 2, 2, 439, 440, 5, 38, 20, 2, 440, 448, 3, 2, 2, 2, 441, 442, 7, 10, 2, 2, 442, 443, 5, 44, 23, 2, 443, 444, 7, 7, 2, 2, 444, 445, 5, 38, 20, 2, 445, 447, 3, 2, 2, 2, 446, 441, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 454, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 455, 7, 10, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 84, 43, 2, 454, 451, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 3, 2, 2, 2, 456, 457, 7, 15, 2, 2, 457, 459, 5, 84, 43, 2, 458, 437, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 43, 3, 2, 2, 2, 460, 461, 5, 82, 42, 2, 461, 45, 3, 2, 2, 2, 462, 463, 8, 24, 1, 2, 463, 613, 5, 56, 29, 2, 464, 465, 5, 72, 37, 2, 465, 467, 7, 63, 2, 2, 466, 468, 5, 68, 35, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 64, 2, 2, 470, 613, 3, 2, 2, 2, 471, 472, 7, 52, 2, 2, 472, 613, 5, 46, 24, 27, 473, 474, 5, 80, 41, 2, 474, 475, 7, 34, 2, 2, 475, 476, 7, 62, 2, 2, 476, 477, 5, 46, 24, 23, 477, 613, 3, 2, 2, 2, 478, 479, 7, 45, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 46, 24, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 46, 24, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 613, 3, 2, 2, 2, 493, 494, 7, 46, 2, 2, 494, 495, 7, 4, 2, 2, 495, 500, 5, 46, 24, 2, 496, 497, 7, 10, 2, 2, 497, 499, 5, 46, 24, 2, 498, 496, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 503, 505, 7, 10, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 5, 2, 2, 507, 613, 3, 2, 2, 2, 508, 613, 5, 48, 25, 2, 509, 510, 7, 35, 2, 2, 510, 511, 7, 4, 2, 2, 511, 516, 5, 46, 24, 2, 512, 513, 7, 10, 2, 2, 513, 515, 5, 46, 24, 2, 514, 512, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 520, 3, 2, 2, 2, 518, 516, 3, 2, 2, 2, 519, 521, 7, 10, 2, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 5, 2, 2, 523, 613, 3, 2, 2, 2, 524, 525, 7, 36, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 46, 24, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 46, 24, 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, 613, 3, 2, 2, 2, 539, 544, 5, 80, 41, 2, 540, 544, 7, 44, 2, 2, 541, 544, 7, 43, 2, 2, 542, 544, 7, 42, 2, 2, 543, 539, 3, 2, 2, 2, 543, 540, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 542, 3, 2, 2, 2, 544, 613, 3, 2, 2, 2, 545, 546, 7, 63, 2, 2, 546, 547, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 553, 5, 46, 24, 2, 549, 550, 7, 10, 2, 2, 550, 552, 5, 46, 24, 2, 551, 549, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 7, 10, 2, 2, 557, 556, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 7, 64, 2, 2, 560, 613, 3, 2, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 70, 36, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 70, 36, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 464, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 473, 3, 2, 2, 2, 612, 478, 3, 2, 2, 2, 612, 493, 3, 2, 2, 2, 612, 508, 3, 2, 2, 2, 612, 509, 3, 2, 2, 2, 612, 524, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 545, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 28, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 28, 617, 618, 12, 26, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 27, 620, 621, 12, 25, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 26, 623, 624, 12, 24, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 25, 626, 627, 12, 22, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 23, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 20, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 21, 634, 635, 12, 18, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 19, 637, 638, 12, 17, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 18, 640, 641, 12, 16, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 17, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 32, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 74, 38, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 68, 35, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 29, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 82, 42, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 82, 42, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 80, 41, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 80, 41, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 67, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 69, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 82, 42, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 71, 3, 2, 2, 2, 772, 775, 5, 80, 41, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 80, 41, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 79, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 84, 43, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 81, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 84, 43, 2, 793, 794, 5, 80, 41, 2, 794, 795, 8, 42, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 83, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 85, 3, 2, 2, 2, 90, 89, 96, 105, 113, 138, 148, 151, 154, 158, 162, 165, 180, 188, 191, 193, 207, 216, 221, 224, 231, 239, 245, 250, 261, 269, 275, 279, 281, 292, 294, 309, 317, 332, 340, 342, 359, 362, 365, 388, 392, 398, 410, 425, 430, 432, 448, 454, 458, 467, 485, 489, 500, 504, 516, 520, 531, 535, 543, 553, 557, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 408, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 421, 10, 20, 12, 20, 14, 20, 424, 11, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 407, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 408, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 408, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 408, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 408, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 7, 5, 2, 2, 398, 408, 7, 30, 2, 2, 399, 408, 7, 31, 2, 2, 400, 408, 7, 32, 2, 2, 401, 408, 5, 40, 21, 2, 402, 408, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 408, 3, 2, 2, 2, 407, 349, 3, 2, 2, 2, 407, 367, 3, 2, 2, 2, 407, 372, 3, 2, 2, 2, 407, 377, 3, 2, 2, 2, 407, 393, 3, 2, 2, 2, 407, 398, 3, 2, 2, 2, 407, 399, 3, 2, 2, 2, 407, 400, 3, 2, 2, 2, 407, 401, 3, 2, 2, 2, 407, 402, 3, 2, 2, 2, 407, 403, 3, 2, 2, 2, 408, 429, 3, 2, 2, 2, 409, 410, 12, 16, 2, 2, 410, 411, 7, 28, 2, 2, 411, 428, 5, 38, 20, 16, 412, 413, 12, 15, 2, 2, 413, 414, 7, 29, 2, 2, 414, 428, 5, 38, 20, 15, 415, 416, 12, 3, 2, 2, 416, 417, 7, 13, 2, 2, 417, 422, 5, 38, 20, 2, 418, 419, 7, 10, 2, 2, 419, 421, 5, 38, 20, 2, 420, 418, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 426, 7, 14, 2, 2, 426, 428, 3, 2, 2, 2, 427, 409, 3, 2, 2, 2, 427, 412, 3, 2, 2, 2, 427, 415, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 407, 422, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 3894383e6..7eade795d 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -55,6 +55,8 @@ import { LetInContext } from "./QuintParser"; import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -95,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -710,6 +713,32 @@ export interface QuintListener extends ParseTreeListener { */ exitBraces?: (ctx: BracesContext) => void; + /** + * Enter a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + + /** + * Enter a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** * Enter a parse tree produced by the `const` * labeled alternative in `QuintParser.declaration`. @@ -1166,6 +1195,17 @@ export interface QuintListener extends ParseTreeListener { */ exitParameter?: (ctx: ParameterContext) => void; + /** + * Enter a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + enterAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** + * Exit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + exitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** * Enter a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index b243c6b7d..d73133d0f 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -136,16 +136,17 @@ export class QuintParser extends Parser { public static readonly RULE_lambdaTupleSugar = 29; public static readonly RULE_identOrHole = 30; public static readonly RULE_parameter = 31; - public static readonly RULE_identOrStar = 32; - public static readonly RULE_argList = 33; - public static readonly RULE_recElem = 34; - public static readonly RULE_normalCallName = 35; - public static readonly RULE_nameAfterDot = 36; - public static readonly RULE_operator = 37; - public static readonly RULE_literal = 38; - public static readonly RULE_qualId = 39; - public static readonly RULE_simpleId = 40; - public static readonly RULE_identifier = 41; + public static readonly RULE_annotatedParameter = 32; + public static readonly RULE_identOrStar = 33; + public static readonly RULE_argList = 34; + public static readonly RULE_recElem = 35; + public static readonly RULE_normalCallName = 36; + public static readonly RULE_nameAfterDot = 37; + public static readonly RULE_operator = 38; + public static readonly RULE_literal = 39; + public static readonly RULE_qualId = 40; + public static readonly RULE_simpleId = 41; + public static readonly RULE_identifier = 42; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", @@ -154,8 +155,8 @@ export class QuintParser extends Parser { "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", - "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", - "operator", "literal", "qualId", "simpleId", "identifier", + "annotatedParameter", "identOrStar", "argList", "recElem", "normalCallName", + "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -214,21 +215,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 85; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 84; + this.state = 86; this.module(); } } - this.state = 87; + this.state = 89; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 89; + this.state = 91; this.match(QuintParser.EOF); } } @@ -254,41 +255,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 94; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 91; + this.state = 93; this.match(QuintParser.DOCCOMMENT); } } - this.state = 96; + this.state = 98; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 97; + this.state = 99; this.match(QuintParser.T__0); - this.state = 98; + this.state = 100; this.qualId(); - this.state = 99; + this.state = 101; this.match(QuintParser.T__1); - this.state = 103; + this.state = 105; 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__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 100; + this.state = 102; this.documentedDeclaration(); } } - this.state = 105; + this.state = 107; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 106; + this.state = 108; this.match(QuintParser.T__2); } } @@ -314,21 +315,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 111; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 108; + this.state = 110; this.match(QuintParser.DOCCOMMENT); } } - this.state = 113; + this.state = 115; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 114; + this.state = 116; this.declaration(); } } @@ -351,20 +352,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 136; + this.state = 138; 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 = 116; + this.state = 118; this.match(QuintParser.T__3); - this.state = 117; + this.state = 119; this.qualId(); - this.state = 118; + this.state = 120; this.match(QuintParser.T__4); - this.state = 119; + this.state = 121; this.type(0); } break; @@ -373,13 +374,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 121; + this.state = 123; this.match(QuintParser.T__5); - this.state = 122; + this.state = 124; this.qualId(); - this.state = 123; + this.state = 125; this.match(QuintParser.T__4); - this.state = 124; + this.state = 126; this.type(0); } break; @@ -388,13 +389,15 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 126; - this.match(QuintParser.T__6); - this.state = 127; - this.identOrHole(); this.state = 128; - this.match(QuintParser.ASGN); + this.match(QuintParser.T__6); + { this.state = 129; + (_localctx as AssumeContext)._assumeName = this.identOrHole(); + } + this.state = 130; + this.match(QuintParser.ASGN); + this.state = 131; this.expr(0); } break; @@ -403,7 +406,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 131; + this.state = 133; this.instanceMod(); } break; @@ -412,7 +415,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 132; + this.state = 134; this.operDef(); } break; @@ -421,7 +424,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 133; + this.state = 135; this.typeDef(); } break; @@ -430,7 +433,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 134; + this.state = 136; this.importMod(); } break; @@ -439,7 +442,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 135; + this.state = 137; this.exportMod(); } break; @@ -465,84 +468,65 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.state = 191; + this.state = 188; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: + _localctx = new AnnotatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 138; + this.state = 140; this.qualifier(); - this.state = 139; + this.state = 141; this.normalCallName(); - this.state = 152; + this.state = 142; + this.match(QuintParser.LPAREN); + { + this.state = 143; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); + this.state = 148; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 7, this._ctx) ) { - case 1: + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { { - this.state = 140; - this.match(QuintParser.LPAREN); - this.state = 149; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { - { - this.state = 141; - this.parameter(); - this.state = 146; - this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { - { - this.state = 142; - this.match(QuintParser.T__7); - this.state = 143; - this.parameter(); - } - } - this.state = 148; - this._errHandler.sync(this); - _la = this._input.LA(1); - } - } + { + this.state = 144; + this.match(QuintParser.T__7); + this.state = 145; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); } - - this.state = 151; - this.match(QuintParser.RPAREN); } - break; + this.state = 150; + this._errHandler.sync(this); + _la = this._input.LA(1); } - this.state = 156; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__4) { - { - this.state = 154; - this.match(QuintParser.T__4); - this.state = 155; - this.type(0); - } } - - this.state = 160; + this.state = 151; + this.match(QuintParser.RPAREN); + this.state = 152; + this.match(QuintParser.T__4); + this.state = 153; + this.type(0); + this.state = 156; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 158; + this.state = 154; this.match(QuintParser.ASGN); - this.state = 159; + this.state = 155; this.expr(0); } } - this.state = 163; + this.state = 159; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 162; + this.state = 158; this.match(QuintParser.T__8); } } @@ -551,66 +535,83 @@ export class QuintParser extends Parser { break; case 2: + _localctx = new DeprecatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 165; + this.state = 161; this.qualifier(); - this.state = 166; + this.state = 162; this.normalCallName(); - this.state = 167; - this.match(QuintParser.LPAREN); - { - this.state = 168; - this.parameter(); - this.state = 169; - this.match(QuintParser.T__4); - this.state = 170; - this.type(0); - this.state = 178; + this.state = 175; this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { + switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { + case 1: { - this.state = 171; - this.match(QuintParser.T__7); + this.state = 163; + this.match(QuintParser.LPAREN); this.state = 172; - this.parameter(); - this.state = 173; - this.match(QuintParser.T__4); - this.state = 174; - this.type(0); - } - } - this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { + { + this.state = 164; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + this.state = 169; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 165; + this.match(QuintParser.T__7); + this.state = 166; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + } + } + this.state = 171; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + } + + this.state = 174; + this.match(QuintParser.RPAREN); + } + break; } + this.state = 179; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__4) { + { + this.state = 177; + this.match(QuintParser.T__4); + this.state = 178; + (_localctx as DeprecatedOperDefContext)._annotatedRetType = this.type(0); + } } - this.state = 181; - this.match(QuintParser.RPAREN); - this.state = 182; - this.match(QuintParser.T__4); + this.state = 183; - this.type(0); - this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 184; + this.state = 181; this.match(QuintParser.ASGN); - this.state = 185; + this.state = 182; this.expr(0); } } - this.state = 189; + this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 188; + this.state = 185; this.match(QuintParser.T__8); } } @@ -638,16 +639,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 205; + this.state = 202; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 193; + this.state = 190; this.match(QuintParser.T__9); - this.state = 194; + this.state = 191; this.qualId(); } break; @@ -656,13 +657,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 195; + this.state = 192; this.match(QuintParser.T__9); - this.state = 196; + this.state = 193; this.typeDefHead(); - this.state = 197; + this.state = 194; this.match(QuintParser.ASGN); - this.state = 198; + this.state = 195; this.type(0); } break; @@ -671,13 +672,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 200; + this.state = 197; this.match(QuintParser.T__9); - this.state = 201; + this.state = 198; this.typeDefHead(); - this.state = 202; + this.state = 199; this.match(QuintParser.ASGN); - this.state = 203; + this.state = 200; this.sumTypeDefinition(); } break; @@ -705,36 +706,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 207; + this.state = 204; _localctx._typeName = this.qualId(); - this.state = 219; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 208; + this.state = 205; this.match(QuintParser.T__10); - this.state = 209; + this.state = 206; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); - this.state = 214; + this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 210; + this.state = 207; this.match(QuintParser.T__7); - this.state = 211; + this.state = 208; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 216; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 217; + this.state = 214; this.match(QuintParser.T__11); } } @@ -763,31 +764,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 222; + this.state = 219; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 221; + this.state = 218; this.match(QuintParser.T__12); } } - this.state = 224; + this.state = 221; this.typeSumVariant(); - this.state = 229; + this.state = 226; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 225; + this.state = 222; this.match(QuintParser.T__12); - this.state = 226; + this.state = 223; this.typeSumVariant(); } } - this.state = 231; + this.state = 228; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -815,18 +816,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 232; + this.state = 229; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 237; + this.state = 234; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 233; + this.state = 230; this.match(QuintParser.LPAREN); - this.state = 234; + this.state = 231; this.type(0); - this.state = 235; + this.state = 232; this.match(QuintParser.RPAREN); } } @@ -855,32 +856,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 239; + this.state = 236; this.match(QuintParser.T__13); - this.state = 240; + this.state = 237; this.qualId(); - this.state = 243; + this.state = 240; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 241; + this.state = 238; this.match(QuintParser.T__4); - this.state = 242; + this.state = 239; this.type(0); } } - this.state = 245; + this.state = 242; this.match(QuintParser.ASGN); - this.state = 246; + this.state = 243; this.expr(0); - this.state = 248; + this.state = 245; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 247; + this.state = 244; this.match(QuintParser.T__8); } } @@ -906,13 +907,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 259; + this.state = 256; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 250; + this.state = 247; this.match(QuintParser.T__14); } break; @@ -920,7 +921,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 251; + this.state = 248; this.match(QuintParser.T__15); } break; @@ -928,9 +929,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 252; + this.state = 249; this.match(QuintParser.T__16); - this.state = 253; + this.state = 250; this.match(QuintParser.T__14); } break; @@ -938,9 +939,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 254; + this.state = 251; this.match(QuintParser.T__16); - this.state = 255; + this.state = 252; this.match(QuintParser.T__15); } break; @@ -948,7 +949,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 256; + this.state = 253; this.match(QuintParser.T__17); } break; @@ -956,7 +957,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 257; + this.state = 254; this.match(QuintParser.T__18); } break; @@ -964,7 +965,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 258; + this.state = 255; this.match(QuintParser.T__19); } break; @@ -990,28 +991,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 279; + this.state = 276; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 261; + this.state = 258; this.match(QuintParser.T__20); - this.state = 262; + this.state = 259; this.name(); - this.state = 263; + this.state = 260; this.match(QuintParser.T__21); - this.state = 264; + this.state = 261; this.identOrStar(); - this.state = 267; + this.state = 264; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 265; + this.state = 262; this.match(QuintParser.T__22); - this.state = 266; + this.state = 263; this.fromSource(); } } @@ -1022,30 +1023,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 269; + this.state = 266; this.match(QuintParser.T__20); - this.state = 270; + this.state = 267; this.name(); - this.state = 273; + this.state = 270; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 271; + this.state = 268; this.match(QuintParser.T__23); - this.state = 272; + this.state = 269; this.name(); } } - this.state = 277; + this.state = 274; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 275; + this.state = 272; this.match(QuintParser.T__22); - this.state = 276; + this.state = 273; this.fromSource(); } } @@ -1074,19 +1075,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 292; + this.state = 289; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 281; + this.state = 278; this.match(QuintParser.T__24); - this.state = 282; + this.state = 279; this.name(); - this.state = 283; + this.state = 280; this.match(QuintParser.T__21); - this.state = 284; + this.state = 281; this.identOrStar(); } break; @@ -1094,18 +1095,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 286; + this.state = 283; this.match(QuintParser.T__24); - this.state = 287; + this.state = 284; this.name(); - this.state = 290; + this.state = 287; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 288; + this.state = 285; this.match(QuintParser.T__23); - this.state = 289; + this.state = 286; this.name(); } } @@ -1134,60 +1135,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 340; + this.state = 337; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 294; + this.state = 291; this.match(QuintParser.T__20); - this.state = 295; + this.state = 292; this.moduleName(); - this.state = 296; + this.state = 293; this.match(QuintParser.LPAREN); { - this.state = 297; + this.state = 294; this.name(); - this.state = 298; + this.state = 295; this.match(QuintParser.ASGN); - this.state = 299; + this.state = 296; this.expr(0); - this.state = 307; + this.state = 304; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 300; + this.state = 297; this.match(QuintParser.T__7); - this.state = 301; + this.state = 298; this.name(); - this.state = 302; + this.state = 299; this.match(QuintParser.ASGN); - this.state = 303; + this.state = 300; this.expr(0); } } - this.state = 309; + this.state = 306; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 310; + this.state = 307; this.match(QuintParser.RPAREN); - this.state = 311; + this.state = 308; this.match(QuintParser.T__21); - this.state = 312; + this.state = 309; this.match(QuintParser.MUL); - this.state = 315; + this.state = 312; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 313; + this.state = 310; this.match(QuintParser.T__22); - this.state = 314; + this.state = 311; this.fromSource(); } } @@ -1198,54 +1199,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 317; + this.state = 314; this.match(QuintParser.T__20); - this.state = 318; + this.state = 315; this.moduleName(); - this.state = 319; + this.state = 316; this.match(QuintParser.LPAREN); { - this.state = 320; + this.state = 317; this.name(); - this.state = 321; + this.state = 318; this.match(QuintParser.ASGN); - this.state = 322; + this.state = 319; this.expr(0); - this.state = 330; + this.state = 327; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 323; + this.state = 320; this.match(QuintParser.T__7); - this.state = 324; + this.state = 321; this.name(); - this.state = 325; + this.state = 322; this.match(QuintParser.ASGN); - this.state = 326; + this.state = 323; this.expr(0); } } - this.state = 332; + this.state = 329; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 333; + this.state = 330; this.match(QuintParser.RPAREN); - this.state = 334; + this.state = 331; this.match(QuintParser.T__23); - this.state = 335; + this.state = 332; this.qualifiedName(); - this.state = 338; + this.state = 335; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 336; + this.state = 333; this.match(QuintParser.T__22); - this.state = 337; + this.state = 334; this.fromSource(); } } @@ -1275,7 +1276,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 342; + this.state = 339; this.qualId(); } } @@ -1300,7 +1301,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 344; + this.state = 341; this.qualId(); } } @@ -1325,7 +1326,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 346; + this.state = 343; this.qualId(); } } @@ -1350,7 +1351,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 348; + this.state = 345; this.match(QuintParser.STRING); } } @@ -1388,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 408; + this.state = 405; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: @@ -1397,51 +1398,51 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 351; + this.state = 348; this.match(QuintParser.LPAREN); - this.state = 360; + this.state = 357; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 352; + this.state = 349; this.type(0); - this.state = 357; + this.state = 354; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 353; + this.state = 350; this.match(QuintParser.T__7); - this.state = 354; + this.state = 351; this.type(0); } } } - this.state = 359; + this.state = 356; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 363; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 362; + this.state = 359; this.match(QuintParser.T__7); } } - this.state = 365; + this.state = 362; this.match(QuintParser.RPAREN); - this.state = 366; + this.state = 363; this.match(QuintParser.T__26); - this.state = 367; + this.state = 364; this.type(12); } break; @@ -1451,13 +1452,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 365; this.match(QuintParser.SET); - this.state = 369; + this.state = 366; this.match(QuintParser.T__10); - this.state = 370; + this.state = 367; this.type(0); - this.state = 371; + this.state = 368; this.match(QuintParser.T__11); } break; @@ -1467,13 +1468,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 373; + this.state = 370; this.match(QuintParser.LIST); - this.state = 374; + this.state = 371; this.match(QuintParser.T__10); - this.state = 375; + this.state = 372; this.type(0); - this.state = 376; + this.state = 373; this.match(QuintParser.T__11); } break; @@ -1483,43 +1484,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 378; + this.state = 375; this.match(QuintParser.LPAREN); - this.state = 379; + this.state = 376; this.type(0); - this.state = 380; + this.state = 377; this.match(QuintParser.T__7); - this.state = 381; + this.state = 378; this.type(0); - this.state = 386; + this.state = 383; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 382; + this.state = 379; this.match(QuintParser.T__7); - this.state = 383; + this.state = 380; this.type(0); } } } - this.state = 388; + this.state = 385; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 390; + this.state = 387; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 389; + this.state = 386; this.match(QuintParser.T__7); } } - this.state = 392; + this.state = 389; this.match(QuintParser.RPAREN); } break; @@ -1529,19 +1530,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 394; + this.state = 391; this.match(QuintParser.T__1); - this.state = 396; + this.state = 393; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 395; + this.state = 392; this.row(); } } - this.state = 398; + this.state = 395; this.match(QuintParser.T__2); } break; @@ -1551,7 +1552,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 396; this.match(QuintParser.T__27); } break; @@ -1561,7 +1562,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 397; this.match(QuintParser.T__28); } break; @@ -1571,7 +1572,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 398; this.match(QuintParser.T__29); } break; @@ -1581,7 +1582,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 402; + this.state = 399; this.typeVar(); } break; @@ -1591,7 +1592,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 403; + this.state = 400; this.qualId(); } break; @@ -1601,17 +1602,17 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 404; + this.state = 401; this.match(QuintParser.LPAREN); - this.state = 405; + this.state = 402; this.type(0); - this.state = 406; + this.state = 403; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 430; + this.state = 427; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1621,20 +1622,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 428; + this.state = 425; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 410; + this.state = 407; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 411; + this.state = 408; this.match(QuintParser.T__25); - this.state = 412; + this.state = 409; this.type(14); } break; @@ -1643,13 +1644,13 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 413; + this.state = 410; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 414; + this.state = 411; this.match(QuintParser.T__26); - this.state = 415; + this.state = 412; this.type(13); } break; @@ -1659,34 +1660,34 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 416; + this.state = 413; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } { - this.state = 417; + this.state = 414; this.match(QuintParser.T__10); - this.state = 418; + this.state = 415; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 423; + this.state = 420; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 419; + this.state = 416; this.match(QuintParser.T__7); - this.state = 420; + this.state = 417; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 425; + this.state = 422; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 426; + this.state = 423; this.match(QuintParser.T__11); } } @@ -1694,7 +1695,7 @@ export class QuintParser extends Parser { } } } - this.state = 432; + this.state = 429; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1721,7 +1722,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 433; + this.state = 430; this.match(QuintParser.LOW_ID); } } @@ -1745,7 +1746,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 456; + this.state = 453; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1753,50 +1754,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 435; + this.state = 432; this.rowLabel(); - this.state = 436; + this.state = 433; this.match(QuintParser.T__4); - this.state = 437; + this.state = 434; this.type(0); } - this.state = 446; + this.state = 443; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 439; + this.state = 436; this.match(QuintParser.T__7); - this.state = 440; + this.state = 437; this.rowLabel(); - this.state = 441; + this.state = 438; this.match(QuintParser.T__4); - this.state = 442; + this.state = 439; this.type(0); } } } - this.state = 448; + this.state = 445; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 452; + this.state = 449; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 449; + this.state = 446; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 450; + this.state = 447; this.match(QuintParser.T__12); { - this.state = 451; + this.state = 448; _localctx._rowVar = this.identifier(); } } @@ -1811,10 +1812,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 454; + this.state = 451; this.match(QuintParser.T__12); { - this.state = 455; + this.state = 452; _localctx._rowVar = this.identifier(); } } @@ -1844,7 +1845,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 458; + this.state = 455; this.simpleId("record"); } } @@ -1882,7 +1883,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 610; + this.state = 607; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1891,7 +1892,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 458; this.lambda(); } break; @@ -1901,21 +1902,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 462; + this.state = 459; this.normalCallName(); - this.state = 463; + this.state = 460; this.match(QuintParser.LPAREN); - this.state = 465; + this.state = 462; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 464; + this.state = 461; this.argList(); } } - this.state = 467; + this.state = 464; this.match(QuintParser.RPAREN); } break; @@ -1925,9 +1926,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 469; + this.state = 466; this.match(QuintParser.MINUS); - this.state = 470; + this.state = 467; this.expr(25); } break; @@ -1937,13 +1938,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 471; + this.state = 468; this.qualId(); - this.state = 472; + this.state = 469; this.match(QuintParser.T__31); - this.state = 473; + this.state = 470; this.match(QuintParser.ASGN); - this.state = 474; + this.state = 471; this.expr(21); } break; @@ -1953,41 +1954,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 476; + this.state = 473; this.match(QuintParser.AND); - this.state = 477; + this.state = 474; this.match(QuintParser.T__1); - this.state = 478; + this.state = 475; this.expr(0); - this.state = 483; + this.state = 480; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 479; + this.state = 476; this.match(QuintParser.T__7); - this.state = 480; + this.state = 477; this.expr(0); } } } - this.state = 485; + this.state = 482; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 487; + this.state = 484; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 486; + this.state = 483; this.match(QuintParser.T__7); } } - this.state = 489; + this.state = 486; this.match(QuintParser.T__2); } break; @@ -1997,41 +1998,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 491; + this.state = 488; this.match(QuintParser.OR); - this.state = 492; + this.state = 489; this.match(QuintParser.T__1); - this.state = 493; + this.state = 490; this.expr(0); - this.state = 498; + this.state = 495; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 494; + this.state = 491; this.match(QuintParser.T__7); - this.state = 495; + this.state = 492; this.expr(0); } } } - this.state = 500; + this.state = 497; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 502; + this.state = 499; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 501; + this.state = 498; this.match(QuintParser.T__7); } } - this.state = 504; + this.state = 501; this.match(QuintParser.T__2); } break; @@ -2041,7 +2042,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 506; + this.state = 503; this.matchSumExpr(); } break; @@ -2051,41 +2052,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 507; + this.state = 504; this.match(QuintParser.T__32); - this.state = 508; + this.state = 505; this.match(QuintParser.T__1); - this.state = 509; + this.state = 506; this.expr(0); - this.state = 514; + this.state = 511; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 510; + this.state = 507; this.match(QuintParser.T__7); - this.state = 511; + this.state = 508; this.expr(0); } } } - this.state = 516; + this.state = 513; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 518; + this.state = 515; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 517; + this.state = 514; this.match(QuintParser.T__7); } } - this.state = 520; + this.state = 517; this.match(QuintParser.T__2); } break; @@ -2095,41 +2096,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 522; + this.state = 519; this.match(QuintParser.T__33); - this.state = 523; + this.state = 520; this.match(QuintParser.T__1); - this.state = 524; + this.state = 521; this.expr(0); - this.state = 529; + this.state = 526; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 525; + this.state = 522; this.match(QuintParser.T__7); - this.state = 526; + this.state = 523; this.expr(0); } } } - this.state = 531; + this.state = 528; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 533; + this.state = 530; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 532; + this.state = 529; this.match(QuintParser.T__7); } } - this.state = 535; + this.state = 532; this.match(QuintParser.T__2); } break; @@ -2139,31 +2140,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 541; + this.state = 538; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 537; + this.state = 534; this.qualId(); } break; case QuintParser.INT: { - this.state = 538; + this.state = 535; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 539; + this.state = 536; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 540; + this.state = 537; this.match(QuintParser.STRING); } break; @@ -2178,43 +2179,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 543; + this.state = 540; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 541; this.expr(0); - this.state = 545; + this.state = 542; this.match(QuintParser.T__7); - this.state = 546; + this.state = 543; this.expr(0); - this.state = 551; + this.state = 548; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 547; + this.state = 544; this.match(QuintParser.T__7); - this.state = 548; + this.state = 545; this.expr(0); } } } - this.state = 553; + this.state = 550; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 555; + this.state = 552; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 554; + this.state = 551; this.match(QuintParser.T__7); } } - this.state = 557; + this.state = 554; this.match(QuintParser.RPAREN); } break; @@ -2224,39 +2225,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 556; this.match(QuintParser.T__1); - this.state = 560; + this.state = 557; this.recElem(); - this.state = 565; + this.state = 562; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 561; + this.state = 558; this.match(QuintParser.T__7); - this.state = 562; + this.state = 559; this.recElem(); } } } - this.state = 567; + this.state = 564; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 569; + this.state = 566; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 568; + this.state = 565; this.match(QuintParser.T__7); } } - this.state = 571; + this.state = 568; this.match(QuintParser.T__2); } break; @@ -2266,47 +2267,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 573; + this.state = 570; this.match(QuintParser.T__10); - this.state = 582; + this.state = 579; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 574; + this.state = 571; this.expr(0); - this.state = 579; + this.state = 576; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 575; + this.state = 572; this.match(QuintParser.T__7); - this.state = 576; + this.state = 573; this.expr(0); } } } - this.state = 581; + this.state = 578; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 585; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 584; + this.state = 581; this.match(QuintParser.T__7); } } - this.state = 587; + this.state = 584; this.match(QuintParser.T__11); } break; @@ -2316,19 +2317,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 585; this.match(QuintParser.T__34); - this.state = 589; + this.state = 586; this.match(QuintParser.LPAREN); - this.state = 590; + this.state = 587; this.expr(0); - this.state = 591; + this.state = 588; this.match(QuintParser.RPAREN); - this.state = 592; + this.state = 589; this.expr(0); - this.state = 593; + this.state = 590; this.match(QuintParser.T__35); - this.state = 594; + this.state = 591; this.expr(5); } break; @@ -2338,9 +2339,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 593; this.operDef(); - this.state = 597; + this.state = 594; this.expr(4); } break; @@ -2350,9 +2351,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 599; + this.state = 596; this.nondetOperDef(); - this.state = 600; + this.state = 597; this.expr(3); } break; @@ -2362,11 +2363,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 599; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 600; this.expr(0); - this.state = 604; + this.state = 601; this.match(QuintParser.RPAREN); } break; @@ -2376,17 +2377,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 606; + this.state = 603; this.match(QuintParser.T__1); - this.state = 607; + this.state = 604; this.expr(0); - this.state = 608; + this.state = 605; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 661; + this.state = 658; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2396,20 +2397,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 659; + this.state = 656; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 612; + this.state = 609; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 613; + this.state = 610; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 614; + this.state = 611; this.expr(26); } break; @@ -2418,11 +2419,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; + this.state = 612; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 616; + this.state = 613; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2435,7 +2436,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; + this.state = 614; this.expr(25); } break; @@ -2444,11 +2445,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; + this.state = 615; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 619; + this.state = 616; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2461,7 +2462,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; + this.state = 617; this.expr(24); } break; @@ -2470,11 +2471,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 618; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 622; + this.state = 619; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2487,7 +2488,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 623; + this.state = 620; this.expr(23); } break; @@ -2496,13 +2497,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; + this.state = 621; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 625; + this.state = 622; this.match(QuintParser.ASGN); - this.state = 626; + this.state = 623; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2515,13 +2516,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; + this.state = 626; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 630; + this.state = 627; this.match(QuintParser.AND); - this.state = 631; + this.state = 628; this.expr(19); } break; @@ -2530,13 +2531,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; + this.state = 629; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 633; + this.state = 630; this.match(QuintParser.OR); - this.state = 634; + this.state = 631; this.expr(17); } break; @@ -2545,13 +2546,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; + this.state = 632; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 636; + this.state = 633; this.match(QuintParser.IFF); - this.state = 637; + this.state = 634; this.expr(16); } break; @@ -2560,13 +2561,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; + this.state = 635; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 639; + this.state = 636; this.match(QuintParser.IMPLIES); - this.state = 640; + this.state = 637; this.expr(15); } break; @@ -2575,13 +2576,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; + this.state = 638; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 642; + this.state = 639; this.match(QuintParser.T__25); - this.state = 643; + this.state = 640; this.expr(9); } break; @@ -2590,32 +2591,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 644; + this.state = 641; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 645; + this.state = 642; this.match(QuintParser.T__21); - this.state = 646; + this.state = 643; this.nameAfterDot(); - this.state = 652; + this.state = 649; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 647; + this.state = 644; this.match(QuintParser.LPAREN); - this.state = 649; + this.state = 646; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 648; + this.state = 645; this.argList(); } } - this.state = 651; + this.state = 648; this.match(QuintParser.RPAREN); } break; @@ -2627,22 +2628,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 654; + this.state = 651; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 655; + this.state = 652; this.match(QuintParser.T__10); - this.state = 656; + this.state = 653; this.expr(0); - this.state = 657; + this.state = 654; this.match(QuintParser.T__11); } break; } } } - this.state = 663; + this.state = 660; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2670,43 +2671,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 661; this.match(QuintParser.MATCH); - this.state = 665; + this.state = 662; this.expr(0); - this.state = 666; + this.state = 663; this.match(QuintParser.T__1); - this.state = 668; + this.state = 665; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 667; + this.state = 664; this.match(QuintParser.T__12); } } - this.state = 670; + this.state = 667; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 675; + this.state = 672; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 671; + this.state = 668; this.match(QuintParser.T__12); - this.state = 672; + this.state = 669; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 677; + this.state = 674; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 675; this.match(QuintParser.T__2); } } @@ -2731,28 +2732,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 682; + this.state = 679; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 680; + this.state = 677; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 681; + this.state = 678; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 684; + this.state = 681; this.match(QuintParser.T__26); - this.state = 685; + this.state = 682; this.expr(0); } } @@ -2779,36 +2780,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 687; + this.state = 684; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 694; + this.state = 691; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 688; + this.state = 685; this.match(QuintParser.LPAREN); - this.state = 691; + this.state = 688; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 689; + this.state = 686; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 690; + this.state = 687; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 693; + this.state = 690; this.match(QuintParser.RPAREN); } } @@ -2834,15 +2835,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 705; + this.state = 702; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 696; + this.state = 693; this.declaration(); - this.state = 697; + this.state = 694; this.match(QuintParser.EOF); } break; @@ -2850,9 +2851,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 696; this.expr(0); - this.state = 700; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2860,9 +2861,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 702; + this.state = 699; this.match(QuintParser.DOCCOMMENT); - this.state = 703; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2870,7 +2871,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 704; + this.state = 701; this.match(QuintParser.EOF); } break; @@ -2895,13 +2896,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 709; + this.state = 706; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 704; this.lambdaUnsugared(); } break; @@ -2909,7 +2910,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 705; this.lambdaTupleSugar(); } break; @@ -2935,7 +2936,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 728; + this.state = 725; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2943,42 +2944,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 708; this.parameter(); - this.state = 712; + this.state = 709; this.match(QuintParser.T__26); - this.state = 713; + this.state = 710; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 715; + this.state = 712; this.match(QuintParser.LPAREN); - this.state = 716; + this.state = 713; this.parameter(); - this.state = 721; + this.state = 718; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 717; + this.state = 714; this.match(QuintParser.T__7); - this.state = 718; + this.state = 715; this.parameter(); } } - this.state = 723; + this.state = 720; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 724; + this.state = 721; this.match(QuintParser.RPAREN); - this.state = 725; + this.state = 722; this.match(QuintParser.T__26); - this.state = 726; + this.state = 723; this.expr(0); } break; @@ -3008,35 +3009,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 730; + this.state = 727; this.match(QuintParser.LPAREN); - this.state = 731; + this.state = 728; this.match(QuintParser.LPAREN); - this.state = 732; + this.state = 729; this.parameter(); - this.state = 735; + this.state = 732; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 733; + this.state = 730; this.match(QuintParser.T__7); - this.state = 734; + this.state = 731; this.parameter(); } } - this.state = 737; + this.state = 734; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 739; + this.state = 736; this.match(QuintParser.RPAREN); - this.state = 740; + this.state = 737; this.match(QuintParser.RPAREN); - this.state = 741; + this.state = 738; this.match(QuintParser.T__26); - this.state = 742; + this.state = 739; this.expr(0); } } @@ -3059,13 +3060,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 746; + this.state = 743; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 741; this.match(QuintParser.T__36); } break; @@ -3073,7 +3074,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 742; this.qualId(); } break; @@ -3102,8 +3103,37 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { + this.state = 745; + _localctx._paramName = this.identOrHole(); + } + } + 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 annotatedParameter(): AnnotatedParameterContext { + let _localctx: AnnotatedParameterContext = new AnnotatedParameterContext(this._ctx, this.state); + this.enterRule(_localctx, 64, QuintParser.RULE_annotatedParameter); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 747; + _localctx._paramName = this.identOrHole(); this.state = 748; - this.identOrHole(); + this.match(QuintParser.T__4); + this.state = 749; + this.type(0); } } catch (re) { @@ -3123,15 +3153,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 752; + this.state = 753; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 751; this.match(QuintParser.MUL); } break; @@ -3139,7 +3169,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 751; + this.state = 752; this.qualId(); } break; @@ -3164,26 +3194,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_argList); + this.enterRule(_localctx, 68, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 755; this.expr(0); - this.state = 759; + this.state = 760; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 755; - this.match(QuintParser.T__7); this.state = 756; + this.match(QuintParser.T__7); + this.state = 757; this.expr(0); } } - this.state = 761; + this.state = 762; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3206,29 +3236,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_recElem); + this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 768; + this.state = 769; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; - this.simpleId("record"); this.state = 763; - this.match(QuintParser.T__4); + this.simpleId("record"); this.state = 764; + this.match(QuintParser.T__4); + this.state = 765; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 766; - this.match(QuintParser.T__37); this.state = 767; + this.match(QuintParser.T__37); + this.state = 768; this.expr(0); } break; @@ -3253,17 +3283,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 772; + this.state = 773; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 771; this.qualId(); } break; @@ -3276,7 +3306,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 771; + this.state = 772; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3312,17 +3342,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 776; + this.state = 777; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 775; this.qualId(); } break; @@ -3332,7 +3362,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 776; _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))) { @@ -3368,12 +3398,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 74, QuintParser.RULE_operator); + this.enterRule(_localctx, 76, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 779; _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); @@ -3404,12 +3434,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_literal); + this.enterRule(_localctx, 78, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 781; _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); @@ -3440,28 +3470,28 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 78, QuintParser.RULE_qualId); + this.enterRule(_localctx, 80, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 783; this.identifier(); - this.state = 787; + this.state = 788; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 783; - this.match(QuintParser.T__38); this.state = 784; + this.match(QuintParser.T__38); + this.state = 785; this.identifier(); } } } - this.state = 789; + this.state = 790; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3484,15 +3514,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, 80, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 794; + this.state = 795; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 790; + this.state = 791; this.identifier(); } break; @@ -3500,7 +3530,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 791; + this.state = 792; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3531,12 +3561,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 82, QuintParser.RULE_identifier); + this.enterRule(_localctx, 84, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 796; + this.state = 797; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3631,7 +3661,7 @@ 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\x03H\u0321\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0322\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" + @@ -3639,420 +3669,420 @@ export class QuintParser extends Parser { "\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\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + - "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + - "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + - "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + - "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x04,\t,\x03\x02\x06\x02Z\n\x02\r\x02\x0E\x02[\x03\x02\x03\x02\x03\x03" + + "\x07\x03a\n\x03\f\x03\x0E\x03d\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07" + + "\x03j\n\x03\f\x03\x0E\x03m\v\x03\x03\x03\x03\x03\x03\x04\x07\x04r\n\x04" + + "\f\x04\x0E\x04u\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\x05\x05\x8B\n\x05\x03" + - "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + - "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x05\x06\x9B\n\x06\x03\x06\x03" + - "\x06\x05\x06\x9F\n\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x05\x06" + - "\xA6\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\xB3\n\x06\f\x06\x0E\x06\xB6\v\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xBD\n\x06\x03\x06\x05" + - "\x06\xC0\n\x06\x05\x06\xC2\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xD0\n" + - "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD7\n\b\f\b\x0E\b\xDA\v\b\x03" + - "\b\x03\b\x05\b\xDE\n\b\x03\t\x05\t\xE1\n\t\x03\t\x03\t\x03\t\x07\t\xE6" + - "\n\t\f\t\x0E\t\xE9\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xF0\n\n\x03" + - "\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x03\v\x05\v\xFB\n\v\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0106\n\f\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010E\n\r\x03\r\x03\r\x03\r\x03" + - "\r\x05\r\u0114\n\r\x03\r\x03\r\x05\r\u0118\n\r\x05\r\u011A\n\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E" + - "\u0125\n\x0E\x05\x0E\u0127\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0134\n\x0F\f" + - "\x0F\x0E\x0F\u0137\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + - "\u013E\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u014B\n\x0F\f\x0F\x0E\x0F\u014E\v" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0155\n\x0F\x05\x0F" + - "\u0157\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03" + - "\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0166\n\x14\f\x14" + - "\x0E\x14\u0169\v\x14\x05\x14\u016B\n\x14\x03\x14\x05\x14\u016E\n\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x07\x14\u0183\n\x14\f\x14\x0E\x14\u0186\v\x14\x03\x14\x05\x14\u0189" + - "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018F\n\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + - "\x14\u019B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A8\n\x14\f\x14\x0E\x14\u01AB" + - "\v\x14\x03\x14\x03\x14\x07\x14\u01AF\n\x14\f\x14\x0E\x14\u01B2\v\x14\x03" + - "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u01BF\n\x16\f\x16\x0E\x16\u01C2\v\x16\x03\x16\x03" + - "\x16\x03\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x05\x16\u01CB\n\x16\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01D4\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01E4\n\x18\f\x18\x0E" + - "\x18\u01E7\v\x18\x03\x18\x05\x18\u01EA\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F3\n\x18\f\x18\x0E\x18\u01F6\v" + - "\x18\x03\x18\x05\x18\u01F9\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x07\x18\u0203\n\x18\f\x18\x0E\x18\u0206\v\x18" + - "\x03\x18\x05\x18\u0209\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0212\n\x18\f\x18\x0E\x18\u0215\v\x18\x03\x18\x05" + - "\x18\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0220\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0228" + - "\n\x18\f\x18\x0E\x18\u022B\v\x18\x03\x18\x05\x18\u022E\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18" + - "\u0239\v\x18\x03\x18\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18" + - "\u0249\n\x18\x03\x18\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8D\n" + + "\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x95\n\x06" + + "\f\x06\x0E\x06\x98\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06" + + "\x9F\n\x06\x03\x06\x05\x06\xA2\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x05\x06\xAF\n\x06" + + "\x03\x06\x05\x06\xB2\n\x06\x03\x06\x03\x06\x05\x06\xB6\n\x06\x03\x06\x03" + + "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + + "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + + "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x03\b\x05\b\xDB\n\b\x03\t\x05\t\xDE" + + "\n\t\x03\t\x03\t\x03\t\x07\t\xE3\n\t\f\t\x0E\t\xE6\v\t\x03\n\x03\n\x03" + + "\n\x03\n\x03\n\x05\n\xED\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + + "\v\x03\v\x03\v\x05\v\xF8\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f" + + "\x03\f\x03\f\x05\f\u0103\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + + "\u010B\n\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0111\n\r\x03\r\x03\r\x05\r\u0115" + + "\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x05\x0E\u0122\n\x0E\x05\x0E\u0124\n\x0E\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x07\x0F\u0131\n\x0F\f\x0F\x0E\x0F\u0134\v\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x05\x0F\u013B\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0148" + + "\n\x0F\f\x0F\x0E\x0F\u014B\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x05\x0F\u0152\n\x0F\x05\x0F\u0154\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11" + + "\x03\x12\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u0163\n\x14\f\x14\x0E\x14\u0166\v\x14\x05\x14\u0168\n\x14\x03" + + "\x14\x05\x14\u016B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + + "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + + "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x05\x14\u0198\n\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A5" + + "\n\x14\f\x14\x0E\x14\u01A8\v\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14\f" + + "\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16\x0E" + + "\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16\x03" + + "\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + + "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + + "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020F\n\x18\f\x18\x0E" + + "\x18\u0212\v\x18\x03\x18\x05\x18\u0215\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x05\x18\u021D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0225\n\x18\f\x18\x0E\x18\u0228\v\x18\x03\x18" + + "\x05\x18\u022B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u0233\n\x18\f\x18\x0E\x18\u0236\v\x18\x03\x18\x05\x18\u0239\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0241\n\x18\f" + + "\x18\x0E\x18\u0244\v\x18\x05\x18\u0246\n\x18\x03\x18\x05\x18\u0249\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u0265\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0262\n\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18" + - "\u028F\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18" + - "\f\x18\x0E\x18\u0299\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F" + - "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7" + - "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03" + - "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B" + - "\x05\x1B\u02B9\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8" + - "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x07\x1E\u02D2\n\x1E\f\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x03\x1E\x05\x1E\u02DB\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + - "\x1F\u02E2\n\x1F\r\x1F\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + - "\x1F\x03 \x03 \x05 \u02ED\n \x03!\x03!\x03\"\x03\"\x05\"\u02F3\n\"\x03" + - "#\x03#\x03#\x07#\u02F8\n#\f#\x0E#\u02FB\v#\x03$\x03$\x03$\x03$\x03$\x03" + - "$\x05$\u0303\n$\x03%\x03%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'" + - "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u0314\n)\f)\x0E)\u0317\v)\x03*\x03" + - "*\x03*\x03*\x05*\u031D\n*\x03+\x03+\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.\x02" + - "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + - "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + - "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02W\x03\x02" + - "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + - "\n\xC1\x03\x02\x02\x02\f\xCF\x03\x02\x02\x02\x0E\xD1\x03\x02\x02\x02\x10" + - "\xE0\x03\x02\x02\x02\x12\xEA\x03\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16" + - "\u0105\x03\x02\x02\x02\x18\u0119\x03\x02\x02\x02\x1A\u0126\x03\x02\x02" + - "\x02\x1C\u0156\x03\x02\x02\x02\x1E\u0158\x03\x02\x02\x02 \u015A\x03\x02" + - "\x02\x02\"\u015C\x03\x02\x02\x02$\u015E\x03\x02\x02\x02&\u019A\x03\x02" + - "\x02\x02(\u01B3\x03\x02\x02\x02*\u01CA\x03\x02\x02\x02,\u01CC\x03\x02" + - "\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03\x02" + - "\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03\x02" + - "\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03\x02" + - "\x02\x02@\u02EE\x03\x02\x02\x02B\u02F2\x03\x02\x02\x02D\u02F4\x03\x02" + - "\x02\x02F\u0302\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03\x02" + - "\x02\x02L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02" + - "\x02\x02R\u031C\x03\x02\x02\x02T\u031E\x03\x02\x02\x02VX\x05\x04\x03\x02" + - "WV\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + - "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + - "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + - "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + - "ei\x07\x04\x02\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02" + - "ig\x03\x02\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02" + - "lm\x07\x05\x02\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02" + - "ps\x03\x02\x02\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02" + - "sq\x03\x02\x02\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02" + - "\x02wx\x05P)\x02xy\x07\x07\x02\x02yz\x05&\x14\x02z\x8B\x03\x02\x02\x02" + - "{|\x07\b\x02\x02|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05&\x14\x02\x7F\x8B" + - "\x03\x02\x02\x02\x80\x81\x07\t\x02\x02\x81\x82\x05> \x02\x82\x83\x07>" + - "\x02\x02\x83\x84\x05.\x18\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1C" + - "\x0F\x02\x86\x8B\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x18\r" + - "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + - "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + - "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + - "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\x9A\x05H%\x02\x8E\x97" + - "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + - "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + - "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + - "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + - "\x99\x9B\x07@\x02\x02\x9A\x8E\x03\x02\x02\x02\x9A\x9B\x03\x02\x02\x02" + - "\x9B\x9E\x03\x02\x02\x02\x9C\x9D\x07\x07\x02\x02\x9D\x9F\x05&\x14\x02" + - "\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA2\x03\x02\x02\x02" + - "\xA0\xA1\x07>\x02\x02\xA1\xA3\x05.\x18\x02\xA2\xA0\x03\x02\x02\x02\xA2" + - "\xA3\x03\x02\x02\x02\xA3\xA5\x03\x02\x02\x02\xA4\xA6\x07\v\x02\x02\xA5" + - "\xA4\x03\x02\x02\x02\xA5\xA6\x03\x02\x02\x02\xA6\xC2\x03\x02\x02\x02\xA7" + - "\xA8\x05\x16\f\x02\xA8\xA9\x05H%\x02\xA9\xAA\x07?\x02\x02\xAA\xAB\x05" + - "@!\x02\xAB\xAC\x07\x07\x02\x02\xAC\xB4\x05&\x14\x02\xAD\xAE\x07\n\x02" + - "\x02\xAE\xAF\x05@!\x02\xAF\xB0\x07\x07\x02\x02\xB0\xB1\x05&\x14\x02\xB1" + - "\xB3\x03\x02\x02\x02\xB2\xAD\x03\x02\x02\x02\xB3\xB6\x03\x02\x02\x02\xB4" + - "\xB2\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5\xB7\x03\x02\x02\x02\xB6" + - "\xB4\x03\x02\x02\x02\xB7\xB8\x07@\x02\x02\xB8\xB9\x07\x07\x02\x02\xB9" + - "\xBC\x05&\x14\x02\xBA\xBB\x07>\x02\x02\xBB\xBD\x05.\x18\x02\xBC\xBA\x03" + - "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\xC0\x07" + - "\v\x02\x02\xBF\xBE\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC2\x03" + - "\x02\x02\x02\xC1\x8C\x03\x02\x02\x02\xC1\xA7\x03\x02\x02\x02\xC2\v\x03" + - "\x02\x02\x02\xC3\xC4\x07\f\x02\x02\xC4\xD0\x05P)\x02\xC5\xC6\x07\f\x02" + - "\x02\xC6\xC7\x05\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05&\x14\x02\xC9" + - "\xD0\x03\x02\x02\x02\xCA\xCB\x07\f\x02\x02\xCB\xCC\x05\x0E\b\x02\xCC\xCD" + - "\x07>\x02\x02\xCD\xCE\x05\x10\t\x02\xCE\xD0\x03\x02\x02\x02\xCF\xC3\x03" + - "\x02\x02\x02\xCF\xC5\x03\x02\x02\x02\xCF\xCA\x03\x02\x02\x02\xD0\r\x03" + - "\x02\x02\x02\xD1\xDD\x05P)\x02\xD2\xD3\x07\r\x02\x02\xD3\xD8\x05(\x15" + - "\x02\xD4\xD5\x07\n\x02\x02\xD5\xD7\x05(\x15\x02\xD6\xD4\x03\x02\x02\x02" + - "\xD7\xDA\x03\x02\x02\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + - "\xD9\xDB\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02\xDB\xDC\x07\x0E\x02\x02" + - "\xDC\xDE\x03\x02\x02\x02\xDD\xD2\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + - "\xDE\x0F\x03\x02\x02\x02\xDF\xE1\x07\x0F\x02\x02\xE0\xDF\x03\x02\x02\x02" + - "\xE0\xE1\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\xE7\x05\x12\n\x02" + - "\xE3\xE4\x07\x0F\x02\x02\xE4\xE6\x05\x12\n\x02\xE5\xE3\x03\x02\x02\x02" + - "\xE6\xE9\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02" + - "\xE8\x11\x03\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEF\x05R*\x02\xEB" + - "\xEC\x07?\x02\x02\xEC\xED\x05&\x14\x02\xED\xEE\x07@\x02\x02\xEE\xF0\x03" + - "\x02\x02\x02\xEF\xEB\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\x13\x03" + - "\x02\x02\x02\xF1\xF2\x07\x10\x02\x02\xF2\xF5\x05P)\x02\xF3\xF4\x07\x07" + - "\x02\x02\xF4\xF6\x05&\x14\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF6\x03\x02" + - "\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\xF8\x07>\x02\x02\xF8\xFA\x05.\x18" + - "\x02\xF9\xFB\x07\v\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02" + - "\x02\xFB\x15\x03\x02\x02\x02\xFC\u0106\x07\x11\x02\x02\xFD\u0106\x07\x12" + - "\x02\x02\xFE\xFF\x07\x13\x02\x02\xFF\u0106\x07\x11\x02\x02\u0100\u0101" + - "\x07\x13\x02\x02\u0101\u0106\x07\x12\x02\x02\u0102\u0106\x07\x14\x02\x02" + - "\u0103\u0106\x07\x15\x02\x02\u0104\u0106\x07\x16\x02\x02\u0105\xFC\x03" + - "\x02\x02\x02\u0105\xFD\x03\x02\x02\x02\u0105\xFE\x03\x02\x02\x02\u0105" + - "\u0100\x03\x02\x02\x02\u0105\u0102\x03\x02\x02\x02\u0105\u0103\x03\x02" + - "\x02\x02\u0105\u0104\x03\x02\x02\x02\u0106\x17\x03\x02\x02\x02\u0107\u0108" + - "\x07\x17\x02\x02\u0108\u0109\x05 \x11\x02\u0109\u010A\x07\x18\x02\x02" + - "\u010A\u010D\x05B\"\x02\u010B\u010C\x07\x19\x02\x02\u010C\u010E\x05$\x13" + - "\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\u011A" + - "\x03\x02\x02\x02\u010F\u0110\x07\x17\x02\x02\u0110\u0113\x05 \x11\x02" + - "\u0111\u0112\x07\x1A\x02\x02\u0112\u0114\x05 \x11\x02\u0113\u0111\x03" + - "\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115" + - "\u0116\x07\x19\x02\x02\u0116\u0118\x05$\x13\x02\u0117\u0115\x03\x02\x02" + - "\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011A\x03\x02\x02\x02\u0119\u0107" + - "\x03\x02\x02\x02\u0119\u010F\x03\x02\x02\x02\u011A\x19\x03\x02\x02\x02" + - "\u011B\u011C\x07\x1B\x02\x02\u011C\u011D\x05 \x11\x02\u011D\u011E\x07" + - "\x18\x02\x02\u011E\u011F\x05B\"\x02\u011F\u0127\x03\x02\x02\x02\u0120" + - "\u0121\x07\x1B\x02\x02\u0121\u0124\x05 \x11\x02\u0122\u0123\x07\x1A\x02" + - "\x02\u0123\u0125\x05 \x11\x02\u0124\u0122\x03\x02\x02\x02\u0124\u0125" + - "\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126\u011B\x03\x02\x02\x02" + - "\u0126\u0120\x03\x02\x02\x02\u0127\x1B\x03\x02\x02\x02\u0128\u0129\x07" + - "\x17\x02\x02\u0129\u012A\x05\x1E\x10\x02\u012A\u012B\x07?\x02\x02\u012B" + - "\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u0135\x05.\x18\x02" + - "\u012E\u012F\x07\n\x02\x02\u012F\u0130\x05 \x11\x02\u0130\u0131\x07>\x02" + - "\x02\u0131\u0132\x05.\x18\x02\u0132\u0134\x03\x02\x02\x02\u0133\u012E" + - "\x03\x02\x02\x02\u0134\u0137\x03\x02\x02\x02\u0135\u0133\x03\x02\x02\x02" + - "\u0135\u0136\x03\x02\x02\x02\u0136\u0138\x03\x02\x02\x02\u0137\u0135\x03" + - "\x02\x02\x02\u0138\u0139\x07@\x02\x02\u0139\u013A\x07\x18\x02\x02\u013A" + - "\u013D\x075\x02\x02\u013B\u013C\x07\x19\x02\x02\u013C\u013E\x05$\x13\x02" + - "\u013D\u013B\x03\x02\x02\x02\u013D\u013E\x03\x02\x02\x02\u013E\u0157\x03" + - "\x02\x02\x02\u013F\u0140\x07\x17\x02\x02\u0140\u0141\x05\x1E\x10\x02\u0141" + - "\u0142\x07?\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02\x02" + - "\u0144\u014C\x05.\x18\x02\u0145\u0146\x07\n\x02\x02\u0146\u0147\x05 \x11" + - "\x02\u0147\u0148\x07>\x02\x02\u0148\u0149\x05.\x18\x02\u0149\u014B\x03" + - "\x02\x02\x02\u014A\u0145\x03\x02\x02\x02\u014B\u014E\x03\x02\x02\x02\u014C" + - "\u014A\x03\x02\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u014F\x03\x02" + - "\x02\x02\u014E\u014C\x03\x02\x02\x02\u014F\u0150\x07@\x02\x02\u0150\u0151" + - "\x07\x1A\x02\x02\u0151\u0154\x05\"\x12\x02\u0152\u0153\x07\x19\x02\x02" + - "\u0153\u0155\x05$\x13\x02\u0154\u0152\x03\x02\x02\x02\u0154\u0155\x03" + - "\x02\x02\x02\u0155\u0157\x03\x02\x02\x02\u0156\u0128\x03\x02\x02\x02\u0156" + - "\u013F\x03\x02\x02\x02\u0157\x1D\x03\x02\x02\x02\u0158\u0159\x05P)\x02" + - "\u0159\x1F\x03\x02\x02\x02\u015A\u015B\x05P)\x02\u015B!\x03\x02\x02\x02" + - "\u015C\u015D\x05P)\x02\u015D#\x03\x02\x02\x02\u015E\u015F\x07*\x02\x02" + - "\u015F%\x03\x02\x02\x02\u0160\u0161\b\x14\x01\x02\u0161\u016A\x07?\x02" + - "\x02\u0162\u0167\x05&\x14\x02\u0163\u0164\x07\n\x02\x02\u0164\u0166\x05" + - "&\x14\x02\u0165\u0163\x03\x02\x02\x02\u0166\u0169\x03\x02\x02\x02\u0167" + - "\u0165\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016B\x03\x02" + - "\x02\x02\u0169\u0167\x03\x02\x02\x02\u016A\u0162\x03\x02\x02\x02\u016A" + - "\u016B\x03\x02\x02\x02\u016B\u016D\x03\x02\x02\x02\u016C\u016E\x07\n\x02" + - "\x02\u016D\u016C\x03\x02\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u016F" + - "\x03\x02\x02\x02\u016F\u0170\x07@\x02\x02\u0170\u0171\x07\x1D\x02\x02" + - "\u0171\u019B\x05&\x14\x0E\u0172\u0173\x07A\x02\x02\u0173\u0174\x07\r\x02" + - "\x02\u0174\u0175\x05&\x14\x02\u0175\u0176\x07\x0E\x02\x02\u0176\u019B" + - "\x03\x02\x02\x02\u0177\u0178\x07B\x02\x02\u0178\u0179\x07\r\x02\x02\u0179" + - "\u017A\x05&\x14\x02\u017A\u017B\x07\x0E\x02\x02\u017B\u019B\x03\x02\x02" + - "\x02\u017C\u017D\x07?\x02\x02\u017D\u017E\x05&\x14\x02\u017E\u017F\x07" + - "\n\x02\x02\u017F\u0184\x05&\x14\x02\u0180\u0181\x07\n\x02\x02\u0181\u0183" + - "\x05&\x14\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0186\x03\x02\x02\x02" + - "\u0184\u0182\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0188\x03" + - "\x02\x02\x02\u0186\u0184\x03\x02\x02\x02\u0187\u0189\x07\n\x02\x02\u0188" + - "\u0187\x03\x02\x02\x02\u0188\u0189\x03\x02\x02\x02\u0189\u018A\x03\x02" + - "\x02\x02\u018A\u018B\x07@\x02\x02\u018B\u019B\x03\x02\x02\x02\u018C\u018E" + - "\x07\x04\x02\x02\u018D\u018F\x05*\x16\x02\u018E\u018D\x03\x02\x02\x02" + - "\u018E\u018F\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x07" + - "\x05\x02\x02\u0191\u019B\x07\x1E\x02\x02\u0192\u019B\x07\x1F\x02\x02\u0193" + - "\u019B\x07 \x02\x02\u0194\u019B\x05(\x15\x02\u0195\u019B\x05P)\x02\u0196" + - "\u0197\x07?\x02\x02\u0197\u0198\x05&\x14\x02\u0198\u0199\x07@\x02\x02" + - "\u0199\u019B\x03\x02\x02\x02\u019A\u0160\x03\x02\x02\x02\u019A\u0172\x03" + - "\x02\x02\x02\u019A\u0177\x03\x02\x02\x02\u019A\u017C\x03\x02\x02\x02\u019A" + - "\u018C\x03\x02\x02\x02\u019A\u0191\x03\x02\x02\x02\u019A\u0192\x03\x02" + - "\x02\x02\u019A\u0193\x03\x02\x02\x02\u019A\u0194\x03\x02\x02\x02\u019A" + - "\u0195\x03\x02\x02\x02\u019A\u0196\x03\x02\x02\x02\u019B\u01B0\x03\x02" + - "\x02\x02\u019C\u019D\f\x10\x02\x02\u019D\u019E\x07\x1C\x02\x02\u019E\u01AF" + - "\x05&\x14\x10\u019F\u01A0\f\x0F\x02\x02\u01A0\u01A1\x07\x1D\x02\x02\u01A1" + - "\u01AF\x05&\x14\x0F\u01A2\u01A3\f\x03\x02\x02\u01A3\u01A4\x07\r\x02\x02" + - "\u01A4\u01A9\x05&\x14\x02\u01A5\u01A6\x07\n\x02\x02\u01A6\u01A8\x05&\x14" + - "\x02\u01A7\u01A5\x03\x02\x02\x02\u01A8\u01AB\x03\x02\x02\x02\u01A9\u01A7" + - "\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02" + - "\u01AB\u01A9\x03\x02\x02\x02\u01AC\u01AD\x07\x0E\x02\x02\u01AD\u01AF\x03" + - "\x02\x02\x02\u01AE\u019C\x03\x02\x02\x02\u01AE\u019F\x03\x02\x02\x02\u01AE" + - "\u01A2\x03\x02\x02\x02\u01AF\u01B2\x03\x02\x02\x02\u01B0\u01AE\x03\x02" + - "\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\'\x03\x02\x02\x02\u01B2\u01B0" + - "\x03\x02\x02\x02\u01B3\u01B4\x07C\x02\x02\u01B4)\x03\x02\x02\x02\u01B5" + - "\u01B6\x05,\x17\x02\u01B6\u01B7\x07\x07\x02\x02\u01B7\u01B8\x05&\x14\x02" + - "\u01B8\u01C0\x03\x02\x02\x02\u01B9\u01BA\x07\n\x02\x02\u01BA\u01BB\x05" + - ",\x17\x02\u01BB\u01BC\x07\x07\x02\x02\u01BC\u01BD\x05&\x14\x02\u01BD\u01BF" + - "\x03\x02\x02\x02\u01BE\u01B9\x03\x02\x02\x02\u01BF\u01C2\x03\x02\x02\x02" + - "\u01C0\u01BE\x03\x02\x02\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1\u01C6\x03" + - "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3\u01C7\x07\n\x02\x02\u01C4" + - "\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05T+\x02\u01C6\u01C3\x03\x02\x02\x02" + - "\u01C6\u01C4\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CB\x03" + - "\x02\x02\x02\u01C8\u01C9\x07\x0F\x02\x02\u01C9\u01CB\x05T+\x02\u01CA\u01B5" + - "\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB+\x03\x02\x02\x02\u01CC" + - "\u01CD\x05R*\x02\u01CD-\x03\x02\x02\x02\u01CE\u01CF\b\x18\x01\x02\u01CF" + - "\u0265\x058\x1D\x02\u01D0\u01D1\x05H%\x02\u01D1\u01D3\x07?\x02\x02\u01D2" + - "\u01D4\x05D#\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3\u01D4\x03\x02\x02\x02" + - "\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D6\x07@\x02\x02\u01D6\u0265\x03" + - "\x02\x02\x02\u01D7\u01D8\x074\x02\x02\u01D8\u0265\x05.\x18\x1B\u01D9\u01DA" + - "\x05P)\x02\u01DA\u01DB\x07\"\x02\x02\u01DB\u01DC\x07>\x02\x02\u01DC\u01DD" + - "\x05.\x18\x17\u01DD\u0265\x03\x02\x02\x02\u01DE\u01DF\x07-\x02\x02\u01DF" + - "\u01E0\x07\x04\x02\x02\u01E0\u01E5\x05.\x18\x02\u01E1\u01E2\x07\n\x02" + - "\x02\u01E2\u01E4\x05.\x18\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7" + - "\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02" + - "\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07" + - "\n\x02\x02\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA" + - "\u01EB\x03\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0265\x03\x02" + - "\x02\x02\u01ED\u01EE\x07.\x02\x02"; + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05" + + "\x18\u0289\n\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0293\n\x18\f\x18\x0E\x18\u0296\v\x18\x03\x19\x03" + + "\x19\x03\x19\x03\x19\x05\x19\u029C\n\x19\x03\x19\x03\x19\x03\x19\x07\x19" + + "\u02A1\n\x19\f\x19\x0E\x19\u02A4\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A" + + "\x05\x1A\u02AA\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x05\x1B\u02B3\n\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C1\n\x1C" + + "\x03\x1D\x03\x1D\x05\x1D\u02C5\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02CF\n\x1E\f\x1E\x0E\x1E\u02D2\v" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D8\n\x1E\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02DF\n\x1F\r\x1F\x0E\x1F\u02E0\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EA\n \x03!\x03!\x03" + + "\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F4\n#\x03$\x03$\x03$\x07$\u02F9" + + "\n$\f$\x0E$\u02FC\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0304\n%\x03&" + + "\x03&\x05&\u0308\n&\x03\'\x03\'\x05\'\u030C\n\'\x03(\x03(\x03)\x03)\x03" + + "*\x03*\x03*\x07*\u0315\n*\f*\x0E*\u0318\v*\x03+\x03+\x03+\x03+\x05+\u031E" + + "\n+\x03,\x03,\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\x02" + + "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02" + + "T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05" + + "\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02Y\x03\x02\x02\x02\x04b\x03" + + "\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02" + + "\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDD\x03\x02" + + "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + + "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + + "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + + "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u0197\x03\x02\x02\x02(\u01B0" + + "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + + "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + + "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + + "\x03\x02\x02\x02<\u02D9\x03\x02\x02\x02>\u02E9\x03\x02\x02\x02@\u02EB" + + "\x03\x02\x02\x02B\u02ED\x03\x02\x02\x02D\u02F3\x03\x02\x02\x02F\u02F5" + + "\x03\x02\x02\x02H\u0303\x03\x02\x02\x02J\u0307\x03\x02\x02\x02L\u030B" + + "\x03\x02\x02\x02N\u030D\x03\x02\x02\x02P\u030F\x03\x02\x02\x02R\u0311" + + "\x03\x02\x02\x02T\u031D\x03\x02\x02\x02V\u031F\x03\x02\x02\x02XZ\x05\x04" + + "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + + "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + + "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + + "bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03\x02\x02" + + "fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02\x02jm\x03" + + "\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03" + + "\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02\x02qp\x03" + + "\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02\x02tv\x03" + + "\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02\x02\x02xy" + + "\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02|\x8D\x03" + + "\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02\x02\x80" + + "\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02\x83\x84" + + "\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03\x02\x02" + + "\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05\f\x07\x02" + + "\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02\x02\x02\x8C" + + "}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02\x02\x02\x8C" + + "\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02\x02\x02\x8C" + + "\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16\f\x02\x8F\x90" + + "\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93\x07\n\x02\x02" + + "\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96" + + "\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03\x02\x02\x02\x98" + + "\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B" + + "\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03" + + "\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07" + + "\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03" + + "\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02" + + "\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7" + + "\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC" + + "\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6" + + "\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2" + + "\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5" + + "\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3" + + "\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8" + + "\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03" + + "\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03" + + "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03" + + "\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07" + + "\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + + "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + + "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + + "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + + "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xDA" + + "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x05(\x15\x02\xD1\xD2\x07\n\x02" + + "\x02\xD2\xD4\x05(\x15\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + + "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + + "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xD9\x07\x0E\x02\x02\xD9\xDB\x03\x02\x02" + + "\x02\xDA\xCF\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\x0F\x03\x02\x02" + + "\x02\xDC\xDE\x07\x0F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + + "\x02\xDE\xDF\x03\x02\x02\x02\xDF\xE4\x05\x12\n\x02\xE0\xE1\x07\x0F\x02" + + "\x02\xE1\xE3\x05\x12\n\x02\xE2\xE0\x03\x02\x02\x02\xE3\xE6\x03\x02\x02" + + "\x02\xE4\xE2\x03\x02\x02\x02\xE4\xE5\x03\x02\x02\x02\xE5\x11\x03\x02\x02" + + "\x02\xE6\xE4\x03\x02\x02\x02\xE7\xEC\x05T+\x02\xE8\xE9\x07?\x02\x02\xE9" + + "\xEA\x05&\x14\x02\xEA\xEB\x07@\x02\x02\xEB\xED\x03\x02\x02\x02\xEC\xE8" + + "\x03\x02\x02\x02\xEC\xED\x03\x02\x02\x02\xED\x13\x03\x02\x02\x02\xEE\xEF" + + "\x07\x10\x02\x02\xEF\xF2\x05R*\x02\xF0\xF1\x07\x07\x02\x02\xF1\xF3\x05" + + "&\x14\x02\xF2\xF0\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x03" + + "\x02\x02\x02\xF4\xF5\x07>\x02\x02\xF5\xF7\x05.\x18\x02\xF6\xF8\x07\v\x02" + + "\x02\xF7\xF6\x03\x02\x02\x02\xF7\xF8\x03\x02\x02\x02\xF8\x15\x03\x02\x02" + + "\x02\xF9\u0103\x07\x11\x02\x02\xFA\u0103\x07\x12\x02\x02\xFB\xFC\x07\x13" + + "\x02\x02\xFC\u0103\x07\x11\x02\x02\xFD\xFE\x07\x13\x02\x02\xFE\u0103\x07" + + "\x12\x02\x02\xFF\u0103\x07\x14\x02\x02\u0100\u0103\x07\x15\x02\x02\u0101" + + "\u0103\x07\x16\x02\x02\u0102\xF9\x03\x02\x02\x02\u0102\xFA\x03\x02\x02" + + "\x02\u0102\xFB\x03\x02\x02\x02\u0102\xFD\x03\x02\x02\x02\u0102\xFF\x03" + + "\x02\x02\x02\u0102\u0100\x03\x02\x02\x02\u0102\u0101\x03\x02\x02\x02\u0103" + + "\x17\x03\x02\x02\x02\u0104\u0105\x07\x17\x02\x02\u0105\u0106\x05 \x11" + + "\x02\u0106\u0107\x07\x18\x02\x02\u0107\u010A\x05D#\x02\u0108\u0109\x07" + + "\x19\x02\x02\u0109\u010B\x05$\x13\x02\u010A\u0108\x03\x02\x02\x02\u010A" + + "\u010B\x03\x02\x02\x02\u010B\u0117\x03\x02\x02\x02\u010C\u010D\x07\x17" + + "\x02\x02\u010D\u0110\x05 \x11\x02\u010E\u010F\x07\x1A\x02\x02\u010F\u0111" + + "\x05 \x11\x02\u0110\u010E\x03\x02\x02\x02\u0110\u0111\x03\x02\x02\x02" + + "\u0111\u0114\x03\x02\x02\x02\u0112\u0113\x07\x19\x02\x02\u0113\u0115\x05" + + "$\x13\x02\u0114\u0112\x03\x02\x02\x02\u0114\u0115\x03\x02\x02\x02\u0115" + + "\u0117\x03\x02\x02\x02\u0116\u0104\x03\x02\x02\x02\u0116\u010C\x03\x02" + + "\x02\x02\u0117\x19\x03\x02\x02\x02\u0118\u0119\x07\x1B\x02\x02\u0119\u011A" + + "\x05 \x11\x02\u011A\u011B\x07\x18\x02\x02\u011B\u011C\x05D#\x02\u011C" + + "\u0124\x03\x02\x02\x02\u011D\u011E\x07\x1B\x02\x02\u011E\u0121\x05 \x11" + + "\x02\u011F\u0120\x07\x1A\x02\x02\u0120\u0122\x05 \x11\x02\u0121\u011F" + + "\x03\x02\x02\x02\u0121\u0122\x03\x02\x02\x02\u0122\u0124\x03\x02\x02\x02" + + "\u0123\u0118\x03\x02\x02\x02\u0123\u011D\x03\x02\x02\x02\u0124\x1B\x03" + + "\x02\x02\x02\u0125\u0126\x07\x17\x02\x02\u0126\u0127\x05\x1E\x10\x02\u0127" + + "\u0128\x07?\x02\x02\u0128\u0129\x05 \x11\x02\u0129\u012A\x07>\x02\x02" + + "\u012A\u0132\x05.\x18\x02\u012B\u012C\x07\n\x02\x02\u012C\u012D\x05 \x11" + + "\x02\u012D\u012E\x07>\x02\x02\u012E\u012F\x05.\x18\x02\u012F\u0131\x03" + + "\x02\x02\x02\u0130\u012B\x03\x02\x02\x02\u0131\u0134\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133\u0135\x03\x02" + + "\x02\x02\u0134\u0132\x03\x02\x02\x02\u0135\u0136\x07@\x02\x02\u0136\u0137" + + "\x07\x18\x02\x02\u0137\u013A\x075\x02\x02\u0138\u0139\x07\x19\x02\x02" + + "\u0139\u013B\x05$\x13\x02\u013A\u0138\x03\x02\x02\x02\u013A\u013B\x03" + + "\x02\x02\x02\u013B\u0154\x03\x02\x02\x02\u013C\u013D\x07\x17\x02\x02\u013D" + + "\u013E\x05\x1E\x10\x02\u013E\u013F\x07?\x02\x02\u013F\u0140\x05 \x11\x02" + + "\u0140\u0141\x07>\x02\x02\u0141\u0149\x05.\x18\x02\u0142\u0143\x07\n\x02" + + "\x02\u0143\u0144\x05 \x11\x02\u0144\u0145\x07>\x02\x02\u0145\u0146\x05" + + ".\x18\x02\u0146\u0148\x03\x02\x02\x02\u0147\u0142\x03\x02\x02\x02\u0148" + + "\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u0149\u014A\x03\x02" + + "\x02\x02\u014A\u014C\x03\x02\x02\x02\u014B\u0149\x03\x02\x02\x02\u014C" + + "\u014D\x07@\x02\x02\u014D\u014E\x07\x1A\x02\x02\u014E\u0151\x05\"\x12" + + "\x02\u014F\u0150\x07\x19\x02\x02\u0150\u0152\x05$\x13\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0151\u0152\x03\x02\x02\x02\u0152\u0154\x03\x02\x02\x02" + + "\u0153\u0125\x03\x02\x02\x02\u0153\u013C\x03\x02\x02\x02\u0154\x1D\x03" + + "\x02\x02\x02\u0155\u0156\x05R*\x02\u0156\x1F\x03\x02\x02\x02\u0157\u0158" + + "\x05R*\x02\u0158!\x03\x02\x02\x02\u0159\u015A\x05R*\x02\u015A#\x03\x02" + + "\x02\x02\u015B\u015C\x07*\x02\x02\u015C%\x03\x02\x02\x02\u015D\u015E\b" + + "\x14\x01\x02\u015E\u0167\x07?\x02\x02\u015F\u0164\x05&\x14\x02\u0160\u0161" + + "\x07\n\x02\x02\u0161\u0163\x05&\x14\x02\u0162\u0160\x03\x02\x02\x02\u0163" + + "\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02\u0164\u0165\x03\x02" + + "\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03\x02\x02\x02\u0167" + + "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + + "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + + "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + + "\u016D\u016E\x07\x1D\x02\x02\u016E\u0198\x05&\x14\x0E\u016F\u0170\x07" + + "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + + "\x07\x0E\x02\x02\u0173\u0198\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + + "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + + "\x02\x02\u0178\u0198\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + + "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + + "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + + "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + + "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + + "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + + "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + + "\u0198\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + + "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + + "\x03\x02\x02\x02\u018D\u0198\x07\x05\x02\x02\u018E\u0198\x07\x1E\x02\x02" + + "\u018F\u0198\x07\x1F\x02\x02\u0190\u0198\x07 \x02\x02\u0191\u0198\x05" + + "(\x15\x02\u0192\u0198\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + + "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u0198\x03\x02\x02\x02\u0197\u015D" + + "\x03\x02\x02\x02\u0197\u016F\x03\x02\x02\x02\u0197\u0174\x03\x02\x02\x02" + + "\u0197\u0179\x03\x02\x02\x02\u0197\u0189\x03\x02\x02\x02\u0197\u018E\x03" + + "\x02\x02\x02\u0197\u018F\x03\x02\x02\x02\u0197\u0190\x03\x02\x02\x02\u0197" + + "\u0191\x03\x02\x02\x02\u0197\u0192\x03\x02\x02\x02\u0197\u0193\x03\x02" + + "\x02\x02\u0198\u01AD\x03\x02\x02\x02\u0199\u019A\f\x10\x02\x02\u019A\u019B" + + "\x07\x1C\x02\x02\u019B\u01AC\x05&\x14\x10\u019C\u019D\f\x0F\x02\x02\u019D" + + "\u019E\x07\x1D\x02\x02\u019E\u01AC\x05&\x14\x0F\u019F\u01A0\f\x03\x02" + + "\x02\u01A0\u01A1\x07\r\x02\x02\u01A1\u01A6\x05&\x14\x02\u01A2\u01A3\x07" + + "\n\x02\x02\u01A3\u01A5\x05&\x14\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A8\x03\x02\x02\x02\u01A6\u01A4\x03\x02\x02\x02\u01A6\u01A7\x03\x02" + + "\x02\x02\u01A7\u01A9\x03\x02\x02\x02\u01A8\u01A6\x03\x02\x02\x02\u01A9" + + "\u01AA\x07\x0E\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u0199\x03\x02" + + "\x02\x02\u01AB\u019C\x03\x02\x02\x02\u01AB\u019F\x03\x02\x02\x02\u01AC" + + "\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03\x02" + + "\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0\u01B1" + + "\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3\u01B4" + + "\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02\x02" + + "\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07\x07" + + "\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB\u01B6" + + "\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02\x02\x02" + + "\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF\u01BD\x03" + + "\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02\x02\u01C2" + + "\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03\x02\x02\x02" + + "\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5\u01C6\x07" + + "\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02\u01C7\u01C5" + + "\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+\x02\u01CA-\x03" + + "\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x058\x1D\x02\u01CD" + + "\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05F$\x02\u01D0" + + "\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x03\x02" + + "\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02\u01D4\u01D5" + + "\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02\u01D7\u01D8" + + "\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18\x17\u01DA" + + "\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD\x07\x04\x02" + + "\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF\u01E1\x05" + + ".\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02\x02\u01E2" + + "\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6\x03\x02" + + "\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02\u01E6\u01E5" + + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02" + + "\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA\u01EB\x07" + + ".\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02\u01ED\u01EE" + + "\x07\n\x02\x02\u01EE\u01F0"; private static readonly _serializedATNSegment1: string = - "\u01EE\u01EF\x07\x04\x02\x02\u01EF\u01F4\x05.\x18\x02\u01F0\u01F1\x07" + - "\n\x02\x02\u01F1\u01F3\x05.\x18\x02\u01F2\u01F0\x03\x02\x02\x02\u01F3" + - "\u01F6\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F4\u01F5\x03\x02" + - "\x02\x02\u01F5\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F7" + - "\u01F9\x07\n\x02\x02\u01F8\u01F7\x03\x02\x02\x02\u01F8\u01F9\x03\x02\x02" + - "\x02\u01F9\u01FA\x03\x02\x02\x02\u01FA\u01FB\x07\x05\x02\x02\u01FB\u0265" + - "\x03\x02\x02\x02\u01FC\u0265\x050\x19\x02\u01FD\u01FE\x07#\x02\x02\u01FE" + - "\u01FF\x07\x04\x02\x02\u01FF\u0204\x05.\x18\x02\u0200\u0201\x07\n\x02" + - "\x02\u0201\u0203\x05.\x18\x02\u0202\u0200\x03\x02\x02\x02\u0203\u0206" + - "\x03\x02\x02\x02\u0204\u0202\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02" + - "\u0205\u0208\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0207\u0209\x07" + - "\n\x02\x02\u0208\u0207\x03\x02\x02\x02\u0208\u0209\x03\x02\x02\x02\u0209" + - "\u020A\x03\x02\x02\x02\u020A\u020B\x07\x05\x02\x02\u020B\u0265\x03\x02" + - "\x02\x02\u020C\u020D\x07$\x02\x02\u020D\u020E\x07\x04\x02\x02\u020E\u0213" + - "\x05.\x18\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x05.\x18\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\u0265\x03\x02\x02\x02\u021B\u0220\x05P)\x02\u021C" + - "\u0220\x07,\x02\x02\u021D\u0220\x07+\x02\x02\u021E\u0220\x07*\x02\x02" + - "\u021F\u021B\x03\x02\x02\x02\u021F\u021C\x03\x02\x02\x02\u021F\u021D\x03" + - "\x02\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0265\x03\x02\x02\x02\u0221" + - "\u0222\x07?\x02\x02\u0222\u0223\x05.\x18\x02\u0223\u0224\x07\n\x02\x02" + - "\u0224\u0229\x05.\x18\x02\u0225\u0226\x07\n\x02\x02\u0226\u0228\x05.\x18" + - "\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227" + - "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02" + - "\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x07\n\x02\x02\u022D\u022C\x03" + - "\x02\x02\x02\u022D\u022E\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F" + - "\u0230\x07@\x02\x02\u0230\u0265\x03\x02\x02\x02\u0231\u0232\x07\x04\x02" + - "\x02\u0232\u0237\x05F$\x02\u0233\u0234\x07\n\x02\x02\u0234\u0236\x05F" + - "$\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02\u0237\u0235" + - "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02" + - "\u0239\u0237\x03\x02\x02\x02\u023A\u023C\x07\n\x02\x02\u023B\u023A\x03" + - "\x02\x02\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D\x03\x02\x02\x02\u023D" + - "\u023E\x07\x05\x02\x02\u023E\u0265\x03\x02\x02\x02\u023F\u0248\x07\r\x02" + - "\x02\u0240\u0245\x05.\x18\x02\u0241\u0242\x07\n\x02\x02\u0242\u0244\x05" + - ".\x18\x02\u0243\u0241\x03\x02\x02\x02\u0244\u0247\x03\x02\x02\x02\u0245" + - "\u0243\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246\u0249\x03\x02" + - "\x02\x02\u0247\u0245\x03\x02\x02\x02\u0248\u0240\x03\x02\x02\x02\u0248" + - "\u0249\x03\x02\x02\x02\u0249\u024B\x03\x02\x02\x02\u024A\u024C\x07\n\x02" + - "\x02\u024B\u024A\x03\x02\x02\x02\u024B\u024C\x03\x02\x02\x02\u024C\u024D" + - "\x03\x02\x02\x02\u024D\u0265\x07\x0E\x02\x02\u024E\u024F\x07%\x02\x02" + - "\u024F\u0250\x07?\x02\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07@\x02" + - "\x02\u0252\u0253\x05.\x18\x02\u0253\u0254\x07&\x02\x02\u0254\u0255\x05" + - ".\x18\x07\u0255\u0265\x03\x02\x02\x02\u0256\u0257\x05\n\x06\x02\u0257" + - "\u0258\x05.\x18\x06\u0258\u0265\x03\x02\x02\x02\u0259\u025A\x05\x14\v" + - "\x02\u025A\u025B\x05.\x18\x05\u025B\u0265\x03\x02\x02\x02\u025C\u025D" + - "\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E\u025F\x07@\x02\x02\u025F" + - "\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02\x02\u0261\u0262\x05.\x18" + - "\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265\x03\x02\x02\x02\u0264\u01CE" + - "\x03\x02\x02\x02\u0264\u01D0\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02" + - "\u0264\u01D9\x03\x02\x02\x02\u0264\u01DE\x03\x02\x02\x02\u0264\u01ED\x03" + - "\x02\x02\x02\u0264\u01FC\x03\x02\x02\x02\u0264\u01FD\x03\x02\x02\x02\u0264" + - "\u020C\x03\x02\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u0221\x03\x02" + - "\x02\x02\u0264\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264" + - "\u024E\x03\x02\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02" + - "\x02\x02\u0264\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265" + - "\u0297\x03\x02\x02\x02\u0266\u0267\f\x1C\x02\x02\u0267\u0268\x07!\x02" + - "\x02\u0268\u0296\x05.\x18\x1C\u0269\u026A\f\x1A\x02\x02\u026A\u026B\t" + - "\x02\x02\x02\u026B\u0296\x05.\x18\x1B\u026C\u026D\f\x19\x02\x02\u026D" + - "\u026E\t\x03\x02\x02\u026E\u0296\x05.\x18\x1A\u026F\u0270\f\x18\x02\x02" + - "\u0270\u0271\t\x04\x02\x02\u0271\u0296\x05.\x18\x19\u0272\u0273\f\x16" + - "\x02\x02\u0273\u0274\x07>\x02\x02\u0274\u0275\x05.\x18\x17\u0275\u0276" + - "\b\x18\x01\x02\u0276\u0296\x03\x02\x02\x02\u0277\u0278\f\x14\x02\x02\u0278" + - "\u0279\x07-\x02\x02\u0279\u0296\x05.\x18\x15\u027A\u027B\f\x12\x02\x02" + - "\u027B\u027C\x07.\x02\x02\u027C\u0296\x05.\x18\x13\u027D\u027E\f\x11\x02" + - "\x02\u027E\u027F\x07/\x02\x02\u027F\u0296\x05.\x18\x12\u0280\u0281\f\x10" + - "\x02\x02\u0281\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x11\u0283\u0284" + - "\f\n\x02\x02\u0284\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286" + - "\u0287\f \x02\x02\u0287\u0288\x07\x18\x02\x02\u0288\u028E\x05J&\x02\u0289" + - "\u028B\x07?\x02\x02\u028A\u028C\x05D#\x02\u028B\u028A\x03\x02\x02\x02" + - "\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07" + - "@\x02\x02\u028E\u0289\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + - "\u0296\x03\x02\x02\x02\u0290\u0291\f\x1D\x02\x02\u0291\u0292\x07\r\x02" + - "\x02\u0292\u0293\x05.\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296" + - "\x03\x02\x02\x02\u0295\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02" + - "\u0295\u026C\x03\x02\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03" + - "\x02\x02\x02\u0295\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295" + - "\u027D\x03\x02\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02" + - "\x02\x02\u0295\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296" + - "\u0299\x03\x02\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02" + - "\x02\x02\u0298/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B" + - "\x072\x02\x02\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D" + - "\u029F\x07\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02" + - "\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2" + - "\x07\x0F\x02\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02" + - "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + - "\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + - "\u02A9\x07\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02" + - "\u02AB\u02AD\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03" + - "\x02\x02\x02\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF" + - "\u02B0\x05.\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05R*\x02\u02B2" + - "\u02B5\x07?\x02\x02\u02B3\u02B6\x05R*\x02\u02B4\u02B6\x07\'\x02\x02\u02B5" + - "\u02B3\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02" + - "\x02\x02\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9" + - "\x03\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB" + - "\u02BC\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18" + - "\x02\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1" + - "\x07E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03" + - "\u02C3\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03" + - "\x02\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5" + - "\u02C8\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02" + - "\u02C7\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!" + - "\x02\u02CA\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB" + - "\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF" + - "\u02D0\x07\n\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02" + - "\u02D2\u02D5\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03" + - "\x02\x02\x02\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6" + - "\u02D7\x07@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02" + - "\u02D9\u02DB\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03" + - "\x02\x02\x02\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE" + - "\x07?\x02\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2" + - "\x05@!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3" + - "\u02E1\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02" + - "\x02\x02\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8" + - "\x07\x1D\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA" + - "\u02ED\x07\'\x02\x02\u02EB\u02ED\x05P)\x02\u02EC\u02EA\x03\x02\x02\x02" + - "\u02EC\u02EB\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> " + - "\x02\u02EFA\x03\x02\x02\x02\u02F0\u02F3\x075\x02\x02\u02F1\u02F3\x05P" + - ")\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1\x03\x02\x02\x02\u02F3C\x03" + - "\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5\u02F6\x07\n\x02\x02\u02F6" + - "\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8\u02FB\x03\x02\x02" + - "\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA\x03\x02\x02\x02\u02FAE\x03" + - "\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FD\x05R*\x02\u02FD\u02FE" + - "\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02\u02FF\u0303\x03\x02\x02\x02" + - "\u0300\u0301\x07(\x02\x02\u0301\u0303\x05.\x18\x02\u0302\u02FC\x03\x02" + - "\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303G\x03\x02\x02\x02\u0304\u0307" + - "\x05P)\x02\u0305\u0307\t\x05\x02\x02\u0306\u0304\x03\x02\x02\x02\u0306" + - "\u0305\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B\x05P)\x02\u0309" + - "\u030B\t\x06\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A\u0309\x03\x02\x02" + - "\x02\u030BK\x03\x02\x02\x02\u030C\u030D\t\x07\x02\x02\u030DM\x03\x02\x02" + - "\x02\u030E\u030F\t\b\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0315\x05T+" + - "\x02\u0311\u0312\x07)\x02\x02\u0312\u0314\x05T+\x02\u0313\u0311\x03\x02" + - "\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315\u0313\x03\x02\x02\x02\u0315" + - "\u0316\x03\x02\x02\x02\u0316Q\x03\x02\x02\x02\u0317\u0315\x03\x02\x02" + - "\x02\u0318\u031D\x05T+\x02\u0319\u031A\x05P)\x02\u031A\u031B\b*\x01\x02" + - "\u031B\u031D\x03\x02\x02\x02\u031C\u0318\x03\x02\x02\x02\u031C\u0319\x03" + - "\x02\x02\x02\u031DS\x03\x02\x02\x02\u031E\u031F\t\t\x02\x02\u031FU\x03" + - "\x02\x02\x02ZY`iq\x8A\x94\x97\x9A\x9E\xA2\xA5\xB4\xBC\xBF\xC1\xCF\xD8" + - "\xDD\xE0\xE7\xEF\xF5\xFA\u0105\u010D\u0113\u0117\u0119\u0124\u0126\u0135" + - "\u013D\u014C\u0154\u0156\u0167\u016A\u016D\u0184\u0188\u018E\u019A\u01A9" + - "\u01AE\u01B0\u01C0\u01C6\u01CA\u01D3\u01E5\u01E9\u01F4\u01F8\u0204\u0208" + - "\u0213\u0217\u021F\u0229\u022D\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + - "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + - "\u02E3\u02EC\u02F2\u02F9\u0302\u0306\u030A\u0315\u031C"; + "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + + "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + + "\x02\x02\x02\u01F3\u01F1\x03\x02\x02\x02\u01F4\u01F6\x07\n\x02\x02\u01F5" + + "\u01F4\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + + "\x02\x02\u01F7\u01F8\x07\x05\x02\x02\u01F8\u0262\x03\x02\x02\x02\u01F9" + + "\u0262\x050\x19\x02\u01FA\u01FB\x07#\x02\x02\u01FB\u01FC\x07\x04\x02\x02" + + "\u01FC\u0201\x05.\x18\x02\u01FD\u01FE\x07\n\x02\x02\u01FE\u0200\x05.\x18" + + "\x02\u01FF\u01FD\x03\x02\x02\x02\u0200\u0203\x03\x02\x02\x02\u0201\u01FF" + + "\x03\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0205\x03\x02\x02\x02" + + "\u0203\u0201\x03\x02\x02\x02\u0204\u0206\x07\n\x02\x02\u0205\u0204\x03" + + "\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207" + + "\u0208\x07\x05\x02\x02\u0208\u0262\x03\x02\x02\x02\u0209\u020A\x07$\x02" + + "\x02\u020A\u020B\x07\x04\x02\x02\u020B\u0210\x05.\x18\x02\u020C\u020D" + + "\x07\n\x02\x02\u020D\u020F\x05.\x18\x02\u020E\u020C\x03\x02\x02\x02\u020F" + + "\u0212\x03\x02\x02\x02\u0210\u020E\x03\x02\x02\x02\u0210\u0211\x03\x02" + + "\x02\x02\u0211\u0214\x03\x02\x02\x02\u0212\u0210\x03\x02\x02\x02\u0213" + + "\u0215\x07\n\x02\x02\u0214\u0213\x03\x02\x02\x02\u0214\u0215\x03\x02\x02" + + "\x02\u0215\u0216\x03\x02\x02\x02\u0216\u0217\x07\x05\x02\x02\u0217\u0262" + + "\x03\x02\x02\x02\u0218\u021D\x05R*\x02\u0219\u021D\x07,\x02\x02\u021A" + + "\u021D\x07+\x02\x02\u021B\u021D\x07*\x02\x02\u021C\u0218\x03\x02\x02\x02" + + "\u021C\u0219\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021C\u021B\x03" + + "\x02\x02\x02\u021D\u0262\x03\x02\x02\x02\u021E\u021F\x07?\x02\x02\u021F" + + "\u0220\x05.\x18\x02\u0220\u0221\x07\n\x02\x02\u0221\u0226\x05.\x18\x02" + + "\u0222\u0223\x07\n\x02\x02\u0223\u0225\x05.\x18\x02\u0224\u0222\x03\x02" + + "\x02\x02\u0225\u0228\x03\x02\x02\x02\u0226\u0224\x03\x02\x02\x02\u0226" + + "\u0227\x03\x02\x02\x02\u0227\u022A\x03\x02\x02\x02\u0228\u0226\x03\x02" + + "\x02\x02\u0229\u022B\x07\n\x02\x02\u022A\u0229\x03\x02\x02\x02\u022A\u022B" + + "\x03\x02\x02\x02\u022B\u022C\x03\x02\x02\x02\u022C\u022D\x07@\x02\x02" + + "\u022D\u0262\x03\x02\x02\x02\u022E\u022F\x07\x04\x02\x02\u022F\u0234\x05" + + "H%\x02\u0230\u0231\x07\n\x02\x02\u0231\u0233\x05H%\x02\u0232\u0230\x03" + + "\x02\x02\x02\u0233\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234" + + "\u0235\x03\x02\x02\x02\u0235\u0238\x03\x02\x02\x02\u0236\u0234\x03\x02" + + "\x02\x02\u0237\u0239\x07\n\x02\x02\u0238\u0237\x03\x02\x02\x02\u0238\u0239" + + "\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x07\x05\x02\x02" + + "\u023B\u0262\x03\x02\x02\x02\u023C\u0245\x07\r\x02\x02\u023D\u0242\x05" + + ".\x18\x02\u023E\u023F\x07\n\x02\x02\u023F\u0241\x05.\x18\x02\u0240\u023E" + + "\x03\x02\x02\x02\u0241\u0244\x03\x02\x02\x02\u0242\u0240\x03\x02\x02\x02" + + "\u0242\u0243\x03\x02\x02\x02\u0243\u0246\x03\x02\x02\x02\u0244\u0242\x03" + + "\x02\x02\x02\u0245\u023D\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246" + + "\u0248\x03\x02\x02\x02\u0247\u0249\x07\n\x02\x02\u0248\u0247\x03\x02\x02" + + "\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u0262" + + "\x07\x0E\x02\x02\u024B\u024C\x07%\x02\x02\u024C\u024D\x07?\x02\x02\u024D" + + "\u024E\x05.\x18\x02\u024E\u024F\x07@\x02\x02\u024F\u0250\x05.\x18\x02" + + "\u0250\u0251\x07&\x02\x02\u0251\u0252\x05.\x18\x07\u0252\u0262\x03\x02" + + "\x02\x02\u0253\u0254\x05\n\x06\x02\u0254\u0255\x05.\x18\x06\u0255\u0262" + + "\x03\x02\x02\x02\u0256\u0257\x05\x14\v\x02\u0257\u0258\x05.\x18\x05\u0258" + + "\u0262\x03\x02\x02\x02\u0259\u025A\x07?\x02\x02\u025A\u025B\x05.\x18\x02" + + "\u025B\u025C\x07@\x02\x02\u025C\u0262\x03\x02\x02\x02\u025D\u025E\x07" + + "\x04\x02\x02\u025E\u025F\x05.\x18\x02\u025F\u0260\x07\x05\x02\x02\u0260" + + "\u0262\x03\x02\x02\x02\u0261\u01CB\x03\x02\x02\x02\u0261\u01CD\x03\x02" + + "\x02\x02\u0261\u01D4\x03\x02\x02\x02\u0261\u01D6\x03\x02\x02\x02\u0261" + + "\u01DB\x03\x02\x02\x02\u0261\u01EA\x03\x02\x02\x02\u0261\u01F9\x03\x02" + + "\x02\x02\u0261\u01FA\x03\x02\x02\x02\u0261\u0209\x03\x02\x02\x02\u0261" + + "\u021C\x03\x02\x02\x02\u0261\u021E\x03\x02\x02\x02\u0261\u022E\x03\x02" + + "\x02\x02\u0261\u023C\x03\x02\x02\x02\u0261\u024B\x03\x02\x02\x02\u0261" + + "\u0253\x03\x02\x02\x02\u0261\u0256\x03\x02\x02\x02\u0261\u0259\x03\x02" + + "\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262\u0294\x03\x02\x02\x02\u0263" + + "\u0264\f\x1C\x02\x02\u0264\u0265\x07!\x02\x02\u0265\u0293\x05.\x18\x1C" + + "\u0266\u0267\f\x1A\x02\x02\u0267\u0268\t\x02\x02\x02\u0268\u0293\x05." + + "\x18\x1B\u0269\u026A\f\x19\x02\x02\u026A\u026B\t\x03\x02\x02\u026B\u0293" + + "\x05.\x18\x1A\u026C\u026D\f\x18\x02\x02\u026D\u026E\t\x04\x02\x02\u026E" + + "\u0293\x05.\x18\x19\u026F\u0270\f\x16\x02\x02\u0270\u0271\x07>\x02\x02" + + "\u0271\u0272\x05.\x18\x17\u0272\u0273\b\x18\x01\x02\u0273\u0293\x03\x02" + + "\x02\x02\u0274\u0275\f\x14\x02\x02\u0275\u0276\x07-\x02\x02\u0276\u0293" + + "\x05.\x18\x15\u0277\u0278\f\x12\x02\x02\u0278\u0279\x07.\x02\x02\u0279" + + "\u0293\x05.\x18\x13\u027A\u027B\f\x11\x02\x02\u027B\u027C\x07/\x02\x02" + + "\u027C\u0293\x05.\x18\x12\u027D\u027E\f\x10\x02\x02\u027E\u027F\x070\x02" + + "\x02\u027F\u0293\x05.\x18\x11\u0280\u0281\f\n\x02\x02\u0281\u0282\x07" + + "\x1C\x02\x02\u0282\u0293\x05.\x18\v\u0283\u0284\f \x02\x02\u0284\u0285" + + "\x07\x18\x02\x02\u0285\u028B\x05L\'\x02\u0286\u0288\x07?\x02\x02\u0287" + + "\u0289\x05F$\x02\u0288\u0287\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02" + + "\u0289\u028A\x03\x02\x02\x02\u028A\u028C\x07@\x02\x02\u028B\u0286\x03" + + "\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u0293\x03\x02\x02\x02\u028D" + + "\u028E\f\x1D\x02\x02\u028E\u028F\x07\r\x02\x02\u028F\u0290\x05.\x18\x02" + + "\u0290\u0291\x07\x0E\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0263\x03" + + "\x02\x02\x02\u0292\u0266\x03\x02\x02\x02\u0292\u0269\x03\x02\x02\x02\u0292" + + "\u026C\x03\x02\x02\x02\u0292\u026F\x03\x02\x02\x02\u0292\u0274\x03\x02" + + "\x02\x02\u0292\u0277\x03\x02\x02\x02\u0292\u027A\x03\x02\x02\x02\u0292" + + "\u027D\x03\x02\x02\x02\u0292\u0280\x03\x02\x02\x02\u0292\u0283\x03\x02" + + "\x02\x02\u0292\u028D\x03\x02\x02\x02\u0293\u0296\x03\x02\x02\x02\u0294" + + "\u0292\x03\x02\x02\x02\u0294\u0295\x03\x02\x02\x02\u0295/\x03\x02\x02" + + "\x02\u0296\u0294\x03\x02\x02\x02\u0297\u0298\x072\x02\x02\u0298\u0299" + + "\x05.\x18\x02\u0299\u029B\x07\x04\x02\x02\u029A\u029C\x07\x0F\x02\x02" + + "\u029B\u029A\x03\x02\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u029D\x03" + + "\x02\x02\x02\u029D\u02A2\x052\x1A\x02\u029E\u029F\x07\x0F\x02\x02\u029F" + + "\u02A1\x052\x1A\x02\u02A0\u029E\x03\x02\x02\x02\u02A1\u02A4\x03\x02\x02" + + "\x02\u02A2\u02A0\x03\x02\x02\x02\u02A2\u02A3\x03\x02\x02\x02\u02A3\u02A5" + + "\x03\x02\x02\x02\u02A4\u02A2\x03\x02\x02\x02\u02A5\u02A6\x07\x05\x02\x02" + + "\u02A61\x03\x02\x02\x02\u02A7\u02AA\x054\x1B\x02\u02A8\u02AA\x07\'\x02" + + "\x02\u02A9\u02A7\x03\x02\x02\x02\u02A9\u02A8\x03\x02\x02\x02\u02AA\u02AB" + + "\x03\x02\x02\x02\u02AB\u02AC\x07\x1D\x02\x02\u02AC\u02AD\x05.\x18\x02" + + "\u02AD3\x03\x02\x02\x02\u02AE\u02B5\x05T+\x02\u02AF\u02B2\x07?\x02\x02" + + "\u02B0\u02B3\x05T+\x02\u02B1\u02B3\x07\'\x02\x02\u02B2\u02B0\x03\x02\x02" + + "\x02\u02B2\u02B1\x03\x02\x02\x02\u02B3\u02B4\x03\x02\x02\x02\u02B4\u02B6" + + "\x07@\x02\x02\u02B5\u02AF\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02" + + "\u02B65\x03\x02\x02\x02\u02B7\u02B8\x05\b\x05\x02\u02B8\u02B9\x07\x02" + + "\x02\x03\u02B9\u02C1\x03\x02\x02\x02\u02BA\u02BB\x05.\x18\x02\u02BB\u02BC" + + "\x07\x02\x02\x03\u02BC\u02C1\x03\x02\x02\x02\u02BD\u02BE\x07E\x02\x02" + + "\u02BE\u02C1\x07\x02\x02\x03\u02BF\u02C1\x07\x02\x02\x03\u02C0\u02B7\x03" + + "\x02\x02\x02\u02C0\u02BA\x03\x02\x02\x02\u02C0\u02BD\x03\x02\x02\x02\u02C0" + + "\u02BF\x03\x02\x02\x02\u02C17\x03\x02\x02\x02\u02C2\u02C5\x05:\x1E\x02" + + "\u02C3\u02C5\x05<\x1F\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3\x03" + + "\x02\x02\x02\u02C59\x03\x02\x02\x02\u02C6\u02C7\x05@!\x02\u02C7\u02C8" + + "\x07\x1D\x02\x02\u02C8\u02C9\x05.\x18\x02\u02C9\u02D8\x03\x02\x02\x02" + + "\u02CA\u02CB\x07?\x02\x02\u02CB\u02D0\x05@!\x02\u02CC\u02CD\x07\n\x02" + + "\x02\u02CD\u02CF\x05@!\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D2\x03" + + "\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D0\u02D1\x03\x02\x02\x02\u02D1" + + "\u02D3\x03\x02\x02\x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x07@\x02" + + "\x02\u02D4\u02D5\x07\x1D\x02\x02\u02D5\u02D6\x05.\x18\x02\u02D6\u02D8" + + "\x03\x02\x02\x02\u02D7\u02C6\x03\x02\x02\x02\u02D7\u02CA\x03\x02\x02\x02" + + "\u02D8;\x03\x02\x02\x02\u02D9\u02DA\x07?\x02\x02\u02DA\u02DB\x07?\x02" + + "\x02\u02DB\u02DE\x05@!\x02\u02DC\u02DD\x07\n\x02\x02\u02DD\u02DF\x05@" + + "!\x02\u02DE\u02DC\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02DE" + + "\x03\x02\x02\x02\u02E0\u02E1\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + + "\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07\x1D" + + "\x02\x02\u02E5\u02E6\x05.\x18\x02\u02E6=\x03\x02\x02\x02\u02E7\u02EA\x07" + + "\'\x02\x02\u02E8\u02EA\x05R*\x02\u02E9\u02E7\x03\x02\x02\x02\u02E9\u02E8" + + "\x03\x02\x02\x02\u02EA?\x03\x02\x02\x02\u02EB\u02EC\x05> \x02\u02ECA\x03" + + "\x02\x02\x02\u02ED\u02EE\x05> \x02\u02EE\u02EF\x07\x07\x02\x02\u02EF\u02F0" + + "\x05&\x14\x02\u02F0C\x03\x02\x02\x02\u02F1\u02F4\x075\x02\x02\u02F2\u02F4" + + "\x05R*\x02\u02F3\u02F1\x03\x02\x02\x02\u02F3\u02F2\x03\x02\x02\x02\u02F4" + + "E\x03\x02\x02\x02\u02F5\u02FA\x05.\x18\x02\u02F6\u02F7\x07\n\x02\x02\u02F7" + + "\u02F9\x05.\x18\x02\u02F8\u02F6\x03\x02\x02\x02\u02F9\u02FC\x03\x02\x02" + + "\x02\u02FA\u02F8\x03\x02\x02\x02\u02FA\u02FB\x03\x02\x02\x02\u02FBG\x03" + + "\x02\x02\x02\u02FC\u02FA\x03\x02\x02\x02\u02FD\u02FE\x05T+\x02\u02FE\u02FF" + + "\x07\x07\x02\x02\u02FF\u0300\x05.\x18\x02\u0300\u0304\x03\x02\x02\x02" + + "\u0301\u0302\x07(\x02\x02\u0302\u0304\x05.\x18\x02\u0303\u02FD\x03\x02" + + "\x02\x02\u0303\u0301\x03\x02\x02\x02\u0304I\x03\x02\x02\x02\u0305\u0308" + + "\x05R*\x02\u0306\u0308\t\x05\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307" + + "\u0306\x03\x02\x02\x02\u0308K\x03\x02\x02\x02\u0309\u030C\x05R*\x02\u030A" + + "\u030C\t\x06\x02\x02\u030B\u0309\x03\x02\x02\x02\u030B\u030A\x03\x02\x02" + + "\x02\u030CM\x03\x02\x02\x02\u030D\u030E\t\x07\x02\x02\u030EO\x03\x02\x02" + + "\x02\u030F\u0310\t\b\x02\x02\u0310Q\x03\x02\x02\x02\u0311\u0316\x05V," + + "\x02\u0312\u0313\x07)\x02\x02\u0313\u0315\x05V,\x02\u0314\u0312\x03\x02" + + "\x02\x02\u0315\u0318\x03\x02\x02\x02\u0316\u0314\x03\x02\x02\x02\u0316" + + "\u0317\x03\x02\x02\x02\u0317S\x03\x02\x02\x02\u0318\u0316\x03\x02\x02" + + "\x02\u0319\u031E\x05V,\x02\u031A\u031B\x05R*\x02\u031B\u031C\b+\x01\x02" + + "\u031C\u031E\x03\x02\x02\x02\u031D\u0319\x03\x02\x02\x02\u031D\u031A\x03" + + "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + + "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + + "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u0197\u01A6" + + "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + + "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + + "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + + "\u02E0\u02E9\u02F3\u02FA\u0303\u0307\u030B\u0316\u031D"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4276,13 +4306,14 @@ export class VarContext extends DeclarationContext { } } export class AssumeContext extends DeclarationContext { - public identOrHole(): IdentOrHoleContext { - return this.getRuleContext(0, IdentOrHoleContext); - } + public _assumeName!: IdentOrHoleContext; public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public expr(): ExprContext { return this.getRuleContext(0, ExprContext); } + public identOrHole(): IdentOrHoleContext | undefined { + return this.tryGetRuleContext(0, IdentOrHoleContext); + } constructor(ctx: DeclarationContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); @@ -4456,27 +4487,86 @@ export class ExportDefContext extends DeclarationContext { export class OperDefContext extends ParserRuleContext { + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_operDef; } + public copyFrom(ctx: OperDefContext): void { + super.copyFrom(ctx); + } +} +export class AnnotatedOperDefContext extends OperDefContext { + public _annotatedParameter!: AnnotatedParameterContext; + public _annotOperParam: AnnotatedParameterContext[] = []; public qualifier(): QualifierContext { return this.getRuleContext(0, QualifierContext); } public normalCallName(): NormalCallNameContext { return this.getRuleContext(0, NormalCallNameContext); } - public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } - public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } - public type(): TypeContext[]; - public type(i: number): TypeContext; - public type(i?: number): TypeContext | TypeContext[] { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public annotatedParameter(): AnnotatedParameterContext[]; + public annotatedParameter(i: number): AnnotatedParameterContext; + public annotatedParameter(i?: number): AnnotatedParameterContext | AnnotatedParameterContext[] { if (i === undefined) { - return this.getRuleContexts(TypeContext); + return this.getRuleContexts(AnnotatedParameterContext); } else { - return this.getRuleContext(i, TypeContext); + return this.getRuleContext(i, AnnotatedParameterContext); + } + } + public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } + public expr(): ExprContext | undefined { + return this.tryGetRuleContext(0, ExprContext); + } + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedOperDef) { + listener.enterAnnotatedOperDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedOperDef) { + listener.exitAnnotatedOperDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedOperDef) { + return visitor.visitAnnotatedOperDef(this); + } else { + return visitor.visitChildren(this); } } +} +export class DeprecatedOperDefContext extends OperDefContext { + public _parameter!: ParameterContext; + public _operParam: ParameterContext[] = []; + public _annotatedRetType!: TypeContext; + public qualifier(): QualifierContext { + return this.getRuleContext(0, QualifierContext); + } + public normalCallName(): NormalCallNameContext { + return this.getRuleContext(0, NormalCallNameContext); + } + public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } public expr(): ExprContext | undefined { return this.tryGetRuleContext(0, ExprContext); } + public type(): TypeContext | undefined { + return this.tryGetRuleContext(0, TypeContext); + } public parameter(): ParameterContext[]; public parameter(i: number): ParameterContext; public parameter(i?: number): ParameterContext | ParameterContext[] { @@ -4486,27 +4576,26 @@ export class OperDefContext extends ParserRuleContext { return this.getRuleContext(i, ParameterContext); } } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); } // @Override - public get ruleIndex(): number { return QuintParser.RULE_operDef; } - // @Override public enterRule(listener: QuintListener): void { - if (listener.enterOperDef) { - listener.enterOperDef(this); + if (listener.enterDeprecatedOperDef) { + listener.enterDeprecatedOperDef(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitOperDef) { - listener.exitOperDef(this); + if (listener.exitDeprecatedOperDef) { + listener.exitDeprecatedOperDef(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitOperDef) { - return visitor.visitOperDef(this); + if (visitor.visitDeprecatedOperDef) { + return visitor.visitDeprecatedOperDef(this); } else { return visitor.visitChildren(this); } @@ -6997,6 +7086,7 @@ export class IdentOrHoleContext extends ParserRuleContext { export class ParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; public identOrHole(): IdentOrHoleContext { return this.getRuleContext(0, IdentOrHoleContext); } @@ -7028,6 +7118,42 @@ export class ParameterContext extends ParserRuleContext { } +export class AnnotatedParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public identOrHole(): IdentOrHoleContext { + return this.getRuleContext(0, IdentOrHoleContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_annotatedParameter; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedParameter) { + listener.enterAnnotatedParameter(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedParameter) { + listener.exitAnnotatedParameter(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedParameter) { + return visitor.visitAnnotatedParameter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class IdentOrStarContext extends ParserRuleContext { public MUL(): TerminalNode | undefined { return this.tryGetToken(QuintParser.MUL, 0); } public qualId(): QualIdContext | undefined { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 4d01a74d9..7b5cc3ea0 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -55,6 +55,8 @@ import { LetInContext } from "./QuintParser"; import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -95,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -483,6 +486,22 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitBraces?: (ctx: BracesContext) => Result; + /** + * Visit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => Result; + + /** + * Visit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => Result; + /** * Visit a parse tree produced by the `const` * labeled alternative in `QuintParser.declaration`. @@ -771,6 +790,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitParameter?: (ctx: ParameterContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => Result; + /** * Visit a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index b9e148e52..0b0bb2bd3 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -218,7 +218,7 @@ export const builtinOpCodes = [ export type QuintBuiltinOpcode = (typeof builtinOpCodes)[number] -export interface QuintLambdaParameter extends WithId { +export interface QuintLambdaParameter extends WithId, WithOptionalTypeAnnotation { /** The name of the formal parameter */ name: string } diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 56053b2e1..7bb1d3bd2 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -16,6 +16,7 @@ import { QuintName, QuintOpDef, QuintStr, + isAnnotatedDef, } from '../ir/quintIr' import { ConcreteFixedRow, @@ -39,7 +40,7 @@ import { zip } from '../util' import { QuintError } from '../quintError' import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' import { Loc } from '../ErrorMessage' -import { fail } from 'assert' +import assert, { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -85,8 +86,6 @@ export class ToIrListener implements QuintListener { protected exprStack: QuintEx[] = [] // the stack of parameter lists protected paramStack: QuintLambdaParameter[] = [] - // stack of names used as parameters and assumptions - protected identOrHoleStack: string[] = [] // the stack for imported names protected identOrStarStack: string[] = [] // the stack of rows for records @@ -220,10 +219,47 @@ export class ToIrListener implements QuintListener { /** **************** translate operator definititons **********************/ // translate a top-level or nested operator definition - exitOperDef(ctx: p.OperDefContext) { + exitAnnotatedOperDef(ctx: p.AnnotatedOperDefContext) { const name = ctx.normalCallName().text - const [params, typeTag] = this.processOpDefParams(ctx) - // get the definition body + + const params = ctx._annotOperParam + .map(_ => popOrFail(this.paramStack, 'violated grammar of annotated AnnotatedOperDef')) + .reverse() + const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') + const args = params.map(p => { + assert(isAnnotatedDef(p), 'violated grammar of annotated param type') + return p.typeAnnotation + }) + const typeAnnotation: QuintType = { kind: 'oper', args, res } + + this.putDeclarationOnStack(ctx, name, params, just(typeAnnotation)) + } + + // TODO Mark as deprecated, then remove + // See https://github.com/informalsystems/quint/issues/923 + exitDeprecatedOperDef(ctx: p.DeprecatedOperDefContext) { + const name = ctx.normalCallName().text + + // The deprecated annotation grammar + const typeAnnotation: Maybe = ctx._annotatedRetType ? this.popType() : none() + const params = ctx._operParam + .map(_ => popOrFail(this.paramStack, 'violated grammar of non-annotated params')) + .reverse() + // TODO Enable after builtins are fixed + // if (params.length > 0 && typeAnnotation.isJust()) { + // console.warn( + // 'post-operator-head annotations are deprecated; see https://github.com/informalsystems/quint/issues/923' + // ) + // } + this.putDeclarationOnStack(ctx, name, params, typeAnnotation) + } + + private putDeclarationOnStack( + ctx: p.DeprecatedOperDefContext | p.AnnotatedOperDefContext, + name: string, + params: QuintLambdaParameter[], + typeAnnotation: Maybe + ) { const expr: QuintEx = ctx.expr() ? this.exprStack.pop() ?? this.undefinedExpr(ctx)() : // This is only a definition header, use a default body since the IR @@ -236,7 +272,7 @@ export class ToIrListener implements QuintListener { const body: QuintEx = params.length === 0 ? expr - : // if the definition has parameters, introduce a lambda + : // If the definition has parameters, introduce a lambda { id: this.getId(ctx), kind: 'lambda', params, qualifier, expr } const def: QuintOpDef = { @@ -246,42 +282,16 @@ export class ToIrListener implements QuintListener { qualifier, expr: body, } - if (typeTag.isJust()) { - def.typeAnnotation = typeTag.value + if (typeAnnotation.isJust()) { + def.typeAnnotation = typeAnnotation.value } this.declarationStack.push(def) } - // The definition parameters may be of two kinds: C-like and ML-like. - // Handle them here. - processOpDefParams(ctx: p.OperDefContext): [QuintLambdaParameter[], Maybe] { - const params = popMany(this.paramStack, ctx.parameter().length, this.undefinedParam(ctx)) - // types of the parameters and of the result - const ntypes = ctx.type().length - if (ntypes === 0) { - return [params, none()] - } else if (ntypes > 1) { - // a C-like signature, combine it into an operator type - const types = popMany(this.typeStack, ntypes, this.undefinedType(ctx)) - const id = this.getId(ctx) - const fullType: Maybe = just({ - id, - kind: 'oper', - args: types.slice(0, -1), - res: types[types.length - 1], - }) - return [params, fullType] - } else { - // the only type is on the stack - const fullType = this.popType() - return [params, fullType] - } - } - // assume name = expr - exitAssume(ctx: any) { + exitAssume(ctx: p.AssumeContext) { const expr = this.exprStack.pop()! - const name = this.identOrHoleStack.pop()! + const name = ctx._assumeName.text const id = this.getId(ctx) const assume: QuintDef = { id, @@ -725,24 +735,22 @@ export class ToIrListener implements QuintListener { this.exprStack.push(untupledLambda) } - // a single parameter in a lambda expression: an identifier or '_' - exitIdentOrHole(ctx: p.IdentOrHoleContext) { - if (ctx.text === '_') { - // a hole '_' - this.identOrHoleStack.push('_') - } else { - // a variable name - this.identOrHoleStack.push(ctx.qualId()!.text) - } - } - exitParameter(ctx: p.ParameterContext) { - const name = popMany(this.identOrHoleStack, 1, () => '_')[0] - + const name = ctx._paramName.text const id = this.getId(ctx) this.paramStack.push({ id, name }) } + // TODO Consolidate with `exitParameter`, see https://github.com/informalsystems/quint/issues/923 + exitAnnotatedParameter(ctx: p.AnnotatedParameterContext) { + const name = ctx._paramName.text + const id = this.getId(ctx) + const typeAnnotation = this.popType().unwrap(() => + fail('internal error: the grammar guarantees a type should be on the stack') + ) + this.paramStack.push({ id, name, typeAnnotation }) + } + // an identifier or star '*' in import exitIdentOrStar(ctx: p.IdentOrStarContext) { if (ctx.text === '*') { @@ -1222,6 +1230,7 @@ export class ToIrListener implements QuintListener { } // pop a type + // XXX private popType(): Maybe { // the user has specified a type const tp = this.typeStack.pop() @@ -1353,3 +1362,11 @@ function unitValue(id: bigint): QuintBuiltinApp { args: [], } } + +function popOrFail(stack: T[], msg: string): T { + const x = stack.pop() + if (typeof x === 'undefined') { + fail(`internal error: violated grammar guarantee ${msg}`) + } + return x +} diff --git a/quint/test/ir/IRFinder.test.ts b/quint/test/ir/IRFinder.test.ts index e62a76d3d..312e3077c 100644 --- a/quint/test/ir/IRFinder.test.ts +++ b/quint/test/ir/IRFinder.test.ts @@ -64,12 +64,15 @@ describe('findParameterWithId', () => { const modules = [buildModuleWithDecls(['pure def x(a: int): int = a'])] it('finds definition for existing id', () => { - const def = findParameterWithId(modules, 1n) - + const def = findParameterWithId(modules, 2n) assert.isDefined(def) assert.deepEqual(def, { - id: 1n, + id: 2n, name: 'a', + typeAnnotation: { + id: 1n, + kind: 'int', + }, }) }) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 6c7970584..246adbc49 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -360,14 +360,14 @@ module B { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '(int -> str)'], + [4n, '(int -> str)'], [6n, '(int -> str)'], [7n, 'Set[int]'], [8n, 'Set[int]'], [9n, 'int'], [10n, 'int'], + [11n, '((int -> str)) => int'], [12n, '((int -> str)) => int'], - [13n, '((int -> str)) => int'], ]) }) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index ae6f5ec08..49d90a0d9 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"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":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":223,"name":"x"},{"id":225,"name":"y"}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":234,"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":223,"name":"x","kind":"param"},"229":{"id":225,"name":"y","kind":"param"},"231":{"id":223,"name":"x","kind":"param"},"232":{"id":225,"name":"y","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"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":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"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":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"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":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"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":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 221260965..f79f12375 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"224":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"226":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"237":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"238":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"240":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"241":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"242":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"244":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"245":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"246":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"248":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"249":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"250":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"253":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"254":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"255":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"256":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"257":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"261":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"262":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"263":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"264":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"265":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"269":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"270":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"271":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"272":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"273":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"277":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"278":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"279":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"280":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"281":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"282":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"283":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"284":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"285":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"286":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"287":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"288":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"289":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"290":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"291":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"292":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"293":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"294":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"295":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"296":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"297":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"298":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"299":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"301":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"302":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"303":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"304":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"305":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"307":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"308":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"310":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"311":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"316":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"317":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"319":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"320":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"321":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"322":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"323":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"324":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"325":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"326":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"329":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"330":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"331":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"332":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"333":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"334":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"335":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"336":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"337":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"338":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"339":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"340":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"341":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"342":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"343":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"344":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"347":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"348":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"349":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"350":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"351":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"352":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"353":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"354":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"355":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"367":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"368":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"369":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"370":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"371":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"372":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"373":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"374":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"375":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"378":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"379":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"380":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"381":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"382":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"383":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"385":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"386":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"387":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"388":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"389":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"390":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"393":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"394":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"395":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"396":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"397":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"398":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"399":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"400":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"401":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"402":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"404":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"405":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"406":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"407":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"408":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"409":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"410":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"411":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"412":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"413":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"414":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"415":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"416":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"417":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"419":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"420":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"421":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"422":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"423":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"424":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"425":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"426":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"427":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"428":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"429":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"430":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"431":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"432":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"433":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"434":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"435":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"436":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"437":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"439":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"441":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"442":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"443":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"444":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"445":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"446":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"447":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"448":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"449":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"451":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"453":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"456":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"457":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"458":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"459":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"460":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"461":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"462":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"464":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"466":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"467":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"471":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"472":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"473":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"474":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"475":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"476":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"480":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"481":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"482":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"483":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"484":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"488":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"489":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"490":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"491":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"492":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"493":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"494":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"495":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"496":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"497":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"498":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"499":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"500":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"501":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"502":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"503":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"504":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"505":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"506":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"508":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"509":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"510":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"512":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"513":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"514":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"515":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"516":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"517":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"518":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"519":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"520":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"521":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"522":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"523":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index 7bba23e4b..a2a4bb5b0 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":11,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.map.json b/quint/testFixture/_1030const.map.json index b97f687e8..c9eabe4f7 100644 --- a/quint/testFixture/_1030const.map.json +++ b/quint/testFixture/_1030const.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"12":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"4":[0,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 14ad07a68..788b99601 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":19,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.map.json b/quint/testFixture/_1031instance.map.json index d0f6ed830..8b27a9271 100644 --- a/quint/testFixture/_1031instance.map.json +++ b/quint/testFixture/_1031instance.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"19":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"11":[7,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index c36b97412..7ae45fde9 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"bar","declarations":[{"id":13,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 5cc737a2528d591687c4a40ed259e85aef7a4505 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:23:26 -0500 Subject: [PATCH 238/428] Constrain annotated params to their types --- quint/src/types/constraintGenerator.ts | 8 ++++++-- quint/test/types/inferrer.test.ts | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..8bbb9ef14 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -30,7 +30,7 @@ import { QuintVar, isAnnotatedDef, } from '../ir/quintIr' -import { QuintType, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -253,7 +253,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { expr.params.forEach(p => { const varName = p.name === '_' ? this.freshVarGenerator.freshVar('_t') : `t_${p.name}_${p.id}` paramNames.typeVariables.add(varName) - this.addToResults(p.id, right(toScheme({ kind: 'var', name: varName }))) + const paramTypeVar: QuintVarType = { kind: 'var', name: varName } + this.addToResults(p.id, right(toScheme(paramTypeVar))) + if (p.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [paramTypeVar, p.typeAnnotation], sourceId: p.id }) + } }) this.freeNames.push(paramNames) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 246adbc49..112415dbc 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -419,4 +419,24 @@ module B { ] ) }) + + it('prioritizes solving constraints from type annotations', () => { + // Regression test for https://github.com/informalsystems/quint/issues/1177 + // The point is that we expect to report an error trying to unify a string with a + const defs = [ + `pure def foo(s: str): int = { + val x = 1.in(s) // We SHOULD identify an error here, since s is annotated as a str + val y = s + 1 // and NOT identify an error here, incorrectly expecting s to be a set + y +}`, + ] + + const [errors] = inferTypesForDefs(defs) + const msgs: string[] = [...errors.values()].map(errorTreeToString) + const expectedMessage = `Couldn't unify set and str +Trying to unify Set[int] and str +Trying to unify (_t0, Set[_t0]) => bool and (int, str) => _t1 +` + assert.equal(msgs[0], expectedMessage) + }) }) From 830d3567e4a6ffb47d75e8d25e5446f0c082a7ca Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:24:11 -0500 Subject: [PATCH 239/428] Fix generality check --- quint/src/types/constraintGenerator.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 8bbb9ef14..f92f96a9b 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -460,10 +460,13 @@ function checkAnnotationGenerality( return right(subs) } - // Look for type/row variables in the annotation that are bound by `subs` + // Find type and row variables in the annotation that are bound to non-variable types in the substitutions. + // This indicates that they are inferred to have a concrete type. const names = typeNames(typeAnnotation) - const tooGeneralTypes = subs.filter(s => s.kind === 'type' && names.typeVariables.has(s.name)) - const tooGeneralRows = subs.filter(s => s.kind === 'row' && names.rowVariables.has(s.name)) + const tooGeneralTypes = subs.filter( + s => s.kind === 'type' && s.value.kind !== 'var' && names.typeVariables.has(s.name) + ) + const tooGeneralRows = subs.filter(s => s.kind === 'row' && s.value.kind !== 'var' && names.rowVariables.has(s.name)) const errors = [...tooGeneralTypes, ...tooGeneralRows].map(s => { const expected = s.kind === 'type' ? typeToString(s.value) : rowToString(s.value) From fafd623b4ad7cf4cfeb4fd12744d395c157dc169 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:59:17 -0500 Subject: [PATCH 240/428] Remove old comment --- quint/src/parsing/ToIrListener.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 7bb1d3bd2..d01e96843 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1230,7 +1230,6 @@ export class ToIrListener implements QuintListener { } // pop a type - // XXX private popType(): Maybe { // the user has specified a type const tp = this.typeStack.pop() From a146a8bef82cd1777c85674f08d0d8aafdcc84e9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:59:26 -0500 Subject: [PATCH 241/428] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd011a24d..2960af69a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed type checker to account for type constraints on annotated operator + parameters when checking operator bodies (#1177). + ### Security ## v0.18.1 -- 2024-01-16 From 88e7bbe1ead3aa4121b3ad0ec61480939bbed673 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 11:28:58 -0500 Subject: [PATCH 242/428] Update quint/src/parsing/ToIrListener.ts Co-authored-by: Gabriela Moreira --- quint/src/parsing/ToIrListener.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index d01e96843..c5c443a22 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -223,7 +223,7 @@ export class ToIrListener implements QuintListener { const name = ctx.normalCallName().text const params = ctx._annotOperParam - .map(_ => popOrFail(this.paramStack, 'violated grammar of annotated AnnotatedOperDef')) + .map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')) .reverse() const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') const args = params.map(p => { From 1fc862de2c43fb835445ed48a7a57eab4b38b7a9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 12:20:40 -0500 Subject: [PATCH 243/428] Format fix --- quint/src/parsing/ToIrListener.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index c5c443a22..f14f48e58 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -222,9 +222,7 @@ export class ToIrListener implements QuintListener { exitAnnotatedOperDef(ctx: p.AnnotatedOperDefContext) { const name = ctx.normalCallName().text - const params = ctx._annotOperParam - .map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')) - .reverse() + const params = ctx._annotOperParam.map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')).reverse() const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') const args = params.map(p => { assert(isAnnotatedDef(p), 'violated grammar of annotated param type') From 4c760dee90f61ab5143c5ffd03ebe6d309440a7f Mon Sep 17 00:00:00 2001 From: OakenKnight Date: Wed, 21 Feb 2024 13:12:23 +0100 Subject: [PATCH 244/428] Fixed Runtime error in cosmwasm/Zero-to-hero example caused by lambda nesting issue reported in issue #1042 --- examples/cosmwasm/zero-to-hero/vote.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cosmwasm/zero-to-hero/vote.qnt b/examples/cosmwasm/zero-to-hero/vote.qnt index 88e686fbd..61adf5a58 100644 --- a/examples/cosmwasm/zero-to-hero/vote.qnt +++ b/examples/cosmwasm/zero-to-hero/vote.qnt @@ -513,5 +513,5 @@ module state { // already submitted ballots in `ballots`, but `execute_vote` adjusts // the sum differently based on whether such a ballot is present.] val invAllBallotsPositive = query_all_polls(state).polls.listForall(poll => - poll.options.listForall(opt => opt._2 >= 0)) + poll.options.listForall2(opt => opt._2 >= 0)) } From 0c0b5d9659bd69eac0647ec8d28b488b4b18dd82 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 21 Feb 2024 14:00:32 -0500 Subject: [PATCH 245/428] Update README.md As per suggestion from @ivan-gavran --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0a67bf8a7..99ae97722 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,10 @@ Cosmos in 2023. - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint +- Join or co-design meetings: We hold fortnightly meetings with users and those + interested in contributing to the design and development of Quint. Contact us if + you would like an invitation. + ## Documentation From a2747aedbec9b5fbdf5f01d84fda7d9ac8c6d005 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 10:05:18 -0500 Subject: [PATCH 246/428] Limit node to current major with LTS Prevents triggering an error from the deprecated punycode dependency coming from node-fetch. --- quint/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/package.json b/quint/package.json index 0cb51a8d0..970566b5d 100644 --- a/quint/package.json +++ b/quint/package.json @@ -41,7 +41,7 @@ "test/**/*.ts" ], "engines": { - "node": ">=18" + "node": "18 - 20" }, "repository": { "type": "git", From cf2830ad2ee176170e7c2a3627a402bebd9ccfbc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 10:33:49 -0500 Subject: [PATCH 247/428] Remove dependency on node-fetch --- quint/package-lock.json | 9477 +++++++----------------------------- quint/package.json | 1 - quint/src/quintVerifier.ts | 3 +- 3 files changed, 1814 insertions(+), 7667 deletions(-) diff --git a/quint/package-lock.json b/quint/package-lock.json index 76a99dd10..dd192ef04 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint", "version": "0.18.3", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -24,7 +24,6 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -63,77 +62,145 @@ "typescript": "^4.8.2" }, "engines": { - "node": ">=18" + "node": "18 - 20" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -143,23 +210,30 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -167,171 +241,168 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -410,9 +481,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -422,34 +493,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -466,13 +537,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -517,23 +588,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -549,20 +620,20 @@ } }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { @@ -570,14 +641,13 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", "yargs": "^17.7.2" }, "bin": { @@ -588,13 +658,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -615,9 +685,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -729,9 +799,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -743,9 +813,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -761,19 +831,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -812,12 +882,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -825,19 +894,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -845,11 +913,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -858,11 +926,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@protobufjs/aspromise": { @@ -959,36 +1027,36 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", "dev": true }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -998,37 +1066,32 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, "node_modules/@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.8.tgz", + "integrity": "sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==", "dev": true, "dependencies": { "@types/lodash": "*" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mocha": { @@ -1038,90 +1101,85 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" + "version": "18.19.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.18.tgz", + "integrity": "sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, "node_modules/@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-ThA1WD8aDdVU4VLuyq5NEqriwXErF5gEIJeyT6gHBWU7JtSmW2a5qjNv3/vR82O20mW+1vhmeZJfBQPT3HCugg==", "dev": true, "dependencies": { "@types/node": "*", "minipass": "^4.0.0" } }, - "node_modules/@types/tar/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1143,14 +1201,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1170,13 +1228,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1187,13 +1245,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1214,9 +1272,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1227,13 +1285,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1254,18 +1312,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1280,12 +1338,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1296,10 +1354,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1318,9 +1382,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1470,16 +1534,32 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -1498,15 +1578,53 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1517,14 +1635,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1535,16 +1653,38 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/assertion-error": { @@ -1566,17 +1706,41 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -1624,9 +1788,9 @@ "dev": true }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { "node": "*" } @@ -1669,9 +1833,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1681,13 +1845,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1712,13 +1880,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1743,9 +1917,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "dev": true, "funding": [ { @@ -1755,22 +1929,26 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -1808,10 +1986,13 @@ "dev": true }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -1991,18 +2172,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/copyfiles/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/copyfiles/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2119,12 +2288,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2197,10 +2384,25 @@ "node": ">=6.0.0" } }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", "dev": true }, "node_modules/emoji-regex": { @@ -2214,36 +2416,52 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2252,14 +2470,81 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-shim-unscopables": { + "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "has": "^1.0.3" - } + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } }, "node_modules/es-to-primitive": { "version": "1.2.1", @@ -2285,9 +2570,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -2305,27 +2590,28 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2333,22 +2619,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2464,9 +2747,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -2673,6 +2956,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-esnext/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-esnext/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -2730,9 +3025,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2917,9 +3212,9 @@ } }, "node_modules/eslint-config-node/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3126,6 +3421,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-node/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-node/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3183,9 +3490,9 @@ } }, "node_modules/eslint-config-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3270,9 +3577,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -3384,9 +3691,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3606,6 +3913,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-react-native/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3663,9 +3982,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3852,9 +4171,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4061,6 +4380,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-recommended/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-recommended/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4118,9 +4449,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4205,13 +4536,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4224,9 +4556,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4283,49 +4615,29 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4335,12 +4647,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -4355,11 +4667,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-json": { "version": "3.1.0", @@ -4394,34 +4709,10 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4440,15 +4731,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -4457,8 +4749,8 @@ "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -4487,12 +4779,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4504,9 +4796,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4565,36 +4857,33 @@ } }, "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4604,9 +4893,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4620,14 +4909,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4718,9 +5007,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4758,9 +5047,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4802,6 +5091,36 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4866,12 +5185,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -4879,11 +5199,20 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -4898,9 +5227,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -4965,9 +5294,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4979,21 +5308,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5027,12 +5359,13 @@ } }, "node_modules/genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.2.0.tgz", + "integrity": "sha512-OIYSX6XYA8PHecLDCTri30hadSZfAjZ8Iq1+BBDXqLWP4dRLuJNLoNjsSWtTpw97IccK2LDWzkEstxAB8GdN7g==", "dev": true, "dependencies": { "commander": "^7.2.0", + "ejs": "^3.1.9", "find-package": "^1.0.0" }, "bin": { @@ -5051,23 +5384,28 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5083,13 +5421,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5099,15 +5438,15 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -5131,9 +5470,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5145,6 +5484,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5178,29 +5532,17 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -5219,12 +5561,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5243,12 +5597,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5282,10 +5636,22 @@ "node": ">=8" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" @@ -5310,18 +5676,18 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5398,19 +5764,50 @@ } }, "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -5487,12 +5884,12 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5522,6 +5919,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -5530,6 +5939,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5542,10 +5966,19 @@ "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { + "node_modules/is-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5599,14 +6032,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5623,13 +6048,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5677,6 +6114,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5695,6 +6147,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5707,6 +6168,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5739,9 +6213,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -5775,9 +6249,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5801,17 +6275,32 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -5829,9 +6318,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5841,14 +6330,35 @@ "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/js-tokens": { @@ -5889,6 +6399,12 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5902,9 +6418,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5914,24 +6430,35 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -6022,9 +6549,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -6039,12 +6566,12 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { @@ -6072,9 +6599,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6087,9 +6614,9 @@ "dev": true }, "node_modules/mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -6111,10 +6638,13 @@ } }, "node_modules/mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -6130,9 +6660,9 @@ } }, "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "dev": true, "funding": [ { @@ -6165,9 +6695,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "dev": true, "funding": [ { @@ -6199,9 +6729,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "dev": true, "funding": [ { @@ -6220,9 +6750,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "dev": true, "funding": [ { @@ -6242,9 +6772,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "dev": true, "funding": [ { @@ -6262,9 +6792,9 @@ } }, "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "dev": true, "funding": [ { @@ -6280,14 +6810,13 @@ "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "dev": true, "funding": [ { @@ -6307,9 +6836,9 @@ } }, "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "dev": true, "funding": [ { @@ -6327,9 +6856,9 @@ } }, "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "dev": true, "funding": [ { @@ -6346,9 +6875,9 @@ } }, "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "dev": true, "funding": [ { @@ -6367,9 +6896,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "dev": true, "funding": [ { @@ -6387,9 +6916,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "dev": true, "funding": [ { @@ -6406,9 +6935,9 @@ } }, "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "dev": true, "funding": [ { @@ -6428,9 +6957,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "dev": true, "funding": [ { @@ -6444,9 +6973,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "dev": true, "funding": [ { @@ -6460,9 +6989,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "dev": true, "funding": [ { @@ -6479,9 +7008,9 @@ } }, "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "dev": true, "funding": [ { @@ -6498,9 +7027,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "dev": true, "funding": [ { @@ -6519,9 +7048,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "dev": true, "funding": [ { @@ -6541,9 +7070,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "dev": true, "funding": [ { @@ -6557,9 +7086,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "dev": true, "funding": [ { @@ -6628,18 +7157,19 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6673,21 +7203,20 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -6697,13 +7226,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -6718,10 +7246,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/brace-expansion": { @@ -6744,6 +7268,25 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -6816,18 +7359,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6846,25 +7377,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -6878,9 +7390,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/noms": { @@ -7080,9 +7592,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7098,13 +7610,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -7116,28 +7628,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7146,28 +7658,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7200,17 +7725,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7454,6 +7979,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7517,9 +8051,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -7539,20 +8073,10 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -7623,15 +8147,37 @@ "node": ">=8.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7665,9 +8211,9 @@ } }, "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -7694,12 +8240,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7813,6 +8359,30 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7834,15 +8404,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7859,9 +8432,9 @@ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7906,6 +8479,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7928,14 +8533,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8058,47 +8667,65 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8225,9 +8852,9 @@ } }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -8240,15 +8867,12 @@ "node": ">=10" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { @@ -8293,9 +8917,9 @@ } }, "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -8355,15 +8979,10 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "funding": { "type": "github", @@ -8371,9 +8990,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -8423,13 +9042,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -8477,9 +9096,9 @@ } }, "node_modules/txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/txm/-/txm-8.2.0.tgz", + "integrity": "sha512-ALNu1KIbUMXlsl/UacjfhbtG4CWK07JYtf0KNf8aXhoixmtgMj2MdOit5er6V8qh5eTIvtB6+AexIQMLZhSz6Q==", "dev": true, "dependencies": { "async": "^3.2.1", @@ -8497,9 +9116,9 @@ } }, "node_modules/txm/node_modules/supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "engines": { "node": ">=12" @@ -8541,6 +9160,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8551,9 +9243,9 @@ } }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8578,6 +9270,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -8598,9 +9295,9 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" @@ -8611,9 +9308,9 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/untildify": { "version": "4.0.0", @@ -8625,9 +9322,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -8637,6 +9334,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -8644,7 +9345,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -8693,9 +9394,9 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8-compile-cache-lib": { @@ -8705,9 +9406,9 @@ "dev": true }, "node_modules/vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8721,9 +9422,9 @@ } }, "node_modules/vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8748,15 +9449,15 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, "node_modules/vscode-nls": { @@ -8766,25 +9467,11 @@ "dev": true }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8816,16 +9503,82 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8882,6 +9635,18 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9008,6621 +9773,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", - "dev": true - }, - "@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^17.7.2" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", - "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", - "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", - "requires": { - "@octokit/types": "^11.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sweet-monads/either": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/either/-/either-3.2.0.tgz", - "integrity": "sha512-n+nR0b60GRTKb+D76qhTf4NEBXU9zfpigYYEtKtSYbV+5+i5gxr9jFd64pYkY2O7hVsb/G7nspbAeFni/i1ltA==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@sweet-monads/interfaces": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/interfaces/-/interfaces-3.3.0.tgz", - "integrity": "sha512-66akGvjPD4lizQy+w4JSltJilc2w/QPdw8lPAniLJGHwyjmrw9xMJLx76Q/GDnbCU59Werses4aZJLWOlJrL5A==" - }, - "@sweet-monads/maybe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/maybe/-/maybe-3.2.0.tgz", - "integrity": "sha512-/t+K0D/kBfkYOkZaePEsrK868at0M9UIEVgehcM0xscrCSZhKWGteE41vl2XJQqh8WyiFo/mZ5y7eAPSYzS+pg==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" - }, - "@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", - "dev": true, - "requires": { - "@types/node": "*", - "minipass": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true - } - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" - }, - "antlr4ts-cli": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz", - "integrity": "sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - } - } - }, - "eslint-config-esnext": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz", - "integrity": "sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA==", - "dev": true, - "requires": { - "babel-eslint": "^10.0.1", - "eslint": "^6.8.0", - "eslint-plugin-babel": "^5.2.1", - "eslint-plugin-import": "^2.14.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-node/-/eslint-config-node-4.1.0.tgz", - "integrity": "sha512-Wz17xV5O2WFG8fGdMYEBdbiL6TL7YNJSJvSX9V4sXQownewfYmoqlly7wxqLkOUv/57pq6LnnotMiQQrrPjCqQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-config-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-native/-/eslint-config-react-native-4.1.0.tgz", - "integrity": "sha512-kNND+cs+ztawH7wgajf/K6FfNshjlDsFDAkkFZF9HAXDgH1w1sNMIfTfwzufg0hOcSK7rbiL4qbG/gg/oR507Q==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-native": "^3.8.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-plugin-react-native": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz", - "integrity": "sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.7.4", - "eslint-plugin-react-native-globals": "^0.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-recommended": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-recommended/-/eslint-config-recommended-4.1.0.tgz", - "integrity": "sha512-2evA0SX1VqtyFiExmBI2WAO4XQCKlr7wmNELE8rcT5PyZY2ixsY881ofVZWKuI/dywpgLiES1gR/XUQcnVLRzQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-config-node": "^4.1.0", - "eslint-config-react-native": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", - "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-3.1.0.tgz", - "integrity": "sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "vscode-json-languageservice": "^4.1.6" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-package": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz", - "integrity": "sha512-yVn71XCCaNgxz58ERTl8nA/8YYtIQDY9mHSrgFBfiFtdNNfY0h183Vh8BRkKxD8x9TUw3ec290uJKhDVxqGZBw==", - "dev": true, - "requires": { - "parents": "^1.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", - "dev": true, - "requires": { - "commander": "^7.2.0", - "find-package": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "line-column": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", - "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", - "requires": { - "isarray": "^1.0.0", - "isobject": "^2.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "dev": true - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", - "dev": true, - "requires": { - "async": "^3.2.1", - "diff-match-patch": "^1.0.5", - "kleur": "^4.1.4", - "remark-parse": "^10.0.1", - "supports-color": "^9.1.0", - "unified": "^10.1.1" - }, - "dependencies": { - "supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "vscode-json-languageservice": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", - "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.3", - "vscode-languageserver-types": "^3.16.0", - "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.3" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "vscode-nls": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/quint/package.json b/quint/package.json index 970566b5d..4bee3265d 100644 --- a/quint/package.json +++ b/quint/package.json @@ -63,7 +63,6 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index d1e943206..be2f54bde 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -21,7 +21,6 @@ import fs from 'fs' import os from 'os' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // import semver from 'semver' -import fetch from 'node-fetch' import { pipeline } from 'stream/promises' import child_process from 'child_process' import * as tar from 'tar' @@ -277,7 +276,7 @@ function downloadAndUnpackApalache(): Promise> { return fetch(url) .then( // unpack response body - res => pipeline(res.body, tar.extract({ cwd: apalacheDistDir(), strict: true })), + res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), error => err(`Error fetching ${url}: ${error}`) ) .then( From cc1ffab2e93a13af6bdac793ddbeea739c16511a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 18:34:32 -0500 Subject: [PATCH 248/428] Fix visitor and transformer for params Followup for #1371 I forgot to add visitor logic for the parameter type annotations --- quint/src/ir/IRTransformer.ts | 3 +++ quint/src/ir/IRVisitor.ts | 6 +++++- quint/test/ir/IRTransformer.test.ts | 20 ++++++++++++++++++++ quint/test/ir/IRVisitor.test.ts | 20 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 3f3eb6963..5cf1389c1 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -483,6 +483,9 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q newExpr = transformer.enterLambda(newExpr) } + newExpr.params = newExpr.params.map(p => + p.typeAnnotation ? { ...p, typeAnnotation: transformType(transformer, p.typeAnnotation) } : p + ) newExpr.expr = transformExpression(transformer, newExpr.expr) if (transformer.exitLambda) { diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 282f048ec..879eb112b 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -456,7 +456,11 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.enterLambda) { visitor.enterLambda(expr) } - + expr.params.forEach(p => { + if (p.typeAnnotation) { + walkType(visitor, p.typeAnnotation) + } + }) walkExpression(visitor, expr.expr) if (visitor.exitLambda) { diff --git a/quint/test/ir/IRTransformer.test.ts b/quint/test/ir/IRTransformer.test.ts index c01ce0d51..70b210cbc 100644 --- a/quint/test/ir/IRTransformer.test.ts +++ b/quint/test/ir/IRTransformer.test.ts @@ -41,6 +41,26 @@ describe('enterExpr', () => { assert.deepEqual(moduleToString(result), moduleToString(expectedModule)) }) + + it('transforms paramater type annotations', () => { + class TestTransformer implements IRTransformer { + exitType(_: QuintType): QuintType { + return { kind: 'var', name: 'trans' } + } + } + + const transformer = new TestTransformer() + + const m = buildModuleWithDecls(['def foo(x: int, b: int, c: str): int = 42']) + + const transformedDecl = transformModule(transformer, m).declarations[0] + assert(transformedDecl.kind === 'def') + assert(transformedDecl.expr.kind === 'lambda') + transformedDecl.expr.params.forEach(p => { + assert(p.typeAnnotation) + assert.deepEqual(p.typeAnnotation, { kind: 'var', name: 'trans' }) + }) + }) }) describe('enterDecl', () => { diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index c3c41d5a3..6c9da5333 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -902,5 +902,25 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) }) + + it('finds paramater type annotations', () => { + class TestVisitor implements IRVisitor { + typesVisited: QuintType[] = [] + exitType(t: QuintType) { + this.typesVisited.push(t) + } + } + + const visitor = new TestVisitor() + + const m = buildModuleWithDecls(['def foo(x: int, b: str): bool = true']) + walkModule(visitor, m) + const actualTypes = visitor.typesVisited.map(typeToString) + // `int` and `str` should each show up TWICE: + // - once from of the lambda type annotations + // - once from of the parameter type annotation + const expectedTypes = ['int', 'str', 'bool', '(int, str) => bool', 'int', 'str'] + assert.deepEqual(actualTypes, expectedTypes) + }) }) }) From 5502f12ddb03ada79d3e115a2b4fc4a052d9b0e1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 2 Feb 2024 14:01:51 -0500 Subject: [PATCH 249/428] Remove type abstraction Also includes some incidental cleanup. --- quint/src/generated/Quint.g4 | 2 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 246 +++++++++--------- quint/src/graphics.ts | 2 - quint/src/ir/IRTransformer.ts | 18 -- quint/src/ir/IRVisitor.ts | 9 - quint/src/ir/IRprinting.ts | 5 - quint/src/ir/quintTypes.ts | 23 +- quint/src/parsing/ToIrListener.ts | 29 +-- quint/src/quintAnalyzer.ts | 10 +- quint/src/types/constraintGenerator.ts | 31 ++- quint/src/types/inferrer.ts | 5 +- quint/src/types/substitutions.ts | 8 +- quint/test/ir/IRVisitor.test.ts | 24 -- quint/test/types/inferrer.test.ts | 18 ++ .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- 17 files changed, 195 insertions(+), 241 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index ce8359885..a205cc230 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -127,7 +127,7 @@ type | typeVar # typeVarCase | qualId # typeConst | '(' type ')' # typeParen - | typeCtor=type ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + | typeCtor=qualId ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp ; typeVar: LOW_ID; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 7f37f7d5e..85206e0b9 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 408, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 421, 10, 20, 12, 20, 14, 20, 424, 11, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 407, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 408, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 408, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 408, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 408, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 7, 5, 2, 2, 398, 408, 7, 30, 2, 2, 399, 408, 7, 31, 2, 2, 400, 408, 7, 32, 2, 2, 401, 408, 5, 40, 21, 2, 402, 408, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 408, 3, 2, 2, 2, 407, 349, 3, 2, 2, 2, 407, 367, 3, 2, 2, 2, 407, 372, 3, 2, 2, 2, 407, 377, 3, 2, 2, 2, 407, 393, 3, 2, 2, 2, 407, 398, 3, 2, 2, 2, 407, 399, 3, 2, 2, 2, 407, 400, 3, 2, 2, 2, 407, 401, 3, 2, 2, 2, 407, 402, 3, 2, 2, 2, 407, 403, 3, 2, 2, 2, 408, 429, 3, 2, 2, 2, 409, 410, 12, 16, 2, 2, 410, 411, 7, 28, 2, 2, 411, 428, 5, 38, 20, 16, 412, 413, 12, 15, 2, 2, 413, 414, 7, 29, 2, 2, 414, 428, 5, 38, 20, 15, 415, 416, 12, 3, 2, 2, 416, 417, 7, 13, 2, 2, 417, 422, 5, 38, 20, 2, 418, 419, 7, 10, 2, 2, 419, 421, 5, 38, 20, 2, 420, 418, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 426, 7, 14, 2, 2, 426, 428, 3, 2, 2, 2, 427, 409, 3, 2, 2, 2, 427, 412, 3, 2, 2, 2, 427, 415, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 407, 422, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 413, 10, 20, 12, 20, 14, 20, 416, 11, 20, 3, 20, 3, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 419, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 420, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 420, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 420, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 420, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 420, 7, 5, 2, 2, 398, 420, 7, 30, 2, 2, 399, 420, 7, 31, 2, 2, 400, 420, 7, 32, 2, 2, 401, 420, 5, 40, 21, 2, 402, 420, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 420, 3, 2, 2, 2, 407, 408, 5, 82, 42, 2, 408, 409, 7, 13, 2, 2, 409, 414, 5, 38, 20, 2, 410, 411, 7, 10, 2, 2, 411, 413, 5, 38, 20, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 14, 2, 2, 418, 420, 3, 2, 2, 2, 419, 349, 3, 2, 2, 2, 419, 367, 3, 2, 2, 2, 419, 372, 3, 2, 2, 2, 419, 377, 3, 2, 2, 2, 419, 393, 3, 2, 2, 2, 419, 398, 3, 2, 2, 2, 419, 399, 3, 2, 2, 2, 419, 400, 3, 2, 2, 2, 419, 401, 3, 2, 2, 2, 419, 402, 3, 2, 2, 2, 419, 403, 3, 2, 2, 2, 419, 407, 3, 2, 2, 2, 420, 429, 3, 2, 2, 2, 421, 422, 12, 16, 2, 2, 422, 423, 7, 28, 2, 2, 423, 428, 5, 38, 20, 16, 424, 425, 12, 15, 2, 2, 425, 426, 7, 29, 2, 2, 426, 428, 5, 38, 20, 15, 427, 421, 3, 2, 2, 2, 427, 424, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 414, 419, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index d73133d0f..f2ba2709c 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1389,9 +1389,9 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 405; + this.state = 417; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); @@ -1610,6 +1610,42 @@ export class QuintParser extends Parser { this.match(QuintParser.RPAREN); } break; + + case 12: + { + _localctx = new TypeAppContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 405; + (_localctx as TypeAppContext)._typeCtor = this.qualId(); + { + this.state = 406; + this.match(QuintParser.T__10); + this.state = 407; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 412; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 408; + this.match(QuintParser.T__7); + this.state = 409; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 414; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 415; + this.match(QuintParser.T__11); + } + } + break; } this._ctx._stop = this._input.tryLT(-1); this.state = 427; @@ -1629,13 +1665,13 @@ export class QuintParser extends Parser { { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 407; + this.state = 419; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 408; + this.state = 420; this.match(QuintParser.T__25); - this.state = 409; + this.state = 421; this.type(14); } break; @@ -1644,54 +1680,16 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 410; + this.state = 422; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 411; + this.state = 423; this.match(QuintParser.T__26); - this.state = 412; + this.state = 424; this.type(13); } break; - - case 3: - { - _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); - (_localctx as TypeAppContext)._typeCtor = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 413; - if (!(this.precpred(this._ctx, 1))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); - } - { - this.state = 414; - this.match(QuintParser.T__10); - this.state = 415; - (_localctx as TypeAppContext)._type = this.type(0); - (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 420; - this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { - { - this.state = 416; - this.match(QuintParser.T__7); - this.state = 417; - (_localctx as TypeAppContext)._type = this.type(0); - (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - } - } - this.state = 422; - this._errHandler.sync(this); - _la = this._input.LA(1); - } - this.state = 423; - this.match(QuintParser.T__11); - } - } - break; } } } @@ -3612,48 +3610,45 @@ export class QuintParser extends Parser { case 1: return this.precpred(this._ctx, 13); - - case 2: - return this.precpred(this._ctx, 1); } return true; } private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { - case 3: + case 2: return this.precpred(this._ctx, 26); - case 4: + case 3: return this.precpred(this._ctx, 24); - case 5: + case 4: return this.precpred(this._ctx, 23); - case 6: + case 5: return this.precpred(this._ctx, 22); - case 7: + case 6: return this.precpred(this._ctx, 20); - case 8: + case 7: return this.precpred(this._ctx, 18); - case 9: + case 8: return this.precpred(this._ctx, 16); - case 10: + case 9: return this.precpred(this._ctx, 15); - case 11: + case 10: return this.precpred(this._ctx, 14); - case 12: + case 11: return this.precpred(this._ctx, 8); - case 13: + case 12: return this.precpred(this._ctx, 30); - case 14: + case 13: return this.precpred(this._ctx, 27); } return true; @@ -3704,17 +3699,17 @@ export class QuintParser extends Parser { "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x05\x14\u0198\n\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A5" + - "\n\x14\f\x14\x0E\x14\u01A8\v\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14\f" + - "\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16\x0E" + - "\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16\x03" + - "\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + + "\u019D\n\x14\f\x14\x0E\x14\u01A0\v\x14\x03\x14\x03\x14\x05\x14\u01A4\n" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14" + + "\f\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16" + + "\x0E\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16" + + "\x03\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x07\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + @@ -3760,7 +3755,7 @@ export class QuintParser extends Parser { "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + - "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u0197\x03\x02\x02\x02(\u01B0" + + "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u01A3\x03\x02\x02\x02(\u01B0" + "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + @@ -3878,64 +3873,64 @@ export class QuintParser extends Parser { "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + - "\u016D\u016E\x07\x1D\x02\x02\u016E\u0198\x05&\x14\x0E\u016F\u0170\x07" + + "\u016D\u016E\x07\x1D\x02\x02\u016E\u01A4\x05&\x14\x0E\u016F\u0170\x07" + "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + - "\x07\x0E\x02\x02\u0173\u0198\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + + "\x07\x0E\x02\x02\u0173\u01A4\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + - "\x02\x02\u0178\u0198\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + + "\x02\x02\u0178\u01A4\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + - "\u0198\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + + "\u01A4\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + - "\x03\x02\x02\x02\u018D\u0198\x07\x05\x02\x02\u018E\u0198\x07\x1E\x02\x02" + - "\u018F\u0198\x07\x1F\x02\x02\u0190\u0198\x07 \x02\x02\u0191\u0198\x05" + - "(\x15\x02\u0192\u0198\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + - "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u0198\x03\x02\x02\x02\u0197\u015D" + - "\x03\x02\x02\x02\u0197\u016F\x03\x02\x02\x02\u0197\u0174\x03\x02\x02\x02" + - "\u0197\u0179\x03\x02\x02\x02\u0197\u0189\x03\x02\x02\x02\u0197\u018E\x03" + - "\x02\x02\x02\u0197\u018F\x03\x02\x02\x02\u0197\u0190\x03\x02\x02\x02\u0197" + - "\u0191\x03\x02\x02\x02\u0197\u0192\x03\x02\x02\x02\u0197\u0193\x03\x02" + - "\x02\x02\u0198\u01AD\x03\x02\x02\x02\u0199\u019A\f\x10\x02\x02\u019A\u019B" + - "\x07\x1C\x02\x02\u019B\u01AC\x05&\x14\x10\u019C\u019D\f\x0F\x02\x02\u019D" + - "\u019E\x07\x1D\x02\x02\u019E\u01AC\x05&\x14\x0F\u019F\u01A0\f\x03\x02" + - "\x02\u01A0\u01A1\x07\r\x02\x02\u01A1\u01A6\x05&\x14\x02\u01A2\u01A3\x07" + - "\n\x02\x02\u01A3\u01A5\x05&\x14\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + - "\u01A8\x03\x02\x02\x02\u01A6\u01A4\x03\x02\x02\x02\u01A6\u01A7\x03\x02" + - "\x02\x02\u01A7\u01A9\x03\x02\x02\x02\u01A8\u01A6\x03\x02\x02\x02\u01A9" + - "\u01AA\x07\x0E\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u0199\x03\x02" + - "\x02\x02\u01AB\u019C\x03\x02\x02\x02\u01AB\u019F\x03\x02\x02\x02\u01AC" + - "\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03\x02" + - "\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0\u01B1" + - "\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3\u01B4" + - "\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02\x02" + - "\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07\x07" + - "\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB\u01B6" + - "\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02\x02\x02" + - "\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF\u01BD\x03" + - "\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02\x02\u01C2" + - "\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03\x02\x02\x02" + - "\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5\u01C6\x07" + - "\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02\u01C7\u01C5" + - "\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+\x02\u01CA-\x03" + - "\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x058\x1D\x02\u01CD" + - "\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05F$\x02\u01D0" + - "\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x03\x02" + - "\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02\u01D4\u01D5" + - "\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02\u01D7\u01D8" + - "\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18\x17\u01DA" + - "\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD\x07\x04\x02" + - "\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF\u01E1\x05" + - ".\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02\x02\u01E2" + - "\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6\x03\x02" + - "\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02\u01E6\u01E5" + - "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02" + - "\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA\u01EB\x07" + - ".\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02\u01ED\u01EE" + - "\x07\n\x02\x02\u01EE\u01F0"; + "\x03\x02\x02\x02\u018D\u01A4\x07\x05\x02\x02\u018E\u01A4\x07\x1E\x02\x02" + + "\u018F\u01A4\x07\x1F\x02\x02\u0190\u01A4\x07 \x02\x02\u0191\u01A4\x05" + + "(\x15\x02\u0192\u01A4\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + + "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u01A4\x03\x02\x02\x02\u0197\u0198" + + "\x05R*\x02\u0198\u0199\x07\r\x02\x02\u0199\u019E\x05&\x14\x02\u019A\u019B" + + "\x07\n\x02\x02\u019B\u019D\x05&\x14\x02\u019C\u019A\x03\x02\x02\x02\u019D" + + "\u01A0\x03\x02\x02\x02\u019E\u019C\x03\x02\x02\x02\u019E\u019F\x03\x02" + + "\x02\x02\u019F\u01A1\x03\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A1" + + "\u01A2\x07\x0E\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u015D\x03\x02" + + "\x02\x02\u01A3\u016F\x03\x02\x02\x02\u01A3\u0174\x03\x02\x02\x02\u01A3" + + "\u0179\x03\x02\x02\x02\u01A3\u0189\x03\x02\x02\x02\u01A3\u018E\x03\x02" + + "\x02\x02\u01A3\u018F\x03\x02\x02\x02\u01A3\u0190\x03\x02\x02\x02\u01A3" + + "\u0191\x03\x02\x02\x02\u01A3\u0192\x03\x02\x02\x02\u01A3\u0193\x03\x02" + + "\x02\x02\u01A3\u0197\x03\x02\x02\x02\u01A4\u01AD\x03\x02\x02\x02\u01A5" + + "\u01A6\f\x10\x02\x02\u01A6\u01A7\x07\x1C\x02\x02\u01A7\u01AC\x05&\x14" + + "\x10\u01A8\u01A9\f\x0F\x02\x02\u01A9\u01AA\x07\x1D\x02\x02\u01AA\u01AC" + + "\x05&\x14\x0F\u01AB\u01A5\x03\x02\x02\x02\u01AB\u01A8\x03\x02\x02\x02" + + "\u01AC\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03" + + "\x02\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0" + + "\u01B1\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3" + + "\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02" + + "\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07" + + "\x07\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB" + + "\u01B6\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02" + + "\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF" + + "\u01BD\x03\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02" + + "\x02\u01C2\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03" + + "\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5" + + "\u01C6\x07\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02" + + "\u01C7\u01C5\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+" + + "\x02\u01CA-\x03\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x05" + + "8\x1D\x02\u01CD\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05" + + "F$\x02\u01D0\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2" + + "\x03\x02\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02" + + "\u01D4\u01D5\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02" + + "\u01D7\u01D8\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18" + + "\x17\u01DA\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD" + + "\x07\x04\x02\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF" + + "\u01E1\x05.\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02" + + "\x02\u01E2\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6" + + "\x03\x02\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02" + + "\u01E6\u01E5\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03" + + "\x02\x02\x02\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA" + + "\u01EB\x07.\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02" + + "\u01ED\u01EE\x07\n\x02\x02\u01EE\u01F0"; private static readonly _serializedATNSegment1: string = "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + @@ -4078,7 +4073,7 @@ export class QuintParser extends Parser { "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + - "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u0197\u01A6" + + "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u019E\u01A3" + "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + @@ -5553,9 +5548,12 @@ export class TypeParenContext extends TypeContext { } } export class TypeAppContext extends TypeContext { - public _typeCtor!: TypeContext; + public _typeCtor!: QualIdContext; public _type!: TypeContext; public _typeArg: TypeContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } public type(): TypeContext[]; public type(i: number): TypeContext; public type(i?: number): TypeContext | TypeContext[] { diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 1bcfb5575..d1fcbcb15 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -207,8 +207,6 @@ export function prettyQuintType(type: QuintType): Doc { const args = type.args.map(prettyQuintType) return group([prettyQuintType(type), text('['), ...args, text(']')]) } - case 'abs': - fail('internal error: type abstraction should never be printed for users in graphics') } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 5cf1389c1..e095b7347 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -86,8 +86,6 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType - enterAbsType?: (type: t.QuintAbsType) => t.QuintAbsType - exitAbsType?: (type: t.QuintAbsType) => t.QuintAbsType enterAppType?: (type: t.QuintAppType) => t.QuintAppType exitAppType?: (type: t.QuintAppType) => t.QuintAppType @@ -259,28 +257,12 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } break - case 'abs': - { - if (transformer.enterAbsType) { - newType = transformer.enterAbsType(newType) - } - - newType.vars = newType.vars.map(v => transformType(transformer, v) as t.QuintVarType) - newType.body = transformType(transformer, newType.body) - - if (transformer.exitAbsType) { - newType = transformer.exitAbsType(newType) - } - } - break - case 'app': { if (transformer.enterAppType) { newType = transformer.enterAppType(newType) } - newType.ctor = transformType(transformer, newType.ctor) newType.args = newType.args.map(v => transformType(transformer, v)) if (transformer.exitAppType) { diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 879eb112b..f321ef8df 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -95,8 +95,6 @@ export interface IRVisitor { exitSumType?: (_type: t.QuintSumType) => void enterAppType?: (_type: t.QuintAppType) => void exitAppType?: (_type: t.QuintAppType) => void - enterAbsType?: (_type: t.QuintAbsType) => void - exitAbsType?: (_type: t.QuintAbsType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -249,13 +247,6 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break - case 'abs': - visitor.enterAbsType?.(type) - type.vars.map(t => walkType(visitor, t)) - walkType(visitor, type.body) - visitor.exitAbsType?.(type) - break - case 'app': visitor.enterAppType?.(type) walkType(visitor, type.ctor) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 274ce939e..16acc3e0e 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -187,11 +187,6 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } - case 'abs': { - const vars = type.vars.map(typeToString).join(', ') - const body = typeToString(type.body) - return `Λ(${vars}).${body}` - } case 'app': { const abs = typeToString(type.ctor) const args = type.args.map(typeToString).join(', ') diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index cddd85672..f8322d67a 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,26 +98,20 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } -/** Type abstraction +/** + * Type application * - * In System-F, this corresponds to Λτ1.(...(Λτ2.(Τ)). - */ -export interface QuintAbsType extends WithOptionalId { - kind: 'abs' - vars: QuintVarType[] /** The bound variables */ - body: QuintType /** The body of the abstraction */ -} - -/** Type application: (Λτ.Τ)υ + * E.g., * - * In System-F, this corresponds to (Λτ.Τ)υ + * ``` + * T[int, str] + * ``` * - * Type application is only well well-formed if `ctor` is (resolved to) an - * n-ary type abstraction, and `args.length === n` + * for a type constant `T`. */ export interface QuintAppType extends WithOptionalId { kind: 'app' - ctor: QuintType /** The type "constructor" applied */ + ctor: QuintConstType /** The type constructor applied */ args: QuintType[] /** The arguments to which the constructor is applied */ } @@ -137,7 +131,6 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType - | QuintAbsType | QuintAppType /** diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f14f48e58..0b6b296de 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -20,7 +20,6 @@ import { } from '../ir/quintIr' import { ConcreteFixedRow, - QuintAbsType, QuintAppType, QuintConstType, QuintSumType, @@ -364,19 +363,16 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text // NOTE: `rhs` must precede `typeVariables` due to the stack order! - const rhs = this.popType().unwrap(() => + const type = this.popType().unwrap(() => fail('internal error: type alias declaration parsed with no right hand side') ) - const typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) - if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const type: QuintType = - typeVariables.length === 0 - ? rhs // A monomorphic type declaration - : { id: this.getId(ctx), kind: 'abs', vars: typeVariables, body: rhs } // A polymorphic type declaration + // TODO: Check that variables have all been declared + // TODO: Add types to declaration + const _typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) @@ -391,16 +387,13 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text - const typeVars = this.popTypeDefHeadTypeVars(defHead) // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const sumType: QuintSumType = { id, kind: 'sum', fields: row } - const type: QuintSumType | QuintAbsType = - typeVars.length === 0 - ? sumType // A monomorphic type - : { id: this.getId(ctx), kind: 'abs', vars: typeVars, body: sumType } // A polymorphic type + const type: QuintSumType = { id, kind: 'sum', fields: row } + // TODO: Check all vars in body are bound + const _typeVars = this.popTypeDefHeadTypeVars(defHead) const def: QuintTypeDef = { id: id, @@ -410,11 +403,7 @@ export class ToIrListener implements QuintListener { } // Used for annotations in the variant constructors - const typeConst: QuintConstType = { id, kind: 'const', name } - const constructorReturnType: QuintConstType | QuintAppType = - typeVars.length === 0 - ? typeConst // For a monomorphic type annotation - : { id: this.getId(ctx), kind: 'app', ctor: typeConst, args: typeVars } // A polymorphic type annotation + const constructorReturnType: QuintConstType = { id, kind: 'const', name } // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression @@ -1092,7 +1081,7 @@ export class ToIrListener implements QuintListener { .reverse() // The next type on the stack after the args should be the applied // type constructor - const ctor = this.popType().unwrap() + const ctor: QuintConstType = { id: this.getId(ctx), kind: 'const', name: ctx._typeCtor.text } this.typeStack.push({ id, kind: 'app', ctor, args }) } diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 5d64b36ef..e7bc4b7c9 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -42,16 +42,16 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) - quintModules.map(m => analyzer.analyze(m)) + quintModules.map(m => analyzer.analyzeDeclarations(m.declarations)) return analyzer.getResult() } /** - * Analyzes a single Quint definition incrementally and returns the analysis result. + * Analyzes declarations incrementally and returns the analysis result. * * @param analysisOutput - The previous analysis output to be used as a starting point. * @param lookupTable - The lookup tables for the modules. - * @param declaration - The Quint declaration to be analyzed. + * @param declarations - The Quint declarations to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeInc( @@ -90,10 +90,6 @@ class QuintAnalyzer { this.modeChecker = new ModeChecker(previousOutput?.modes) } - analyze(module: QuintModule): void { - this.analyzeDeclarations(module.declarations) - } - analyzeDeclarations(decls: QuintDeclaration[]): void { const [typeErrMap, types] = this.typeInferrer.inferTypes(decls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(decls) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index f92f96a9b..4ac413bcf 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -110,6 +110,23 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Nested lambdas add new entries to the stack, and pop them when exiting. private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] + // int[a] + // + // TODO: Free type variables must also use the variables in the constructor + // + // type T[a] = Set[a] + // type U[a, b] = (Set[a], List[b]) + // + // U[int, int] + // val x = (Set(1,2), List(1,2)) + // val f : a => U[a, U[a, b]] = ... + // + // U[a, b] =.= U[int, int] /\ a =.= b /\ typeOf(x) =.= (Set[a], List[b]) + // + // type MapT[a,b] = (Set[a], a => b) => Set[b] + // + // def map(s: Set[a], f: a => b): Set[b] = ... + // getResult(): [Map, Map] { return [this.errors, this.types] } @@ -121,13 +138,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { exitDef(def: QuintDef) { if (this.constraints.length > 0) { this.solveConstraints().map(subs => { - if (!isAnnotatedDef(def)) { - return + if (isAnnotatedDef(def)) { + checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => + this.errors.set(def.typeAnnotation?.id ?? def.id, err) + ) } - - checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => - this.errors.set(def.typeAnnotation?.id ?? def.id, err) - ) }) } } @@ -193,7 +208,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) // We want `definedSignature` computed before the fresh variable `a` so that the - // numbering of ther fresh variables stays in order, with `a`, used for return types, + // numbering of their fresh variables stays in order, with `a`, used for return types, // bearing the highest number. const definedSignature = this.typeForName(e.opcode, e.id, e.args.length) const a: QuintType = { kind: 'var', name: this.freshVarGenerator.freshVar('_t') } @@ -300,6 +315,8 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.addToResults(e.id, this.fetchResult(e.expr.id)) } + // TODO: On type app exit, add constraints for the type operators? + // TODO: Need similar logic on exiting a type def (to create a scheme for a lambda) and exitOpDef(e: QuintOpDef) { if (this.errors.size !== 0) { return diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 8889765e8..16d26f8c0 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -24,17 +24,18 @@ import { simplify } from './simplification' export type TypeInferenceResult = [Map, Map] +// TODO: Get rid of this class? It is very shallow. What do we need it for? export class TypeInferrer extends ConstraintGeneratorVisitor { constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) } /** - * Infers an type for each expression in a list of QuintDeclarations + * Infers a type for each expression in a list of QuintDeclarations * * @param declarations: the list of QuintDeclarations to infer types for * - * @returns a map from expression ids to their types and a map from expression + * @returns a map from expression ids to their type schemes and a map from expression * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index a1f4f9c73..1e426b1dc 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -97,11 +97,11 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu // start as one, and applying substitions cannot result in a wider type fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } - - case 'abs': - throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) case 'app': - throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + return { + ...t, + args: t.args.map(a => applySubstitution(table, subs, a)), + } // The basic types have no variables, so don't require substitution case 'int': diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 6c9da5333..34b024d5b 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -856,30 +856,6 @@ describe('walkModule', () => { assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) - it('finds type abstractions', () => { - const quintModule = buildModuleWithDecls(['type StrMap[a] = str -> a']) - - class TestVisitor implements IRVisitor { - entered: QuintType[] = [] - exited: QuintType[] = [] - - enterAbsType(type: QuintType): void { - this.entered.push(type) - } - - exitAbsType(type: QuintType): void { - this.exited.push(type) - } - } - - const expectedTypes = ['Λ(a).(str -> a)'] - - const visitor = new TestVisitor() - walkModule(visitor, quintModule) - assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) - assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) - }) - it('finds type applications', () => { const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) class TestVisitor implements IRVisitor { diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 112415dbc..9fe0c58ba 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -395,6 +395,24 @@ module B { ) }) + it('checks correct polymorphic types', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + match r { + | Ok(x) => Ok(f(x)) + | Err(_) => r + }`, + ] + + const [errors, table] = inferTypesForDefs(defs) + assert.sameDeepMembers([...errors.entries()], []) + assert.sameDeepMembers( + [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), + [] + ) + }) + it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 1bdc18f98..e0af39456 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":35,"name":"m","declarations":[{"id":14,"kind":"typedef","name":"MapApp","type":{"id":15,"kind":"abs","vars":[{"id":7,"kind":"var","name":"a"},{"id":8,"kind":"var","name":"b"}],"body":{"id":13,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":11,"kind":"fun","arg":{"id":9,"kind":"var","name":"a"},"res":{"id":10,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":12,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":6,"kind":"abs","vars":[{"id":1,"kind":"var","name":"a"}],"body":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":28,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":18,"kind":"var","name":"ok"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__OkParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":25}]}}},{"id":34,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":19,"kind":"var","name":"err"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":33,"kind":"lambda","params":[{"id":30,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":32,"kind":"app","opcode":"variant","args":[{"id":29,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":31}]}}}]}],"table":{"20":{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},"25":{"id":24,"name":"__OkParam","kind":"param"},"31":{"id":30,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":31,"name":"m","declarations":[{"id":13,"kind":"typedef","name":"MapApp","type":{"id":12,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":10,"kind":"fun","arg":{"id":8,"kind":"var","name":"a"},"res":{"id":9,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":11,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":24,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":16,"kind":"var","name":"ok"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":23,"kind":"lambda","params":[{"id":20,"name":"__OkParam"}],"qualifier":"def","expr":{"id":22,"kind":"app","opcode":"variant","args":[{"id":19,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":21}]}}},{"id":30,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":17,"kind":"var","name":"err"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":29,"kind":"lambda","params":[{"id":26,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":28,"kind":"app","opcode":"variant","args":[{"id":25,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":27}]}}}]}],"table":{"18":{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},"21":{"id":20,"name":"__OkParam","kind":"param"},"27":{"id":26,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index b83f0ae3a..598ba96ac 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"7":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"8":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"9":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"10":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"12":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"13":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"14":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"15":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"16":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"17":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"20":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"21":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"22":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"25":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"26":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"27":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"28":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"31":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"32":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"33":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"34":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"35":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"7":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"8":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"9":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"10":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"12":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"13":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"14":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"15":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"16":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"17":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"18":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"31":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 081a1f69b692a4306763cd7fdccf268352997f74 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 20 Feb 2024 22:15:28 -0500 Subject: [PATCH 250/428] Add type paramaters to type declarations --- quint/src/generated/Quint.g4 | 2 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 1576 ++++++++--------- quint/src/ir/quintIr.ts | 8 +- quint/src/parsing/ToIrListener.ts | 69 +- quint/src/parsing/parseErrors.ts | 16 + quint/src/quintError.ts | 2 + quint/test/names/resolver.test.ts | 2 +- .../test/parsing/quintParserFrontend.test.ts | 18 + quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- 14 files changed, 872 insertions(+), 833 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index a205cc230..5e571e491 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -68,7 +68,7 @@ typeDef | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; -typeDefHead : typeName=qualId ('[' typeVars+=typeVar(',' typeVars+=typeVar)* ']')?; +typeDefHead : typeName=qualId ('[' typeVars+=LOW_ID(',' typeVars+=LOW_ID)* ']')?; sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 85206e0b9..f54adf8d9 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 413, 10, 20, 12, 20, 14, 20, 416, 11, 20, 3, 20, 3, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 419, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 420, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 420, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 420, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 420, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 420, 7, 5, 2, 2, 398, 420, 7, 30, 2, 2, 399, 420, 7, 31, 2, 2, 400, 420, 7, 32, 2, 2, 401, 420, 5, 40, 21, 2, 402, 420, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 420, 3, 2, 2, 2, 407, 408, 5, 82, 42, 2, 408, 409, 7, 13, 2, 2, 409, 414, 5, 38, 20, 2, 410, 411, 7, 10, 2, 2, 411, 413, 5, 38, 20, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 14, 2, 2, 418, 420, 3, 2, 2, 2, 419, 349, 3, 2, 2, 2, 419, 367, 3, 2, 2, 2, 419, 372, 3, 2, 2, 2, 419, 377, 3, 2, 2, 2, 419, 393, 3, 2, 2, 2, 419, 398, 3, 2, 2, 2, 419, 399, 3, 2, 2, 2, 419, 400, 3, 2, 2, 2, 419, 401, 3, 2, 2, 2, 419, 402, 3, 2, 2, 2, 419, 403, 3, 2, 2, 2, 419, 407, 3, 2, 2, 2, 420, 429, 3, 2, 2, 2, 421, 422, 12, 16, 2, 2, 422, 423, 7, 28, 2, 2, 423, 428, 5, 38, 20, 16, 424, 425, 12, 15, 2, 2, 425, 426, 7, 29, 2, 2, 426, 428, 5, 38, 20, 15, 427, 421, 3, 2, 2, 2, 427, 424, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 414, 419, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 562, 10, 24, 12, 24, 14, 24, 565, 11, 24, 3, 24, 5, 24, 568, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 576, 10, 24, 12, 24, 14, 24, 579, 11, 24, 5, 24, 581, 10, 24, 3, 24, 5, 24, 584, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 609, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 658, 10, 24, 12, 24, 14, 24, 661, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 667, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 672, 10, 25, 12, 25, 14, 25, 675, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 681, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 690, 10, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 704, 10, 28, 3, 29, 3, 29, 5, 29, 708, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 718, 10, 30, 12, 30, 14, 30, 721, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 727, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 734, 10, 31, 13, 31, 14, 31, 735, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 755, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 760, 10, 36, 12, 36, 14, 36, 763, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 771, 10, 37, 3, 38, 3, 38, 5, 38, 775, 10, 38, 3, 39, 3, 39, 5, 39, 779, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 788, 10, 42, 12, 42, 14, 42, 791, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 797, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 898, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 608, 3, 2, 2, 2, 48, 662, 3, 2, 2, 2, 50, 680, 3, 2, 2, 2, 52, 685, 3, 2, 2, 2, 54, 703, 3, 2, 2, 2, 56, 707, 3, 2, 2, 2, 58, 726, 3, 2, 2, 2, 60, 728, 3, 2, 2, 2, 62, 744, 3, 2, 2, 2, 64, 746, 3, 2, 2, 2, 66, 748, 3, 2, 2, 2, 68, 754, 3, 2, 2, 2, 70, 756, 3, 2, 2, 2, 72, 770, 3, 2, 2, 2, 74, 774, 3, 2, 2, 2, 76, 778, 3, 2, 2, 2, 78, 780, 3, 2, 2, 2, 80, 782, 3, 2, 2, 2, 82, 784, 3, 2, 2, 2, 84, 796, 3, 2, 2, 2, 86, 798, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 609, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 609, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 609, 5, 46, 24, 27, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 23, 473, 609, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 609, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 609, 3, 2, 2, 2, 504, 609, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 609, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 609, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 609, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 609, 3, 2, 2, 2, 557, 558, 7, 4, 2, 2, 558, 563, 5, 72, 37, 2, 559, 560, 7, 10, 2, 2, 560, 562, 5, 72, 37, 2, 561, 559, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 568, 7, 10, 2, 2, 567, 566, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 7, 5, 2, 2, 570, 609, 3, 2, 2, 2, 571, 580, 7, 13, 2, 2, 572, 577, 5, 46, 24, 2, 573, 574, 7, 10, 2, 2, 574, 576, 5, 46, 24, 2, 575, 573, 3, 2, 2, 2, 576, 579, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 580, 572, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 583, 3, 2, 2, 2, 582, 584, 7, 10, 2, 2, 583, 582, 3, 2, 2, 2, 583, 584, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 609, 7, 14, 2, 2, 586, 587, 7, 37, 2, 2, 587, 588, 7, 63, 2, 2, 588, 589, 5, 46, 24, 2, 589, 590, 7, 64, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 38, 2, 2, 592, 593, 5, 46, 24, 7, 593, 609, 3, 2, 2, 2, 594, 595, 5, 10, 6, 2, 595, 596, 5, 46, 24, 6, 596, 609, 3, 2, 2, 2, 597, 598, 5, 20, 11, 2, 598, 599, 5, 46, 24, 5, 599, 609, 3, 2, 2, 2, 600, 601, 7, 63, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 64, 2, 2, 603, 609, 3, 2, 2, 2, 604, 605, 7, 4, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 5, 2, 2, 607, 609, 3, 2, 2, 2, 608, 458, 3, 2, 2, 2, 608, 460, 3, 2, 2, 2, 608, 467, 3, 2, 2, 2, 608, 469, 3, 2, 2, 2, 608, 474, 3, 2, 2, 2, 608, 489, 3, 2, 2, 2, 608, 504, 3, 2, 2, 2, 608, 505, 3, 2, 2, 2, 608, 520, 3, 2, 2, 2, 608, 539, 3, 2, 2, 2, 608, 541, 3, 2, 2, 2, 608, 557, 3, 2, 2, 2, 608, 571, 3, 2, 2, 2, 608, 586, 3, 2, 2, 2, 608, 594, 3, 2, 2, 2, 608, 597, 3, 2, 2, 2, 608, 600, 3, 2, 2, 2, 608, 604, 3, 2, 2, 2, 609, 659, 3, 2, 2, 2, 610, 611, 12, 28, 2, 2, 611, 612, 7, 33, 2, 2, 612, 658, 5, 46, 24, 28, 613, 614, 12, 26, 2, 2, 614, 615, 9, 2, 2, 2, 615, 658, 5, 46, 24, 27, 616, 617, 12, 25, 2, 2, 617, 618, 9, 3, 2, 2, 618, 658, 5, 46, 24, 26, 619, 620, 12, 24, 2, 2, 620, 621, 9, 4, 2, 2, 621, 658, 5, 46, 24, 25, 622, 623, 12, 22, 2, 2, 623, 624, 7, 62, 2, 2, 624, 625, 5, 46, 24, 23, 625, 626, 8, 24, 1, 2, 626, 658, 3, 2, 2, 2, 627, 628, 12, 20, 2, 2, 628, 629, 7, 45, 2, 2, 629, 658, 5, 46, 24, 21, 630, 631, 12, 18, 2, 2, 631, 632, 7, 46, 2, 2, 632, 658, 5, 46, 24, 19, 633, 634, 12, 17, 2, 2, 634, 635, 7, 47, 2, 2, 635, 658, 5, 46, 24, 18, 636, 637, 12, 16, 2, 2, 637, 638, 7, 48, 2, 2, 638, 658, 5, 46, 24, 17, 639, 640, 12, 10, 2, 2, 640, 641, 7, 28, 2, 2, 641, 658, 5, 46, 24, 11, 642, 643, 12, 32, 2, 2, 643, 644, 7, 24, 2, 2, 644, 650, 5, 76, 39, 2, 645, 647, 7, 63, 2, 2, 646, 648, 5, 70, 36, 2, 647, 646, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 64, 2, 2, 650, 645, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 658, 3, 2, 2, 2, 652, 653, 12, 29, 2, 2, 653, 654, 7, 13, 2, 2, 654, 655, 5, 46, 24, 2, 655, 656, 7, 14, 2, 2, 656, 658, 3, 2, 2, 2, 657, 610, 3, 2, 2, 2, 657, 613, 3, 2, 2, 2, 657, 616, 3, 2, 2, 2, 657, 619, 3, 2, 2, 2, 657, 622, 3, 2, 2, 2, 657, 627, 3, 2, 2, 2, 657, 630, 3, 2, 2, 2, 657, 633, 3, 2, 2, 2, 657, 636, 3, 2, 2, 2, 657, 639, 3, 2, 2, 2, 657, 642, 3, 2, 2, 2, 657, 652, 3, 2, 2, 2, 658, 661, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 47, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 662, 663, 7, 50, 2, 2, 663, 664, 5, 46, 24, 2, 664, 666, 7, 4, 2, 2, 665, 667, 7, 15, 2, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 673, 5, 50, 26, 2, 669, 670, 7, 15, 2, 2, 670, 672, 5, 50, 26, 2, 671, 669, 3, 2, 2, 2, 672, 675, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 676, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 676, 677, 7, 5, 2, 2, 677, 49, 3, 2, 2, 2, 678, 681, 5, 52, 27, 2, 679, 681, 7, 39, 2, 2, 680, 678, 3, 2, 2, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 7, 29, 2, 2, 683, 684, 5, 46, 24, 2, 684, 51, 3, 2, 2, 2, 685, 692, 5, 84, 43, 2, 686, 689, 7, 63, 2, 2, 687, 690, 5, 84, 43, 2, 688, 690, 7, 39, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 693, 7, 64, 2, 2, 692, 686, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 695, 5, 8, 5, 2, 695, 696, 7, 2, 2, 3, 696, 704, 3, 2, 2, 2, 697, 698, 5, 46, 24, 2, 698, 699, 7, 2, 2, 3, 699, 704, 3, 2, 2, 2, 700, 701, 7, 69, 2, 2, 701, 704, 7, 2, 2, 3, 702, 704, 7, 2, 2, 3, 703, 694, 3, 2, 2, 2, 703, 697, 3, 2, 2, 2, 703, 700, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 55, 3, 2, 2, 2, 705, 708, 5, 58, 30, 2, 706, 708, 5, 60, 31, 2, 707, 705, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 57, 3, 2, 2, 2, 709, 710, 5, 64, 33, 2, 710, 711, 7, 29, 2, 2, 711, 712, 5, 46, 24, 2, 712, 727, 3, 2, 2, 2, 713, 714, 7, 63, 2, 2, 714, 719, 5, 64, 33, 2, 715, 716, 7, 10, 2, 2, 716, 718, 5, 64, 33, 2, 717, 715, 3, 2, 2, 2, 718, 721, 3, 2, 2, 2, 719, 717, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 722, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 722, 723, 7, 64, 2, 2, 723, 724, 7, 29, 2, 2, 724, 725, 5, 46, 24, 2, 725, 727, 3, 2, 2, 2, 726, 709, 3, 2, 2, 2, 726, 713, 3, 2, 2, 2, 727, 59, 3, 2, 2, 2, 728, 729, 7, 63, 2, 2, 729, 730, 7, 63, 2, 2, 730, 733, 5, 64, 33, 2, 731, 732, 7, 10, 2, 2, 732, 734, 5, 64, 33, 2, 733, 731, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 7, 64, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 29, 2, 2, 740, 741, 5, 46, 24, 2, 741, 61, 3, 2, 2, 2, 742, 745, 7, 39, 2, 2, 743, 745, 5, 82, 42, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 63, 3, 2, 2, 2, 746, 747, 5, 62, 32, 2, 747, 65, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 750, 7, 7, 2, 2, 750, 751, 5, 38, 20, 2, 751, 67, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 82, 42, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 69, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 71, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 84, 43, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 73, 3, 2, 2, 2, 772, 775, 5, 82, 42, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 75, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 77, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 79, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 81, 3, 2, 2, 2, 784, 789, 5, 86, 44, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 86, 44, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 83, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 86, 44, 2, 793, 794, 5, 82, 42, 2, 794, 795, 8, 43, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 85, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 563, 567, 577, 580, 583, 608, 647, 650, 657, 659, 666, 673, 680, 689, 692, 703, 707, 719, 726, 735, 744, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index f2ba2709c..8cb906851 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -708,7 +708,7 @@ export class QuintParser extends Parser { { this.state = 204; _localctx._typeName = this.qualId(); - this.state = 216; + this.state = 215; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { @@ -716,8 +716,8 @@ export class QuintParser extends Parser { this.state = 205; this.match(QuintParser.T__10); this.state = 206; - _localctx._typeVar = this.typeVar(); - _localctx._typeVars.push(_localctx._typeVar); + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); @@ -727,8 +727,8 @@ export class QuintParser extends Parser { this.state = 207; this.match(QuintParser.T__7); this.state = 208; - _localctx._typeVar = this.typeVar(); - _localctx._typeVars.push(_localctx._typeVar); + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); } } this.state = 213; @@ -764,31 +764,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 219; + this.state = 218; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 218; + this.state = 217; this.match(QuintParser.T__12); } } - this.state = 221; + this.state = 220; this.typeSumVariant(); - this.state = 226; + this.state = 225; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 222; + this.state = 221; this.match(QuintParser.T__12); - this.state = 223; + this.state = 222; this.typeSumVariant(); } } - this.state = 228; + this.state = 227; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -816,18 +816,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 229; + this.state = 228; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 234; + this.state = 233; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 230; + this.state = 229; this.match(QuintParser.LPAREN); - this.state = 231; + this.state = 230; this.type(0); - this.state = 232; + this.state = 231; this.match(QuintParser.RPAREN); } } @@ -856,32 +856,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 236; + this.state = 235; this.match(QuintParser.T__13); - this.state = 237; + this.state = 236; this.qualId(); - this.state = 240; + this.state = 239; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 238; + this.state = 237; this.match(QuintParser.T__4); - this.state = 239; + this.state = 238; this.type(0); } } - this.state = 242; + this.state = 241; this.match(QuintParser.ASGN); - this.state = 243; + this.state = 242; this.expr(0); - this.state = 245; + this.state = 244; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 244; + this.state = 243; this.match(QuintParser.T__8); } } @@ -907,13 +907,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 256; + this.state = 255; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 247; + this.state = 246; this.match(QuintParser.T__14); } break; @@ -921,7 +921,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 248; + this.state = 247; this.match(QuintParser.T__15); } break; @@ -929,9 +929,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 249; + this.state = 248; this.match(QuintParser.T__16); - this.state = 250; + this.state = 249; this.match(QuintParser.T__14); } break; @@ -939,9 +939,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 251; + this.state = 250; this.match(QuintParser.T__16); - this.state = 252; + this.state = 251; this.match(QuintParser.T__15); } break; @@ -949,7 +949,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 253; + this.state = 252; this.match(QuintParser.T__17); } break; @@ -957,7 +957,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 254; + this.state = 253; this.match(QuintParser.T__18); } break; @@ -965,7 +965,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 255; + this.state = 254; this.match(QuintParser.T__19); } break; @@ -991,28 +991,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 276; + this.state = 275; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 258; + this.state = 257; this.match(QuintParser.T__20); - this.state = 259; + this.state = 258; this.name(); - this.state = 260; + this.state = 259; this.match(QuintParser.T__21); - this.state = 261; + this.state = 260; this.identOrStar(); - this.state = 264; + this.state = 263; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 262; + this.state = 261; this.match(QuintParser.T__22); - this.state = 263; + this.state = 262; this.fromSource(); } } @@ -1023,30 +1023,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 266; + this.state = 265; this.match(QuintParser.T__20); - this.state = 267; + this.state = 266; this.name(); - this.state = 270; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 268; + this.state = 267; this.match(QuintParser.T__23); - this.state = 269; + this.state = 268; this.name(); } } - this.state = 274; + this.state = 273; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 272; + this.state = 271; this.match(QuintParser.T__22); - this.state = 273; + this.state = 272; this.fromSource(); } } @@ -1075,19 +1075,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 289; + this.state = 288; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 278; + this.state = 277; this.match(QuintParser.T__24); - this.state = 279; + this.state = 278; this.name(); - this.state = 280; + this.state = 279; this.match(QuintParser.T__21); - this.state = 281; + this.state = 280; this.identOrStar(); } break; @@ -1095,18 +1095,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 283; + this.state = 282; this.match(QuintParser.T__24); - this.state = 284; + this.state = 283; this.name(); - this.state = 287; + this.state = 286; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 285; + this.state = 284; this.match(QuintParser.T__23); - this.state = 286; + this.state = 285; this.name(); } } @@ -1135,60 +1135,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 337; + this.state = 336; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 291; + this.state = 290; this.match(QuintParser.T__20); - this.state = 292; + this.state = 291; this.moduleName(); - this.state = 293; + this.state = 292; this.match(QuintParser.LPAREN); { - this.state = 294; + this.state = 293; this.name(); - this.state = 295; + this.state = 294; this.match(QuintParser.ASGN); - this.state = 296; + this.state = 295; this.expr(0); - this.state = 304; + this.state = 303; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 297; + this.state = 296; this.match(QuintParser.T__7); - this.state = 298; + this.state = 297; this.name(); - this.state = 299; + this.state = 298; this.match(QuintParser.ASGN); - this.state = 300; + this.state = 299; this.expr(0); } } - this.state = 306; + this.state = 305; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 307; + this.state = 306; this.match(QuintParser.RPAREN); - this.state = 308; + this.state = 307; this.match(QuintParser.T__21); - this.state = 309; + this.state = 308; this.match(QuintParser.MUL); - this.state = 312; + this.state = 311; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 310; + this.state = 309; this.match(QuintParser.T__22); - this.state = 311; + this.state = 310; this.fromSource(); } } @@ -1199,54 +1199,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 314; + this.state = 313; this.match(QuintParser.T__20); - this.state = 315; + this.state = 314; this.moduleName(); - this.state = 316; + this.state = 315; this.match(QuintParser.LPAREN); { - this.state = 317; + this.state = 316; this.name(); - this.state = 318; + this.state = 317; this.match(QuintParser.ASGN); - this.state = 319; + this.state = 318; this.expr(0); - this.state = 327; + this.state = 326; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 320; + this.state = 319; this.match(QuintParser.T__7); - this.state = 321; + this.state = 320; this.name(); - this.state = 322; + this.state = 321; this.match(QuintParser.ASGN); - this.state = 323; + this.state = 322; this.expr(0); } } - this.state = 329; + this.state = 328; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 330; + this.state = 329; this.match(QuintParser.RPAREN); - this.state = 331; + this.state = 330; this.match(QuintParser.T__23); - this.state = 332; + this.state = 331; this.qualifiedName(); - this.state = 335; + this.state = 334; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 333; + this.state = 332; this.match(QuintParser.T__22); - this.state = 334; + this.state = 333; this.fromSource(); } } @@ -1276,7 +1276,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 339; + this.state = 338; this.qualId(); } } @@ -1301,7 +1301,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 341; + this.state = 340; this.qualId(); } } @@ -1326,7 +1326,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 343; + this.state = 342; this.qualId(); } } @@ -1351,7 +1351,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 345; + this.state = 344; this.match(QuintParser.STRING); } } @@ -1389,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 417; + this.state = 416; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: @@ -1398,51 +1398,51 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 348; + this.state = 347; this.match(QuintParser.LPAREN); - this.state = 357; + this.state = 356; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 349; + this.state = 348; this.type(0); - this.state = 354; + this.state = 353; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 350; + this.state = 349; this.match(QuintParser.T__7); - this.state = 351; + this.state = 350; this.type(0); } } } - this.state = 356; + this.state = 355; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 360; + this.state = 359; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 359; + this.state = 358; this.match(QuintParser.T__7); } } - this.state = 362; + this.state = 361; this.match(QuintParser.RPAREN); - this.state = 363; + this.state = 362; this.match(QuintParser.T__26); - this.state = 364; + this.state = 363; this.type(12); } break; @@ -1452,13 +1452,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 365; + this.state = 364; this.match(QuintParser.SET); - this.state = 366; + this.state = 365; this.match(QuintParser.T__10); - this.state = 367; + this.state = 366; this.type(0); - this.state = 368; + this.state = 367; this.match(QuintParser.T__11); } break; @@ -1468,13 +1468,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 369; this.match(QuintParser.LIST); - this.state = 371; + this.state = 370; this.match(QuintParser.T__10); - this.state = 372; + this.state = 371; this.type(0); - this.state = 373; + this.state = 372; this.match(QuintParser.T__11); } break; @@ -1484,43 +1484,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 375; + this.state = 374; this.match(QuintParser.LPAREN); - this.state = 376; + this.state = 375; this.type(0); - this.state = 377; + this.state = 376; this.match(QuintParser.T__7); - this.state = 378; + this.state = 377; this.type(0); - this.state = 383; + this.state = 382; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 379; + this.state = 378; this.match(QuintParser.T__7); - this.state = 380; + this.state = 379; this.type(0); } } } - this.state = 385; + this.state = 384; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 387; + this.state = 386; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 386; + this.state = 385; this.match(QuintParser.T__7); } } - this.state = 389; + this.state = 388; this.match(QuintParser.RPAREN); } break; @@ -1530,19 +1530,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 391; + this.state = 390; this.match(QuintParser.T__1); - this.state = 393; + this.state = 392; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 392; + this.state = 391; this.row(); } } - this.state = 395; + this.state = 394; this.match(QuintParser.T__2); } break; @@ -1552,7 +1552,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 395; this.match(QuintParser.T__27); } break; @@ -1562,7 +1562,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 396; this.match(QuintParser.T__28); } break; @@ -1572,7 +1572,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 397; this.match(QuintParser.T__29); } break; @@ -1582,7 +1582,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 398; this.typeVar(); } break; @@ -1592,7 +1592,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 399; this.qualId(); } break; @@ -1602,11 +1602,11 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 400; this.match(QuintParser.LPAREN); - this.state = 402; + this.state = 401; this.type(0); - this.state = 403; + this.state = 402; this.match(QuintParser.RPAREN); } break; @@ -1616,39 +1616,39 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 405; + this.state = 404; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 406; + this.state = 405; this.match(QuintParser.T__10); - this.state = 407; + this.state = 406; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 412; + this.state = 411; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 408; + this.state = 407; this.match(QuintParser.T__7); - this.state = 409; + this.state = 408; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 414; + this.state = 413; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 415; + this.state = 414; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 427; + this.state = 426; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1658,20 +1658,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 425; + this.state = 424; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 419; + this.state = 418; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 420; + this.state = 419; this.match(QuintParser.T__25); - this.state = 421; + this.state = 420; this.type(14); } break; @@ -1680,20 +1680,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 422; + this.state = 421; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 423; + this.state = 422; this.match(QuintParser.T__26); - this.state = 424; + this.state = 423; this.type(13); } break; } } } - this.state = 429; + this.state = 428; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1720,7 +1720,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 430; + this.state = 429; this.match(QuintParser.LOW_ID); } } @@ -1744,7 +1744,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 453; + this.state = 452; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1752,50 +1752,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 432; + this.state = 431; this.rowLabel(); - this.state = 433; + this.state = 432; this.match(QuintParser.T__4); - this.state = 434; + this.state = 433; this.type(0); } - this.state = 443; + this.state = 442; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 435; this.match(QuintParser.T__7); - this.state = 437; + this.state = 436; this.rowLabel(); - this.state = 438; + this.state = 437; this.match(QuintParser.T__4); - this.state = 439; + this.state = 438; this.type(0); } } } - this.state = 445; + this.state = 444; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 449; + this.state = 448; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 446; + this.state = 445; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 447; + this.state = 446; this.match(QuintParser.T__12); { - this.state = 448; + this.state = 447; _localctx._rowVar = this.identifier(); } } @@ -1810,10 +1810,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 451; + this.state = 450; this.match(QuintParser.T__12); { - this.state = 452; + this.state = 451; _localctx._rowVar = this.identifier(); } } @@ -1843,7 +1843,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 455; + this.state = 454; this.simpleId("record"); } } @@ -1881,7 +1881,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 607; + this.state = 606; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1890,7 +1890,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 458; + this.state = 457; this.lambda(); } break; @@ -1900,21 +1900,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 459; + this.state = 458; this.normalCallName(); - this.state = 460; + this.state = 459; this.match(QuintParser.LPAREN); - this.state = 462; + this.state = 461; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 461; + this.state = 460; this.argList(); } } - this.state = 464; + this.state = 463; this.match(QuintParser.RPAREN); } break; @@ -1924,9 +1924,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 466; + this.state = 465; this.match(QuintParser.MINUS); - this.state = 467; + this.state = 466; this.expr(25); } break; @@ -1936,13 +1936,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 468; + this.state = 467; this.qualId(); - this.state = 469; + this.state = 468; this.match(QuintParser.T__31); - this.state = 470; + this.state = 469; this.match(QuintParser.ASGN); - this.state = 471; + this.state = 470; this.expr(21); } break; @@ -1952,41 +1952,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 473; + this.state = 472; this.match(QuintParser.AND); - this.state = 474; + this.state = 473; this.match(QuintParser.T__1); - this.state = 475; + this.state = 474; this.expr(0); - this.state = 480; + this.state = 479; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 476; + this.state = 475; this.match(QuintParser.T__7); - this.state = 477; + this.state = 476; this.expr(0); } } } - this.state = 482; + this.state = 481; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 484; + this.state = 483; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 483; + this.state = 482; this.match(QuintParser.T__7); } } - this.state = 486; + this.state = 485; this.match(QuintParser.T__2); } break; @@ -1996,41 +1996,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 488; + this.state = 487; this.match(QuintParser.OR); - this.state = 489; + this.state = 488; this.match(QuintParser.T__1); - this.state = 490; + this.state = 489; this.expr(0); - this.state = 495; + this.state = 494; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 491; + this.state = 490; this.match(QuintParser.T__7); - this.state = 492; + this.state = 491; this.expr(0); } } } - this.state = 497; + this.state = 496; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 499; + this.state = 498; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 498; + this.state = 497; this.match(QuintParser.T__7); } } - this.state = 501; + this.state = 500; this.match(QuintParser.T__2); } break; @@ -2040,7 +2040,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 503; + this.state = 502; this.matchSumExpr(); } break; @@ -2050,41 +2050,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 504; + this.state = 503; this.match(QuintParser.T__32); - this.state = 505; + this.state = 504; this.match(QuintParser.T__1); - this.state = 506; + this.state = 505; this.expr(0); - this.state = 511; + this.state = 510; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 507; + this.state = 506; this.match(QuintParser.T__7); - this.state = 508; + this.state = 507; this.expr(0); } } } - this.state = 513; + this.state = 512; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 515; + this.state = 514; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 514; + this.state = 513; this.match(QuintParser.T__7); } } - this.state = 517; + this.state = 516; this.match(QuintParser.T__2); } break; @@ -2094,41 +2094,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 519; + this.state = 518; this.match(QuintParser.T__33); - this.state = 520; + this.state = 519; this.match(QuintParser.T__1); - this.state = 521; + this.state = 520; this.expr(0); - this.state = 526; + this.state = 525; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 522; + this.state = 521; this.match(QuintParser.T__7); - this.state = 523; + this.state = 522; this.expr(0); } } } - this.state = 528; + this.state = 527; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 530; + this.state = 529; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 529; + this.state = 528; this.match(QuintParser.T__7); } } - this.state = 532; + this.state = 531; this.match(QuintParser.T__2); } break; @@ -2138,31 +2138,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 538; + this.state = 537; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 534; + this.state = 533; this.qualId(); } break; case QuintParser.INT: { - this.state = 535; + this.state = 534; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 536; + this.state = 535; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 537; + this.state = 536; this.match(QuintParser.STRING); } break; @@ -2177,43 +2177,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 540; + this.state = 539; this.match(QuintParser.LPAREN); - this.state = 541; + this.state = 540; this.expr(0); - this.state = 542; + this.state = 541; this.match(QuintParser.T__7); - this.state = 543; + this.state = 542; this.expr(0); - this.state = 548; + this.state = 547; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 544; + this.state = 543; this.match(QuintParser.T__7); - this.state = 545; + this.state = 544; this.expr(0); } } } - this.state = 550; + this.state = 549; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 552; + this.state = 551; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 551; + this.state = 550; this.match(QuintParser.T__7); } } - this.state = 554; + this.state = 553; this.match(QuintParser.RPAREN); } break; @@ -2223,39 +2223,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 555; this.match(QuintParser.T__1); - this.state = 557; + this.state = 556; this.recElem(); - this.state = 562; + this.state = 561; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 558; + this.state = 557; this.match(QuintParser.T__7); - this.state = 559; + this.state = 558; this.recElem(); } } } - this.state = 564; + this.state = 563; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 566; + this.state = 565; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 565; + this.state = 564; this.match(QuintParser.T__7); } } - this.state = 568; + this.state = 567; this.match(QuintParser.T__2); } break; @@ -2265,47 +2265,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 570; + this.state = 569; this.match(QuintParser.T__10); - this.state = 579; + this.state = 578; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 571; + this.state = 570; this.expr(0); - this.state = 576; + this.state = 575; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 572; + this.state = 571; this.match(QuintParser.T__7); - this.state = 573; + this.state = 572; this.expr(0); } } } - this.state = 578; + this.state = 577; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 582; + this.state = 581; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 581; + this.state = 580; this.match(QuintParser.T__7); } } - this.state = 584; + this.state = 583; this.match(QuintParser.T__11); } break; @@ -2315,19 +2315,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 585; + this.state = 584; this.match(QuintParser.T__34); - this.state = 586; + this.state = 585; this.match(QuintParser.LPAREN); - this.state = 587; + this.state = 586; this.expr(0); - this.state = 588; + this.state = 587; this.match(QuintParser.RPAREN); - this.state = 589; + this.state = 588; this.expr(0); - this.state = 590; + this.state = 589; this.match(QuintParser.T__35); - this.state = 591; + this.state = 590; this.expr(5); } break; @@ -2337,9 +2337,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 593; + this.state = 592; this.operDef(); - this.state = 594; + this.state = 593; this.expr(4); } break; @@ -2349,9 +2349,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 595; this.nondetOperDef(); - this.state = 597; + this.state = 596; this.expr(3); } break; @@ -2361,11 +2361,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 599; + this.state = 598; this.match(QuintParser.LPAREN); - this.state = 600; + this.state = 599; this.expr(0); - this.state = 601; + this.state = 600; this.match(QuintParser.RPAREN); } break; @@ -2375,17 +2375,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 603; + this.state = 602; this.match(QuintParser.T__1); - this.state = 604; + this.state = 603; this.expr(0); - this.state = 605; + this.state = 604; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 658; + this.state = 657; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2395,20 +2395,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 656; + this.state = 655; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 609; + this.state = 608; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 610; + this.state = 609; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 611; + this.state = 610; this.expr(26); } break; @@ -2417,11 +2417,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 612; + this.state = 611; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 613; + this.state = 612; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2434,7 +2434,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 614; + this.state = 613; this.expr(25); } break; @@ -2443,11 +2443,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; + this.state = 614; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 616; + this.state = 615; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2460,7 +2460,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; + this.state = 616; this.expr(24); } break; @@ -2469,11 +2469,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; + this.state = 617; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 619; + this.state = 618; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2486,7 +2486,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; + this.state = 619; this.expr(23); } break; @@ -2495,13 +2495,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 620; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 622; + this.state = 621; this.match(QuintParser.ASGN); - this.state = 623; + this.state = 622; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2514,13 +2514,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 626; + this.state = 625; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 627; + this.state = 626; this.match(QuintParser.AND); - this.state = 628; + this.state = 627; this.expr(19); } break; @@ -2529,13 +2529,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; + this.state = 628; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 630; + this.state = 629; this.match(QuintParser.OR); - this.state = 631; + this.state = 630; this.expr(17); } break; @@ -2544,13 +2544,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; + this.state = 631; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 633; + this.state = 632; this.match(QuintParser.IFF); - this.state = 634; + this.state = 633; this.expr(16); } break; @@ -2559,13 +2559,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; + this.state = 634; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 636; + this.state = 635; this.match(QuintParser.IMPLIES); - this.state = 637; + this.state = 636; this.expr(15); } break; @@ -2574,13 +2574,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; + this.state = 637; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 639; + this.state = 638; this.match(QuintParser.T__25); - this.state = 640; + this.state = 639; this.expr(9); } break; @@ -2589,32 +2589,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; + this.state = 640; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 642; + this.state = 641; this.match(QuintParser.T__21); - this.state = 643; + this.state = 642; this.nameAfterDot(); - this.state = 649; + this.state = 648; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 644; + this.state = 643; this.match(QuintParser.LPAREN); - this.state = 646; + this.state = 645; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 645; + this.state = 644; this.argList(); } } - this.state = 648; + this.state = 647; this.match(QuintParser.RPAREN); } break; @@ -2626,22 +2626,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 651; + this.state = 650; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 652; + this.state = 651; this.match(QuintParser.T__10); - this.state = 653; + this.state = 652; this.expr(0); - this.state = 654; + this.state = 653; this.match(QuintParser.T__11); } break; } } } - this.state = 660; + this.state = 659; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2669,43 +2669,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 661; + this.state = 660; this.match(QuintParser.MATCH); - this.state = 662; + this.state = 661; this.expr(0); - this.state = 663; + this.state = 662; this.match(QuintParser.T__1); - this.state = 665; + this.state = 664; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 664; + this.state = 663; this.match(QuintParser.T__12); } } - this.state = 667; + this.state = 666; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 672; + this.state = 671; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 668; + this.state = 667; this.match(QuintParser.T__12); - this.state = 669; + this.state = 668; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 674; + this.state = 673; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 675; + this.state = 674; this.match(QuintParser.T__2); } } @@ -2730,28 +2730,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 679; + this.state = 678; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 677; + this.state = 676; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 678; + this.state = 677; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 681; + this.state = 680; this.match(QuintParser.T__26); - this.state = 682; + this.state = 681; this.expr(0); } } @@ -2778,36 +2778,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 684; + this.state = 683; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 691; + this.state = 690; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 685; + this.state = 684; this.match(QuintParser.LPAREN); - this.state = 688; + this.state = 687; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 686; + this.state = 685; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 687; + this.state = 686; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 690; + this.state = 689; this.match(QuintParser.RPAREN); } } @@ -2833,15 +2833,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 702; + this.state = 701; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 693; + this.state = 692; this.declaration(); - this.state = 694; + this.state = 693; this.match(QuintParser.EOF); } break; @@ -2849,9 +2849,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 696; + this.state = 695; this.expr(0); - this.state = 697; + this.state = 696; this.match(QuintParser.EOF); } break; @@ -2859,9 +2859,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 699; + this.state = 698; this.match(QuintParser.DOCCOMMENT); - this.state = 700; + this.state = 699; this.match(QuintParser.EOF); } break; @@ -2869,7 +2869,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 701; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2894,13 +2894,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 706; + this.state = 705; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 704; + this.state = 703; this.lambdaUnsugared(); } break; @@ -2908,7 +2908,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 705; + this.state = 704; this.lambdaTupleSugar(); } break; @@ -2934,7 +2934,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 725; + this.state = 724; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2942,42 +2942,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 708; + this.state = 707; this.parameter(); - this.state = 709; + this.state = 708; this.match(QuintParser.T__26); - this.state = 710; + this.state = 709; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 712; + this.state = 711; this.match(QuintParser.LPAREN); - this.state = 713; + this.state = 712; this.parameter(); - this.state = 718; + this.state = 717; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 714; + this.state = 713; this.match(QuintParser.T__7); - this.state = 715; + this.state = 714; this.parameter(); } } - this.state = 720; + this.state = 719; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 721; + this.state = 720; this.match(QuintParser.RPAREN); - this.state = 722; + this.state = 721; this.match(QuintParser.T__26); - this.state = 723; + this.state = 722; this.expr(0); } break; @@ -3007,35 +3007,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { + this.state = 726; + this.match(QuintParser.LPAREN); this.state = 727; this.match(QuintParser.LPAREN); this.state = 728; - this.match(QuintParser.LPAREN); - this.state = 729; this.parameter(); - this.state = 732; + this.state = 731; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 730; + this.state = 729; this.match(QuintParser.T__7); - this.state = 731; + this.state = 730; this.parameter(); } } - this.state = 734; + this.state = 733; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); + this.state = 735; + this.match(QuintParser.RPAREN); this.state = 736; this.match(QuintParser.RPAREN); this.state = 737; - this.match(QuintParser.RPAREN); - this.state = 738; this.match(QuintParser.T__26); - this.state = 739; + this.state = 738; this.expr(0); } } @@ -3058,13 +3058,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 743; + this.state = 742; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 741; + this.state = 740; this.match(QuintParser.T__36); } break; @@ -3072,7 +3072,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 742; + this.state = 741; this.qualId(); } break; @@ -3101,7 +3101,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 745; + this.state = 744; _localctx._paramName = this.identOrHole(); } } @@ -3126,11 +3126,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 747; + this.state = 746; _localctx._paramName = this.identOrHole(); - this.state = 748; + this.state = 747; this.match(QuintParser.T__4); - this.state = 749; + this.state = 748; this.type(0); } } @@ -3153,13 +3153,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 753; + this.state = 752; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 751; + this.state = 750; this.match(QuintParser.MUL); } break; @@ -3167,7 +3167,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 752; + this.state = 751; this.qualId(); } break; @@ -3197,21 +3197,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 755; + this.state = 754; this.expr(0); - this.state = 760; + this.state = 759; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 756; + this.state = 755; this.match(QuintParser.T__7); - this.state = 757; + this.state = 756; this.expr(0); } } - this.state = 762; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3236,27 +3236,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 769; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 763; + this.state = 762; this.simpleId("record"); - this.state = 764; + this.state = 763; this.match(QuintParser.T__4); - this.state = 765; + this.state = 764; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 767; + this.state = 766; this.match(QuintParser.T__37); - this.state = 768; + this.state = 767; this.expr(0); } break; @@ -3284,14 +3284,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 773; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 771; + this.state = 770; this.qualId(); } break; @@ -3304,7 +3304,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 772; + this.state = 771; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3343,14 +3343,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 777; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 775; + this.state = 774; this.qualId(); } break; @@ -3360,7 +3360,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 776; + this.state = 775; _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))) { @@ -3401,7 +3401,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 779; + this.state = 778; _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); @@ -3437,7 +3437,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 781; + this.state = 780; _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); @@ -3473,23 +3473,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 783; + this.state = 782; this.identifier(); - this.state = 788; + this.state = 787; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 784; + this.state = 783; this.match(QuintParser.T__38); - this.state = 785; + this.state = 784; this.identifier(); } } } - this.state = 790; + this.state = 789; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3514,13 +3514,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 795; + this.state = 794; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 791; + this.state = 790; this.identifier(); } break; @@ -3528,7 +3528,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 792; + this.state = 791; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3564,7 +3564,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 797; + this.state = 796; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3656,7 +3656,7 @@ 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\x03H\u0322\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\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" + @@ -3678,92 +3678,92 @@ export class QuintParser extends Parser { "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + - "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x03\b\x05\b\xDB\n\b\x03\t\x05\t\xDE" + - "\n\t\x03\t\x03\t\x03\t\x07\t\xE3\n\t\f\t\x0E\t\xE6\v\t\x03\n\x03\n\x03" + - "\n\x03\n\x03\n\x05\n\xED\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + - "\v\x03\v\x03\v\x05\v\xF8\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f" + - "\x03\f\x03\f\x05\f\u0103\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + - "\u010B\n\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0111\n\r\x03\r\x03\r\x05\r\u0115" + - "\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0E\x05\x0E\u0122\n\x0E\x05\x0E\u0124\n\x0E\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x07\x0F\u0131\n\x0F\f\x0F\x0E\x0F\u0134\v\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x05\x0F\u013B\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0148" + - "\n\x0F\f\x0F\x0E\x0F\u014B\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x05\x0F\u0152\n\x0F\x05\x0F\u0154\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11" + - "\x03\x12\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u0163\n\x14\f\x14\x0E\x14\u0166\v\x14\x05\x14\u0168\n\x14\x03" + - "\x14\x05\x14\u016B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x05\b\xDA\n\b\x03\t\x05\t\xDD\n\t\x03" + + "\t\x03\t\x03\t\x07\t\xE2\n\t\f\t\x0E\t\xE5\v\t\x03\n\x03\n\x03\n\x03\n" + + "\x03\n\x05\n\xEC\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF2\n\v\x03\v\x03\v" + + "\x03\v\x05\v\xF7\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + + "\f\x05\f\u0102\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010A\n\r" + + "\x03\r\x03\r\x03\r\x03\r\x05\r\u0110\n\r\x03\r\x03\r\x05\r\u0114\n\r\x05" + + "\r\u0116\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x05\x0E\u0121\n\x0E\x05\x0E\u0123\n\x0E\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07" + + "\x0F\u0130\n\x0F\f\x0F\x0E\x0F\u0133\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x05\x0F\u013A\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0147\n\x0F\f" + + "\x0F\x0E\x0F\u014A\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + + "\u0151\n\x0F\x05\x0F\u0153\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12" + + "\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + + "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + + "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + - "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + - "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + - "\u019D\n\x14\f\x14\x0E\x14\u01A0\v\x14\x03\x14\x03\x14\x05\x14\u01A4\n" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14" + - "\f\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16" + - "\x0E\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16" + - "\x03\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x14\x03\x14\x03\x14\x07\x14\u017F\n\x14\f\x14\x0E\x14\u0182\v\x14" + + "\x03\x14\x05\x14\u0185\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018B" + + "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u019C" + + "\n\x14\f\x14\x0E\x14\u019F\v\x14\x03\x14\x03\x14\x05\x14\u01A3\n\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AB\n\x14\f\x14" + + "\x0E\x14\u01AE\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BB\n\x16\f\x16\x0E\x16" + + "\u01BE\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03\x16\x03\x16" + + "\x05\x16\u01C7\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x05\x18\u01D0\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u01E0\n\x18\f\x18\x0E\x18\u01E3\v\x18\x03\x18\x05\x18\u01E6\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EF\n\x18" + + "\f\x18\x0E\x18\u01F2\v\x18\x03\x18\x05\x18\u01F5\n\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01FF\n\x18\f" + + "\x18\x0E\x18\u0202\v\x18\x03\x18\x05\x18\u0205\n\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020E\n\x18\f\x18\x0E\x18" + + "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + + "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u0232\n\x18\f\x18\x0E\x18\u0235\v\x18\x03\x18\x05\x18\u0238\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0240\n\x18\f\x18" + + "\x0E\x18\u0243\v\x18\x05\x18\u0245\n\x18\x03\x18\x05\x18\u0248\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0261\n\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x07\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + - "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + - "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020F\n\x18\f\x18\x0E" + - "\x18\u0212\v\x18\x03\x18\x05\x18\u0215\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x05\x18\u021D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0225\n\x18\f\x18\x0E\x18\u0228\v\x18\x03\x18" + - "\x05\x18\u022B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u0233\n\x18\f\x18\x0E\x18\u0236\v\x18\x03\x18\x05\x18\u0239\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0241\n\x18\f" + - "\x18\x0E\x18\u0244\v\x18\x05\x18\u0246\n\x18\x03\x18\x05\x18\u0249\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0262\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05" + - "\x18\u0289\n\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0293\n\x18\f\x18\x0E\x18\u0296\v\x18\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x05\x19\u029C\n\x19\x03\x19\x03\x19\x03\x19\x07\x19" + - "\u02A1\n\x19\f\x19\x0E\x19\u02A4\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A" + - "\x05\x1A\u02AA\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x05\x1B\u02B3\n\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C1\n\x1C" + - "\x03\x1D\x03\x1D\x05\x1D\u02C5\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02CF\n\x1E\f\x1E\x0E\x1E\u02D2\v" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D8\n\x1E\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02DF\n\x1F\r\x1F\x0E\x1F\u02E0\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EA\n \x03!\x03!\x03" + - "\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F4\n#\x03$\x03$\x03$\x07$\u02F9" + - "\n$\f$\x0E$\u02FC\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0304\n%\x03&" + - "\x03&\x05&\u0308\n&\x03\'\x03\'\x05\'\u030C\n\'\x03(\x03(\x03)\x03)\x03" + - "*\x03*\x03*\x07*\u0315\n*\f*\x0E*\u0318\v*\x03+\x03+\x03+\x03+\x05+\u031E" + - "\n+\x03,\x03,\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\x02" + - "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02" + - "T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05" + - "\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02Y\x03\x02\x02\x02\x04b\x03" + - "\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02" + - "\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDD\x03\x02" + - "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + - "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + - "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + - "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u01A3\x03\x02\x02\x02(\u01B0" + - "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + - "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + - "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + - "\x03\x02\x02\x02<\u02D9\x03\x02\x02\x02>\u02E9\x03\x02\x02\x02@\u02EB" + - "\x03\x02\x02\x02B\u02ED\x03\x02\x02\x02D\u02F3\x03\x02\x02\x02F\u02F5" + - "\x03\x02\x02\x02H\u0303\x03\x02\x02\x02J\u0307\x03\x02\x02\x02L\u030B" + - "\x03\x02\x02\x02N\u030D\x03\x02\x02\x02P\u030F\x03\x02\x02\x02R\u0311" + - "\x03\x02\x02\x02T\u031D\x03\x02\x02\x02V\u031F\x03\x02\x02\x02XZ\x05\x04" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0288\n\x18\x03\x18\x05\x18\u028B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x07\x18\u0292\n\x18\f\x18\x0E\x18\u0295\v\x18\x03\x19\x03\x19" + + "\x03\x19\x03\x19\x05\x19\u029B\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A0" + + "\n\x19\f\x19\x0E\x19\u02A3\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A" + + "\u02A9\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" + + "\x1B\u02B2\n\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C0\n\x1C\x03\x1D" + + "\x03\x1D\x05\x1D\u02C4\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x07\x1E\u02CE\n\x1E\f\x1E\x0E\x1E\u02D1\v\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D7\n\x1E\x03\x1F\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x06\x1F\u02DE\n\x1F\r\x1F\x0E\x1F\u02DF\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02E9\n \x03!\x03!\x03\"\x03\"" + + "\x03\"\x03\"\x03#\x03#\x05#\u02F3\n#\x03$\x03$\x03$\x07$\u02F8\n$\f$\x0E" + + "$\u02FB\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0303\n%\x03&\x03&\x05&" + + "\u0307\n&\x03\'\x03\'\x05\'\u030B\n\'\x03(\x03(\x03)\x03)\x03*\x03*\x03" + + "*\x07*\u0314\n*\f*\x0E*\u0317\v*\x03+\x03+\x03+\x03+\x05+\u031D\n+\x03" + + ",\x03,\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@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + + "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + + "03=\x03\x02*,\x03\x02CD\x02\u0382\x02Y\x03\x02\x02\x02\x04b\x03\x02\x02" + + "\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02\x02\x02" + + "\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03\x02\x02\x02" + + "\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101\x03\x02\x02" + + "\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C\u0152\x03" + + "\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02\"\u0158" + + "\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02(\u01AF" + + "\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02.\u0260" + + "\x03\x02\x02\x020\u0296\x03\x02\x02\x022\u02A8\x03\x02\x02\x024\u02AD" + + "\x03\x02\x02\x026\u02BF\x03\x02\x02\x028\u02C3\x03\x02\x02\x02:\u02D6" + + "\x03\x02\x02\x02<\u02D8\x03\x02\x02\x02>\u02E8\x03\x02\x02\x02@\u02EA" + + "\x03\x02\x02\x02B\u02EC\x03\x02\x02\x02D\u02F2\x03\x02\x02\x02F\u02F4" + + "\x03\x02\x02\x02H\u0302\x03\x02\x02\x02J\u0306\x03\x02\x02\x02L\u030A" + + "\x03\x02\x02\x02N\u030C\x03\x02\x02\x02P\u030E\x03\x02\x02\x02R\u0310" + + "\x03\x02\x02\x02T\u031C\x03\x02\x02\x02V\u031E\x03\x02\x02\x02XZ\x05\x04" + "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + @@ -3805,279 +3805,279 @@ export class QuintParser extends Parser { "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + - "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xDA" + - "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x05(\x15\x02\xD1\xD2\x07\n\x02" + - "\x02\xD2\xD4\x05(\x15\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + + "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9" + + "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02" + + "\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + - "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xD9\x07\x0E\x02\x02\xD9\xDB\x03\x02\x02" + - "\x02\xDA\xCF\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\x0F\x03\x02\x02" + - "\x02\xDC\xDE\x07\x0F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + - "\x02\xDE\xDF\x03\x02\x02\x02\xDF\xE4\x05\x12\n\x02\xE0\xE1\x07\x0F\x02" + - "\x02\xE1\xE3\x05\x12\n\x02\xE2\xE0\x03\x02\x02\x02\xE3\xE6\x03\x02\x02" + - "\x02\xE4\xE2\x03\x02\x02\x02\xE4\xE5\x03\x02\x02\x02\xE5\x11\x03\x02\x02" + - "\x02\xE6\xE4\x03\x02\x02\x02\xE7\xEC\x05T+\x02\xE8\xE9\x07?\x02\x02\xE9" + - "\xEA\x05&\x14\x02\xEA\xEB\x07@\x02\x02\xEB\xED\x03\x02\x02\x02\xEC\xE8" + - "\x03\x02\x02\x02\xEC\xED\x03\x02\x02\x02\xED\x13\x03\x02\x02\x02\xEE\xEF" + - "\x07\x10\x02\x02\xEF\xF2\x05R*\x02\xF0\xF1\x07\x07\x02\x02\xF1\xF3\x05" + - "&\x14\x02\xF2\xF0\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x03" + - "\x02\x02\x02\xF4\xF5\x07>\x02\x02\xF5\xF7\x05.\x18\x02\xF6\xF8\x07\v\x02" + - "\x02\xF7\xF6\x03\x02\x02\x02\xF7\xF8\x03\x02\x02\x02\xF8\x15\x03\x02\x02" + - "\x02\xF9\u0103\x07\x11\x02\x02\xFA\u0103\x07\x12\x02\x02\xFB\xFC\x07\x13" + - "\x02\x02\xFC\u0103\x07\x11\x02\x02\xFD\xFE\x07\x13\x02\x02\xFE\u0103\x07" + - "\x12\x02\x02\xFF\u0103\x07\x14\x02\x02\u0100\u0103\x07\x15\x02\x02\u0101" + - "\u0103\x07\x16\x02\x02\u0102\xF9\x03\x02\x02\x02\u0102\xFA\x03\x02\x02" + - "\x02\u0102\xFB\x03\x02\x02\x02\u0102\xFD\x03\x02\x02\x02\u0102\xFF\x03" + - "\x02\x02\x02\u0102\u0100\x03\x02\x02\x02\u0102\u0101\x03\x02\x02\x02\u0103" + - "\x17\x03\x02\x02\x02\u0104\u0105\x07\x17\x02\x02\u0105\u0106\x05 \x11" + - "\x02\u0106\u0107\x07\x18\x02\x02\u0107\u010A\x05D#\x02\u0108\u0109\x07" + - "\x19\x02\x02\u0109\u010B\x05$\x13\x02\u010A\u0108\x03\x02\x02\x02\u010A" + - "\u010B\x03\x02\x02\x02\u010B\u0117\x03\x02\x02\x02\u010C\u010D\x07\x17" + - "\x02\x02\u010D\u0110\x05 \x11\x02\u010E\u010F\x07\x1A\x02\x02\u010F\u0111" + - "\x05 \x11\x02\u0110\u010E\x03\x02\x02\x02\u0110\u0111\x03\x02\x02\x02" + - "\u0111\u0114\x03\x02\x02\x02\u0112\u0113\x07\x19\x02\x02\u0113\u0115\x05" + - "$\x13\x02\u0114\u0112\x03\x02\x02\x02\u0114\u0115\x03\x02\x02\x02\u0115" + - "\u0117\x03\x02\x02\x02\u0116\u0104\x03\x02\x02\x02\u0116\u010C\x03\x02" + - "\x02\x02\u0117\x19\x03\x02\x02\x02\u0118\u0119\x07\x1B\x02\x02\u0119\u011A" + - "\x05 \x11\x02\u011A\u011B\x07\x18\x02\x02\u011B\u011C\x05D#\x02\u011C" + - "\u0124\x03\x02\x02\x02\u011D\u011E\x07\x1B\x02\x02\u011E\u0121\x05 \x11" + - "\x02\u011F\u0120\x07\x1A\x02\x02\u0120\u0122\x05 \x11\x02\u0121\u011F" + - "\x03\x02\x02\x02\u0121\u0122\x03\x02\x02\x02\u0122\u0124\x03\x02\x02\x02" + - "\u0123\u0118\x03\x02\x02\x02\u0123\u011D\x03\x02\x02\x02\u0124\x1B\x03" + - "\x02\x02\x02\u0125\u0126\x07\x17\x02\x02\u0126\u0127\x05\x1E\x10\x02\u0127" + - "\u0128\x07?\x02\x02\u0128\u0129\x05 \x11\x02\u0129\u012A\x07>\x02\x02" + - "\u012A\u0132\x05.\x18\x02\u012B\u012C\x07\n\x02\x02\u012C\u012D\x05 \x11" + - "\x02\u012D\u012E\x07>\x02\x02\u012E\u012F\x05.\x18\x02\u012F\u0131\x03" + - "\x02\x02\x02\u0130\u012B\x03\x02\x02\x02\u0131\u0134\x03\x02\x02\x02\u0132" + - "\u0130\x03\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133\u0135\x03\x02" + - "\x02\x02\u0134\u0132\x03\x02\x02\x02\u0135\u0136\x07@\x02\x02\u0136\u0137" + - "\x07\x18\x02\x02\u0137\u013A\x075\x02\x02\u0138\u0139\x07\x19\x02\x02" + - "\u0139\u013B\x05$\x13\x02\u013A\u0138\x03\x02\x02\x02\u013A\u013B\x03" + - "\x02\x02\x02\u013B\u0154\x03\x02\x02\x02\u013C\u013D\x07\x17\x02\x02\u013D" + - "\u013E\x05\x1E\x10\x02\u013E\u013F\x07?\x02\x02\u013F\u0140\x05 \x11\x02" + - "\u0140\u0141\x07>\x02\x02\u0141\u0149\x05.\x18\x02\u0142\u0143\x07\n\x02" + - "\x02\u0143\u0144\x05 \x11\x02\u0144\u0145\x07>\x02\x02\u0145\u0146\x05" + - ".\x18\x02\u0146\u0148\x03\x02\x02\x02\u0147\u0142\x03\x02\x02\x02\u0148" + - "\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u0149\u014A\x03\x02" + - "\x02\x02\u014A\u014C\x03\x02\x02\x02\u014B\u0149\x03\x02\x02\x02\u014C" + - "\u014D\x07@\x02\x02\u014D\u014E\x07\x1A\x02\x02\u014E\u0151\x05\"\x12" + - "\x02\u014F\u0150\x07\x19\x02\x02\u0150\u0152\x05$\x13\x02\u0151\u014F" + - "\x03\x02\x02\x02\u0151\u0152\x03\x02\x02\x02\u0152\u0154\x03\x02\x02\x02" + - "\u0153\u0125\x03\x02\x02\x02\u0153\u013C\x03\x02\x02\x02\u0154\x1D\x03" + - "\x02\x02\x02\u0155\u0156\x05R*\x02\u0156\x1F\x03\x02\x02\x02\u0157\u0158" + - "\x05R*\x02\u0158!\x03\x02\x02\x02\u0159\u015A\x05R*\x02\u015A#\x03\x02" + - "\x02\x02\u015B\u015C\x07*\x02\x02\u015C%\x03\x02\x02\x02\u015D\u015E\b" + - "\x14\x01\x02\u015E\u0167\x07?\x02\x02\u015F\u0164\x05&\x14\x02\u0160\u0161" + - "\x07\n\x02\x02\u0161\u0163\x05&\x14\x02\u0162\u0160\x03\x02\x02\x02\u0163" + - "\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02\u0164\u0165\x03\x02" + - "\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03\x02\x02\x02\u0167" + - "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + - "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + - "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + - "\u016D\u016E\x07\x1D\x02\x02\u016E\u01A4\x05&\x14\x0E\u016F\u0170\x07" + - "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + - "\x07\x0E\x02\x02\u0173\u01A4\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + - "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + - "\x02\x02\u0178\u01A4\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + - "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + - "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + - "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + - "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + - "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + - "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + - "\u01A4\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + - "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + - "\x03\x02\x02\x02\u018D\u01A4\x07\x05\x02\x02\u018E\u01A4\x07\x1E\x02\x02" + - "\u018F\u01A4\x07\x1F\x02\x02\u0190\u01A4\x07 \x02\x02\u0191\u01A4\x05" + - "(\x15\x02\u0192\u01A4\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + - "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u01A4\x03\x02\x02\x02\u0197\u0198" + - "\x05R*\x02\u0198\u0199\x07\r\x02\x02\u0199\u019E\x05&\x14\x02\u019A\u019B" + - "\x07\n\x02\x02\u019B\u019D\x05&\x14\x02\u019C\u019A\x03\x02\x02\x02\u019D" + - "\u01A0\x03\x02\x02\x02\u019E\u019C\x03\x02\x02\x02\u019E\u019F\x03\x02" + - "\x02\x02\u019F\u01A1\x03\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A1" + - "\u01A2\x07\x0E\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u015D\x03\x02" + - "\x02\x02\u01A3\u016F\x03\x02\x02\x02\u01A3\u0174\x03\x02\x02\x02\u01A3" + - "\u0179\x03\x02\x02\x02\u01A3\u0189\x03\x02\x02\x02\u01A3\u018E\x03\x02" + - "\x02\x02\u01A3\u018F\x03\x02\x02\x02\u01A3\u0190\x03\x02\x02\x02\u01A3" + - "\u0191\x03\x02\x02\x02\u01A3\u0192\x03\x02\x02\x02\u01A3\u0193\x03\x02" + - "\x02\x02\u01A3\u0197\x03\x02\x02\x02\u01A4\u01AD\x03\x02\x02\x02\u01A5" + - "\u01A6\f\x10\x02\x02\u01A6\u01A7\x07\x1C\x02\x02\u01A7\u01AC\x05&\x14" + - "\x10\u01A8\u01A9\f\x0F\x02\x02\u01A9\u01AA\x07\x1D\x02\x02\u01AA\u01AC" + - "\x05&\x14\x0F\u01AB\u01A5\x03\x02\x02\x02\u01AB\u01A8\x03\x02\x02\x02" + - "\u01AC\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03" + - "\x02\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0" + - "\u01B1\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3" + - "\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02" + - "\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07" + - "\x07\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB" + - "\u01B6\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02" + - "\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF" + - "\u01BD\x03\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02" + - "\x02\u01C2\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03" + - "\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5" + - "\u01C6\x07\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02" + - "\u01C7\u01C5\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+" + - "\x02\u01CA-\x03\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x05" + - "8\x1D\x02\u01CD\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05" + - "F$\x02\u01D0\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2" + - "\x03\x02\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02" + - "\u01D4\u01D5\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02" + - "\u01D7\u01D8\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18" + - "\x17\u01DA\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD" + - "\x07\x04\x02\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF" + - "\u01E1\x05.\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02" + - "\x02\u01E2\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6" + - "\x03\x02\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02" + - "\u01E6\u01E5\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03" + - "\x02\x02\x02\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA" + - "\u01EB\x07.\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02" + - "\u01ED\u01EE\x07\n\x02\x02\u01EE\u01F0"; + "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02" + + "\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02" + + "\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + + "\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02" + + "\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02" + + "\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02" + + "\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07" + + "@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03" + + "\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05" + + "R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02" + + "\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02" + + "\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02" + + "\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02" + + "\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11" + + "\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07" + + "\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101" + + "\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02" + + "\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02" + + "\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104" + + "\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02" + + "\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13" + + "\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116" + + "\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02" + + "\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010D\x03" + + "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111" + + "\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02" + + "\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103" + + "\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02" + + "\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119\u011A\x07" + + "\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D" + + "\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02" + + "\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120\u0121\x03" + + "\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122" + + "\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02" + + "\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02\u0127\u0128" + + "\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18\x02\u012A" + + "\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02" + + "\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A\x03" + + "\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131" + + "\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02" + + "\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139" + + "\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139" + + "\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02" + + "\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + + "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + + "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + + "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + + "\x02\x02\x02\u0146\u0141\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148" + + "\u0146\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02" + + "\x02\x02\u014A\u0148\x03\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D" + + "\x07\x1A\x02\x02\u014D\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02" + + "\u014F\u0151\x05$\x13\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03" + + "\x02\x02\x02\u0151\u0153\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152" + + "\u013B\x03\x02\x02\x02\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02" + + "\u0155\x1F\x03\x02\x02\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02" + + "\u0158\u0159\x05R*\x02\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02" + + "\u015B%\x03\x02\x02\x02\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02" + + "\x02\u015E\u0163\x05&\x14\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05" + + "&\x14\x02\u0161\u015F\x03\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163" + + "\u0161\x03\x02\x02\x02\u0163\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02" + + "\x02\x02\u0165\u0163\x03\x02\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166" + + "\u0167\x03\x02\x02\x02\u0167\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02" + + "\x02\u0169\u0168\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B" + + "\x03\x02\x02\x02\u016B\u016C\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02" + + "\u016D\u01A3\x05&\x14\x0E\u016E\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02" + + "\x02\u0170\u0171\x05&\x14\x02\u0171\u0172\x07\x0E\x02\x02\u0172\u01A3" + + "\x03\x02\x02\x02\u0173\u0174\x07B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175" + + "\u0176\x05&\x14\x02\u0176\u0177\x07\x0E\x02\x02\u0177\u01A3\x03\x02\x02" + + "\x02\u0178\u0179\x07?\x02\x02\u0179\u017A\x05&\x14\x02\u017A\u017B\x07" + + "\n\x02\x02\u017B\u0180\x05&\x14\x02\u017C\u017D\x07\n\x02\x02\u017D\u017F" + + "\x05&\x14\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0182\x03\x02\x02\x02" + + "\u0180\u017E\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03" + + "\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0185\x07\n\x02\x02\u0184" + + "\u0183\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02" + + "\x02\x02\u0186\u0187\x07@\x02\x02\u0187\u01A3\x03\x02\x02\x02\u0188\u018A" + + "\x07\x04\x02\x02\u0189\u018B\x05*\x16\x02\u018A\u0189\x03\x02\x02\x02" + + "\u018A\u018B\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u01A3\x07" + + "\x05\x02\x02\u018D\u01A3\x07\x1E\x02\x02\u018E\u01A3\x07\x1F\x02\x02\u018F" + + "\u01A3\x07 \x02\x02\u0190\u01A3\x05(\x15\x02\u0191\u01A3\x05R*\x02\u0192" + + "\u0193\x07?\x02\x02\u0193\u0194\x05&\x14\x02\u0194\u0195\x07@\x02\x02" + + "\u0195\u01A3\x03\x02\x02\x02\u0196\u0197\x05R*\x02\u0197\u0198\x07\r\x02" + + "\x02\u0198\u019D\x05&\x14\x02\u0199\u019A\x07\n\x02\x02\u019A\u019C\x05" + + "&\x14\x02\u019B\u0199\x03\x02\x02\x02\u019C\u019F\x03\x02\x02\x02\u019D" + + "\u019B\x03\x02\x02\x02\u019D\u019E\x03\x02\x02\x02\u019E\u01A0\x03\x02" + + "\x02\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A1\x07\x0E\x02\x02\u01A1" + + "\u01A3\x03\x02\x02\x02\u01A2\u015C\x03\x02\x02\x02\u01A2\u016E\x03\x02" + + "\x02\x02\u01A2\u0173\x03\x02\x02\x02\u01A2\u0178\x03\x02\x02\x02\u01A2" + + "\u0188\x03\x02\x02\x02\u01A2\u018D\x03\x02\x02\x02\u01A2\u018E\x03\x02" + + "\x02\x02\u01A2\u018F\x03\x02\x02\x02\u01A2\u0190\x03\x02\x02\x02\u01A2" + + "\u0191\x03\x02\x02\x02\u01A2\u0192\x03\x02\x02\x02\u01A2\u0196\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A5\f\x10\x02\x02\u01A5\u01A6" + + "\x07\x1C\x02\x02\u01A6\u01AB\x05&\x14\x10\u01A7\u01A8\f\x0F\x02\x02\u01A8" + + "\u01A9\x07\x1D\x02\x02\u01A9\u01AB\x05&\x14\x0F\u01AA\u01A4\x03\x02\x02" + + "\x02\u01AA\u01A7\x03\x02\x02\x02\u01AB\u01AE\x03\x02\x02\x02\u01AC\u01AA" + + "\x03\x02\x02\x02\u01AC\u01AD\x03\x02\x02\x02\u01AD\'\x03\x02\x02\x02\u01AE" + + "\u01AC\x03\x02\x02\x02\u01AF\u01B0\x07C\x02\x02\u01B0)\x03\x02\x02\x02" + + "\u01B1\u01B2\x05,\x17\x02\u01B2\u01B3\x07\x07\x02\x02\u01B3\u01B4\x05" + + "&\x14\x02\u01B4\u01BC\x03\x02\x02\x02\u01B5\u01B6\x07\n\x02\x02\u01B6" + + "\u01B7\x05,\x17\x02\u01B7\u01B8\x07\x07\x02\x02\u01B8\u01B9\x05&\x14\x02" + + "\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01B5\x03\x02\x02\x02\u01BB\u01BE\x03" + + "\x02\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BC\u01BD\x03\x02\x02\x02\u01BD" + + "\u01C2\x03\x02\x02\x02\u01BE\u01BC\x03\x02\x02\x02\u01BF\u01C3\x07\n\x02" + + "\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05V,\x02\u01C2\u01BF\x03" + + "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3" + + "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + + "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + + "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + + "\x01\x02\u01CB\u0261\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + + "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + + "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + + "\u01D2\u0261\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0261\x05" + + ".\x18\x1B\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + + "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x17\u01D9\u0261\x03\x02\x02\x02\u01DA" + + "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + + "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + + "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + + "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + + "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + + "\u01E8\u0261\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + + "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + + "\u01EF\x05.\x18\x02\u01EE\u01EC\x03\x02"; private static readonly _serializedATNSegment1: string = - "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + - "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + - "\x02\x02\x02\u01F3\u01F1\x03\x02\x02\x02\u01F4\u01F6\x07\n\x02\x02\u01F5" + - "\u01F4\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + - "\x02\x02\u01F7\u01F8\x07\x05\x02\x02\u01F8\u0262\x03\x02\x02\x02\u01F9" + - "\u0262\x050\x19\x02\u01FA\u01FB\x07#\x02\x02\u01FB\u01FC\x07\x04\x02\x02" + - "\u01FC\u0201\x05.\x18\x02\u01FD\u01FE\x07\n\x02\x02\u01FE\u0200\x05.\x18" + - "\x02\u01FF\u01FD\x03\x02\x02\x02\u0200\u0203\x03\x02\x02\x02\u0201\u01FF" + - "\x03\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0205\x03\x02\x02\x02" + - "\u0203\u0201\x03\x02\x02\x02\u0204\u0206\x07\n\x02\x02\u0205\u0204\x03" + - "\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207" + - "\u0208\x07\x05\x02\x02\u0208\u0262\x03\x02\x02\x02\u0209\u020A\x07$\x02" + - "\x02\u020A\u020B\x07\x04\x02\x02\u020B\u0210\x05.\x18\x02\u020C\u020D" + - "\x07\n\x02\x02\u020D\u020F\x05.\x18\x02\u020E\u020C\x03\x02\x02\x02\u020F" + - "\u0212\x03\x02\x02\x02\u0210\u020E\x03\x02\x02\x02\u0210\u0211\x03\x02" + - "\x02\x02\u0211\u0214\x03\x02\x02\x02\u0212\u0210\x03\x02\x02\x02\u0213" + - "\u0215\x07\n\x02\x02\u0214\u0213\x03\x02\x02\x02\u0214\u0215\x03\x02\x02" + - "\x02\u0215\u0216\x03\x02\x02\x02\u0216\u0217\x07\x05\x02\x02\u0217\u0262" + - "\x03\x02\x02\x02\u0218\u021D\x05R*\x02\u0219\u021D\x07,\x02\x02\u021A" + - "\u021D\x07+\x02\x02\u021B\u021D\x07*\x02\x02\u021C\u0218\x03\x02\x02\x02" + - "\u021C\u0219\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021C\u021B\x03" + - "\x02\x02\x02\u021D\u0262\x03\x02\x02\x02\u021E\u021F\x07?\x02\x02\u021F" + - "\u0220\x05.\x18\x02\u0220\u0221\x07\n\x02\x02\u0221\u0226\x05.\x18\x02" + - "\u0222\u0223\x07\n\x02\x02\u0223\u0225\x05.\x18\x02\u0224\u0222\x03\x02" + - "\x02\x02\u0225\u0228\x03\x02\x02\x02\u0226\u0224\x03\x02\x02\x02\u0226" + - "\u0227\x03\x02\x02\x02\u0227\u022A\x03\x02\x02\x02\u0228\u0226\x03\x02" + - "\x02\x02\u0229\u022B\x07\n\x02\x02\u022A\u0229\x03\x02\x02\x02\u022A\u022B" + - "\x03\x02\x02\x02\u022B\u022C\x03\x02\x02\x02\u022C\u022D\x07@\x02\x02" + - "\u022D\u0262\x03\x02\x02\x02\u022E\u022F\x07\x04\x02\x02\u022F\u0234\x05" + - "H%\x02\u0230\u0231\x07\n\x02\x02\u0231\u0233\x05H%\x02\u0232\u0230\x03" + - "\x02\x02\x02\u0233\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234" + - "\u0235\x03\x02\x02\x02\u0235\u0238\x03\x02\x02\x02\u0236\u0234\x03\x02" + - "\x02\x02\u0237\u0239\x07\n\x02\x02\u0238\u0237\x03\x02\x02\x02\u0238\u0239" + - "\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x07\x05\x02\x02" + - "\u023B\u0262\x03\x02\x02\x02\u023C\u0245\x07\r\x02\x02\u023D\u0242\x05" + - ".\x18\x02\u023E\u023F\x07\n\x02\x02\u023F\u0241\x05.\x18\x02\u0240\u023E" + - "\x03\x02\x02\x02\u0241\u0244\x03\x02\x02\x02\u0242\u0240\x03\x02\x02\x02" + - "\u0242\u0243\x03\x02\x02\x02\u0243\u0246\x03\x02\x02\x02\u0244\u0242\x03" + - "\x02\x02\x02\u0245\u023D\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246" + - "\u0248\x03\x02\x02\x02\u0247\u0249\x07\n\x02\x02\u0248\u0247\x03\x02\x02" + - "\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u0262" + - "\x07\x0E\x02\x02\u024B\u024C\x07%\x02\x02\u024C\u024D\x07?\x02\x02\u024D" + - "\u024E\x05.\x18\x02\u024E\u024F\x07@\x02\x02\u024F\u0250\x05.\x18\x02" + - "\u0250\u0251\x07&\x02\x02\u0251\u0252\x05.\x18\x07\u0252\u0262\x03\x02" + - "\x02\x02\u0253\u0254\x05\n\x06\x02\u0254\u0255\x05.\x18\x06\u0255\u0262" + - "\x03\x02\x02\x02\u0256\u0257\x05\x14\v\x02\u0257\u0258\x05.\x18\x05\u0258" + - "\u0262\x03\x02\x02\x02\u0259\u025A\x07?\x02\x02\u025A\u025B\x05.\x18\x02" + - "\u025B\u025C\x07@\x02\x02\u025C\u0262\x03\x02\x02\x02\u025D\u025E\x07" + - "\x04\x02\x02\u025E\u025F\x05.\x18\x02\u025F\u0260\x07\x05\x02\x02\u0260" + - "\u0262\x03\x02\x02\x02\u0261\u01CB\x03\x02\x02\x02\u0261\u01CD\x03\x02" + - "\x02\x02\u0261\u01D4\x03\x02\x02\x02\u0261\u01D6\x03\x02\x02\x02\u0261" + - "\u01DB\x03\x02\x02\x02\u0261\u01EA\x03\x02\x02\x02\u0261\u01F9\x03\x02" + - "\x02\x02\u0261\u01FA\x03\x02\x02\x02\u0261\u0209\x03\x02\x02\x02\u0261" + - "\u021C\x03\x02\x02\x02\u0261\u021E\x03\x02\x02\x02\u0261\u022E\x03\x02" + - "\x02\x02\u0261\u023C\x03\x02\x02\x02\u0261\u024B\x03\x02\x02\x02\u0261" + - "\u0253\x03\x02\x02\x02\u0261\u0256\x03\x02\x02\x02\u0261\u0259\x03\x02" + - "\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262\u0294\x03\x02\x02\x02\u0263" + - "\u0264\f\x1C\x02\x02\u0264\u0265\x07!\x02\x02\u0265\u0293\x05.\x18\x1C" + - "\u0266\u0267\f\x1A\x02\x02\u0267\u0268\t\x02\x02\x02\u0268\u0293\x05." + - "\x18\x1B\u0269\u026A\f\x19\x02\x02\u026A\u026B\t\x03\x02\x02\u026B\u0293" + - "\x05.\x18\x1A\u026C\u026D\f\x18\x02\x02\u026D\u026E\t\x04\x02\x02\u026E" + - "\u0293\x05.\x18\x19\u026F\u0270\f\x16\x02\x02\u0270\u0271\x07>\x02\x02" + - "\u0271\u0272\x05.\x18\x17\u0272\u0273\b\x18\x01\x02\u0273\u0293\x03\x02" + - "\x02\x02\u0274\u0275\f\x14\x02\x02\u0275\u0276\x07-\x02\x02\u0276\u0293" + - "\x05.\x18\x15\u0277\u0278\f\x12\x02\x02\u0278\u0279\x07.\x02\x02\u0279" + - "\u0293\x05.\x18\x13\u027A\u027B\f\x11\x02\x02\u027B\u027C\x07/\x02\x02" + - "\u027C\u0293\x05.\x18\x12\u027D\u027E\f\x10\x02\x02\u027E\u027F\x070\x02" + - "\x02\u027F\u0293\x05.\x18\x11\u0280\u0281\f\n\x02\x02\u0281\u0282\x07" + - "\x1C\x02\x02\u0282\u0293\x05.\x18\v\u0283\u0284\f \x02\x02\u0284\u0285" + - "\x07\x18\x02\x02\u0285\u028B\x05L\'\x02\u0286\u0288\x07?\x02\x02\u0287" + - "\u0289\x05F$\x02\u0288\u0287\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02" + - "\u0289\u028A\x03\x02\x02\x02\u028A\u028C\x07@\x02\x02\u028B\u0286\x03" + - "\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u0293\x03\x02\x02\x02\u028D" + - "\u028E\f\x1D\x02\x02\u028E\u028F\x07\r\x02\x02\u028F\u0290\x05.\x18\x02" + - "\u0290\u0291\x07\x0E\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0263\x03" + - "\x02\x02\x02\u0292\u0266\x03\x02\x02\x02\u0292\u0269\x03\x02\x02\x02\u0292" + - "\u026C\x03\x02\x02\x02\u0292\u026F\x03\x02\x02\x02\u0292\u0274\x03\x02" + - "\x02\x02\u0292\u0277\x03\x02\x02\x02\u0292\u027A\x03\x02\x02\x02\u0292" + - "\u027D\x03\x02\x02\x02\u0292\u0280\x03\x02\x02\x02\u0292\u0283\x03\x02" + - "\x02\x02\u0292\u028D\x03\x02\x02\x02\u0293\u0296\x03\x02\x02\x02\u0294" + - "\u0292\x03\x02\x02\x02\u0294\u0295\x03\x02\x02\x02\u0295/\x03\x02\x02" + - "\x02\u0296\u0294\x03\x02\x02\x02\u0297\u0298\x072\x02\x02\u0298\u0299" + - "\x05.\x18\x02\u0299\u029B\x07\x04\x02\x02\u029A\u029C\x07\x0F\x02\x02" + - "\u029B\u029A\x03\x02\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u029D\x03" + - "\x02\x02\x02\u029D\u02A2\x052\x1A\x02\u029E\u029F\x07\x0F\x02\x02\u029F" + - "\u02A1\x052\x1A\x02\u02A0\u029E\x03\x02\x02\x02\u02A1\u02A4\x03\x02\x02" + - "\x02\u02A2\u02A0\x03\x02\x02\x02\u02A2\u02A3\x03\x02\x02\x02\u02A3\u02A5" + - "\x03\x02\x02\x02\u02A4\u02A2\x03\x02\x02\x02\u02A5\u02A6\x07\x05\x02\x02" + - "\u02A61\x03\x02\x02\x02\u02A7\u02AA\x054\x1B\x02\u02A8\u02AA\x07\'\x02" + - "\x02\u02A9\u02A7\x03\x02\x02\x02\u02A9\u02A8\x03\x02\x02\x02\u02AA\u02AB" + - "\x03\x02\x02\x02\u02AB\u02AC\x07\x1D\x02\x02\u02AC\u02AD\x05.\x18\x02" + - "\u02AD3\x03\x02\x02\x02\u02AE\u02B5\x05T+\x02\u02AF\u02B2\x07?\x02\x02" + - "\u02B0\u02B3\x05T+\x02\u02B1\u02B3\x07\'\x02\x02\u02B2\u02B0\x03\x02\x02" + - "\x02\u02B2\u02B1\x03\x02\x02\x02\u02B3\u02B4\x03\x02\x02\x02\u02B4\u02B6" + - "\x07@\x02\x02\u02B5\u02AF\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02" + - "\u02B65\x03\x02\x02\x02\u02B7\u02B8\x05\b\x05\x02\u02B8\u02B9\x07\x02" + - "\x02\x03\u02B9\u02C1\x03\x02\x02\x02\u02BA\u02BB\x05.\x18\x02\u02BB\u02BC" + - "\x07\x02\x02\x03\u02BC\u02C1\x03\x02\x02\x02\u02BD\u02BE\x07E\x02\x02" + - "\u02BE\u02C1\x07\x02\x02\x03\u02BF\u02C1\x07\x02\x02\x03\u02C0\u02B7\x03" + - "\x02\x02\x02\u02C0\u02BA\x03\x02\x02\x02\u02C0\u02BD\x03\x02\x02\x02\u02C0" + - "\u02BF\x03\x02\x02\x02\u02C17\x03\x02\x02\x02\u02C2\u02C5\x05:\x1E\x02" + - "\u02C3\u02C5\x05<\x1F\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3\x03" + - "\x02\x02\x02\u02C59\x03\x02\x02\x02\u02C6\u02C7\x05@!\x02\u02C7\u02C8" + - "\x07\x1D\x02\x02\u02C8\u02C9\x05.\x18\x02\u02C9\u02D8\x03\x02\x02\x02" + - "\u02CA\u02CB\x07?\x02\x02\u02CB\u02D0\x05@!\x02\u02CC\u02CD\x07\n\x02" + - "\x02\u02CD\u02CF\x05@!\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D2\x03" + - "\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D0\u02D1\x03\x02\x02\x02\u02D1" + - "\u02D3\x03\x02\x02\x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x07@\x02" + - "\x02\u02D4\u02D5\x07\x1D\x02\x02\u02D5\u02D6\x05.\x18\x02\u02D6\u02D8" + - "\x03\x02\x02\x02\u02D7\u02C6\x03\x02\x02\x02\u02D7\u02CA\x03\x02\x02\x02" + - "\u02D8;\x03\x02\x02\x02\u02D9\u02DA\x07?\x02\x02\u02DA\u02DB\x07?\x02" + - "\x02\u02DB\u02DE\x05@!\x02\u02DC\u02DD\x07\n\x02\x02\u02DD\u02DF\x05@" + - "!\x02\u02DE\u02DC\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02DE" + - "\x03\x02\x02\x02\u02E0\u02E1\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + - "\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07\x1D" + - "\x02\x02\u02E5\u02E6\x05.\x18\x02\u02E6=\x03\x02\x02\x02\u02E7\u02EA\x07" + - "\'\x02\x02\u02E8\u02EA\x05R*\x02\u02E9\u02E7\x03\x02\x02\x02\u02E9\u02E8" + - "\x03\x02\x02\x02\u02EA?\x03\x02\x02\x02\u02EB\u02EC\x05> \x02\u02ECA\x03" + - "\x02\x02\x02\u02ED\u02EE\x05> \x02\u02EE\u02EF\x07\x07\x02\x02\u02EF\u02F0" + - "\x05&\x14\x02\u02F0C\x03\x02\x02\x02\u02F1\u02F4\x075\x02\x02\u02F2\u02F4" + - "\x05R*\x02\u02F3\u02F1\x03\x02\x02\x02\u02F3\u02F2\x03\x02\x02\x02\u02F4" + - "E\x03\x02\x02\x02\u02F5\u02FA\x05.\x18\x02\u02F6\u02F7\x07\n\x02\x02\u02F7" + - "\u02F9\x05.\x18\x02\u02F8\u02F6\x03\x02\x02\x02\u02F9\u02FC\x03\x02\x02" + - "\x02\u02FA\u02F8\x03\x02\x02\x02\u02FA\u02FB\x03\x02\x02\x02\u02FBG\x03" + - "\x02\x02\x02\u02FC\u02FA\x03\x02\x02\x02\u02FD\u02FE\x05T+\x02\u02FE\u02FF" + - "\x07\x07\x02\x02\u02FF\u0300\x05.\x18\x02\u0300\u0304\x03\x02\x02\x02" + - "\u0301\u0302\x07(\x02\x02\u0302\u0304\x05.\x18\x02\u0303\u02FD\x03\x02" + - "\x02\x02\u0303\u0301\x03\x02\x02\x02\u0304I\x03\x02\x02\x02\u0305\u0308" + - "\x05R*\x02\u0306\u0308\t\x05\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307" + - "\u0306\x03\x02\x02\x02\u0308K\x03\x02\x02\x02\u0309\u030C\x05R*\x02\u030A" + - "\u030C\t\x06\x02\x02\u030B\u0309\x03\x02\x02\x02\u030B\u030A\x03\x02\x02" + - "\x02\u030CM\x03\x02\x02\x02\u030D\u030E\t\x07\x02\x02\u030EO\x03\x02\x02" + - "\x02\u030F\u0310\t\b\x02\x02\u0310Q\x03\x02\x02\x02\u0311\u0316\x05V," + - "\x02\u0312\u0313\x07)\x02\x02\u0313\u0315\x05V,\x02\u0314\u0312\x03\x02" + - "\x02\x02\u0315\u0318\x03\x02\x02\x02\u0316\u0314\x03\x02\x02\x02\u0316" + - "\u0317\x03\x02\x02\x02\u0317S\x03\x02\x02\x02\u0318\u0316\x03\x02\x02" + - "\x02\u0319\u031E\x05V,\x02\u031A\u031B\x05R*\x02\u031B\u031C\b+\x01\x02" + - "\u031C\u031E\x03\x02\x02\x02\u031D\u0319\x03\x02\x02\x02\u031D\u031A\x03" + - "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + - "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + - "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + - "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u019E\u01A3" + - "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + - "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + - "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + - "\u02E0\u02E9\u02F3\u02FA\u0303\u0307\u030B\u0316\u031D"; + "\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0" + + "\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2\u01F0\x03\x02" + + "\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F4\u01F5" + + "\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x07\x05\x02\x02" + + "\u01F7\u0261\x03\x02\x02\x02\u01F8\u0261\x050\x19\x02\u01F9\u01FA\x07" + + "#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05.\x18\x02\u01FC\u01FD" + + "\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC\x03\x02\x02\x02\u01FF" + + "\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0200\u0201\x03\x02" + + "\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03\x02\x02\x02\u0203" + + "\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204\u0205\x03\x02\x02" + + "\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05\x02\x02\u0207\u0261" + + "\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A\x07\x04\x02\x02" + + "\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C\u020E\x05.\x18" + + "\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02\x02\u020F\u020D" + + "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213\x03\x02\x02\x02" + + "\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02\u0213\u0212\x03" + + "\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03\x02\x02\x02\u0215" + + "\u0216\x07\x05\x02\x02\u0216\u0261\x03\x02\x02\x02\u0217\u021C\x05R*\x02" + + "\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A\u021C\x07*\x02" + + "\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02\x02\u021B\u0219" + + "\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0261\x03\x02\x02\x02" + + "\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F\u0220\x07\n\x02" + + "\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0224\x05" + + ".\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03\x02\x02\x02\u0225" + + "\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0229\x03\x02" + + "\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02\x02\u0229\u0228" + + "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B\x03\x02\x02\x02" + + "\u022B\u022C\x07@\x02\x02\u022C\u0261\x03\x02\x02\x02\u022D\u022E\x07" + + "\x04\x02\x02\u022E\u0233\x05H%\x02\u022F\u0230\x07\n\x02\x02\u0230\u0232" + + "\x05H%\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02\u0233" + + "\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0237\x03\x02" + + "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0238\x07\n\x02\x02\u0237\u0236" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239\x03\x02\x02\x02" + + "\u0239\u023A\x07\x05\x02\x02\u023A\u0261\x03\x02\x02\x02\u023B\u0244\x07" + + "\r\x02\x02\u023C\u0241\x05.\x18\x02\u023D\u023E\x07\n\x02\x02\u023E\u0240" + + "\x05.\x18\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0243\x03\x02\x02\x02" + + "\u0241\u023F\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242\u0245\x03" + + "\x02\x02\x02\u0243\u0241\x03\x02\x02\x02\u0244\u023C\x03\x02\x02\x02\u0244" + + "\u0245\x03\x02\x02\x02\u0245\u0247\x03\x02\x02\x02\u0246\u0248\x07\n\x02" + + "\x02\u0247\u0246\x03\x02\x02\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + + "\x03\x02\x02\x02\u0249\u0261\x07\x0E\x02\x02\u024A\u024B\x07%\x02\x02" + + "\u024B\u024C\x07?\x02\x02\u024C\u024D\x05.\x18\x02\u024D\u024E\x07@\x02" + + "\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07&\x02\x02\u0250\u0251\x05" + + ".\x18\x07\u0251\u0261\x03\x02\x02\x02\u0252\u0253\x05\n\x06\x02\u0253" + + "\u0254\x05.\x18\x06\u0254\u0261\x03\x02\x02\x02\u0255\u0256\x05\x14\v" + + "\x02\u0256\u0257\x05.\x18\x05\u0257\u0261\x03\x02\x02\x02\u0258\u0259" + + "\x07?\x02\x02\u0259\u025A\x05.\x18\x02\u025A\u025B\x07@\x02\x02\u025B" + + "\u0261\x03\x02\x02\x02\u025C\u025D\x07\x04\x02\x02\u025D\u025E\x05.\x18" + + "\x02\u025E\u025F\x07\x05\x02\x02\u025F\u0261\x03\x02\x02\x02\u0260\u01CA" + + "\x03\x02\x02\x02\u0260\u01CC\x03\x02\x02\x02\u0260\u01D3\x03\x02\x02\x02" + + "\u0260\u01D5\x03\x02\x02\x02\u0260\u01DA\x03\x02\x02\x02\u0260\u01E9\x03" + + "\x02\x02\x02\u0260\u01F8\x03\x02\x02\x02\u0260\u01F9\x03\x02\x02\x02\u0260" + + "\u0208\x03\x02\x02\x02\u0260\u021B\x03\x02\x02\x02\u0260\u021D\x03\x02" + + "\x02\x02\u0260\u022D\x03\x02\x02\x02\u0260\u023B\x03\x02\x02\x02\u0260" + + "\u024A\x03\x02\x02\x02\u0260\u0252\x03\x02\x02\x02\u0260\u0255\x03\x02" + + "\x02\x02\u0260\u0258\x03\x02\x02\x02\u0260\u025C\x03\x02\x02\x02\u0261" + + "\u0293\x03\x02\x02\x02\u0262\u0263\f\x1C\x02\x02\u0263\u0264\x07!\x02" + + "\x02\u0264\u0292\x05.\x18\x1C\u0265\u0266\f\x1A\x02\x02\u0266\u0267\t" + + "\x02\x02\x02\u0267\u0292\x05.\x18\x1B\u0268\u0269\f\x19\x02\x02\u0269" + + "\u026A\t\x03\x02\x02\u026A\u0292\x05.\x18\x1A\u026B\u026C\f\x18\x02\x02" + + "\u026C\u026D\t\x04\x02\x02\u026D\u0292\x05.\x18\x19\u026E\u026F\f\x16" + + "\x02\x02\u026F\u0270\x07>\x02\x02\u0270\u0271\x05.\x18\x17\u0271\u0272" + + "\b\x18\x01\x02\u0272\u0292\x03\x02\x02\x02\u0273\u0274\f\x14\x02\x02\u0274" + + "\u0275\x07-\x02\x02\u0275\u0292\x05.\x18\x15\u0276\u0277\f\x12\x02\x02" + + "\u0277\u0278\x07.\x02\x02\u0278\u0292\x05.\x18\x13\u0279\u027A\f\x11\x02" + + "\x02\u027A\u027B\x07/\x02\x02\u027B\u0292\x05.\x18\x12\u027C\u027D\f\x10" + + "\x02\x02\u027D\u027E\x070\x02\x02\u027E\u0292\x05.\x18\x11\u027F\u0280" + + "\f\n\x02\x02\u0280\u0281\x07\x1C\x02\x02\u0281\u0292\x05.\x18\v\u0282" + + "\u0283\f \x02\x02\u0283\u0284\x07\x18\x02\x02\u0284\u028A\x05L\'\x02\u0285" + + "\u0287\x07?\x02\x02\u0286\u0288\x05F$\x02\u0287\u0286\x03\x02\x02\x02" + + "\u0287\u0288\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289\u028B\x07" + + "@\x02\x02\u028A\u0285\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B" + + "\u0292\x03\x02\x02\x02\u028C\u028D\f\x1D\x02\x02\u028D\u028E\x07\r\x02" + + "\x02\u028E\u028F\x05.\x18\x02\u028F\u0290\x07\x0E\x02\x02\u0290\u0292" + + "\x03\x02\x02\x02\u0291\u0262\x03\x02\x02\x02\u0291\u0265\x03\x02\x02\x02" + + "\u0291\u0268\x03\x02\x02\x02\u0291\u026B\x03\x02\x02\x02\u0291\u026E\x03" + + "\x02\x02\x02\u0291\u0273\x03\x02\x02\x02\u0291\u0276\x03\x02\x02\x02\u0291" + + "\u0279\x03\x02\x02\x02\u0291\u027C\x03\x02\x02\x02\u0291\u027F\x03\x02" + + "\x02\x02\u0291\u0282\x03\x02\x02\x02\u0291\u028C\x03\x02\x02\x02\u0292" + + "\u0295\x03\x02\x02\x02\u0293\u0291\x03\x02\x02\x02\u0293\u0294\x03\x02" + + "\x02\x02\u0294/\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0296\u0297" + + "\x072\x02\x02\u0297\u0298\x05.\x18\x02\u0298\u029A\x07\x04\x02\x02\u0299" + + "\u029B\x07\x0F\x02\x02\u029A\u0299\x03\x02\x02\x02\u029A\u029B\x03\x02" + + "\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u02A1\x052\x1A\x02\u029D\u029E" + + "\x07\x0F\x02\x02\u029E\u02A0\x052\x1A\x02\u029F\u029D\x03\x02\x02\x02" + + "\u02A0\u02A3\x03\x02\x02\x02\u02A1\u029F\x03\x02\x02\x02\u02A1\u02A2\x03" + + "\x02\x02\x02\u02A2\u02A4\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4" + + "\u02A5\x07\x05\x02\x02\u02A51\x03\x02\x02\x02\u02A6\u02A9\x054\x1B\x02" + + "\u02A7\u02A9\x07\'\x02\x02\u02A8\u02A6\x03\x02\x02\x02\u02A8\u02A7\x03" + + "\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02\u02AA\u02AB\x07\x1D\x02\x02\u02AB" + + "\u02AC\x05.\x18\x02\u02AC3\x03\x02\x02\x02\u02AD\u02B4\x05T+\x02\u02AE" + + "\u02B1\x07?\x02\x02\u02AF\u02B2\x05T+\x02\u02B0\u02B2\x07\'\x02\x02\u02B1" + + "\u02AF\x03\x02\x02\x02\u02B1\u02B0\x03\x02\x02\x02\u02B2\u02B3\x03\x02" + + "\x02\x02\u02B3\u02B5\x07@\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B5" + + "\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B7\x05\b\x05\x02\u02B7" + + "\u02B8\x07\x02\x02\x03\u02B8\u02C0\x03\x02\x02\x02\u02B9\u02BA\x05.\x18" + + "\x02\u02BA\u02BB\x07\x02\x02\x03\u02BB\u02C0\x03\x02\x02\x02\u02BC\u02BD" + + "\x07E\x02\x02\u02BD\u02C0\x07\x02\x02\x03\u02BE\u02C0\x07\x02\x02\x03" + + "\u02BF\u02B6\x03\x02\x02\x02\u02BF\u02B9\x03\x02\x02\x02\u02BF\u02BC\x03" + + "\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C07\x03\x02\x02\x02\u02C1" + + "\u02C4\x05:\x1E\x02\u02C2\u02C4\x05<\x1F\x02\u02C3\u02C1\x03\x02\x02\x02" + + "\u02C3\u02C2\x03\x02\x02\x02\u02C49\x03\x02\x02\x02\u02C5\u02C6\x05@!" + + "\x02\u02C6\u02C7\x07\x1D\x02\x02\u02C7\u02C8\x05.\x18\x02\u02C8\u02D7" + + "\x03\x02\x02\x02\u02C9\u02CA\x07?\x02\x02\u02CA\u02CF\x05@!\x02\u02CB" + + "\u02CC\x07\n\x02\x02\u02CC\u02CE\x05@!\x02\u02CD\u02CB\x03\x02\x02\x02" + + "\u02CE\u02D1\x03\x02\x02\x02\u02CF\u02CD\x03\x02\x02\x02\u02CF\u02D0\x03" + + "\x02\x02\x02\u02D0\u02D2\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2" + + "\u02D3\x07@\x02\x02\u02D3\u02D4\x07\x1D\x02\x02\u02D4\u02D5\x05.\x18\x02" + + "\u02D5\u02D7\x03\x02\x02\x02\u02D6\u02C5\x03\x02\x02\x02\u02D6\u02C9\x03" + + "\x02\x02\x02\u02D7;\x03\x02\x02\x02\u02D8\u02D9\x07?\x02\x02\u02D9\u02DA" + + "\x07?\x02\x02\u02DA\u02DD\x05@!\x02\u02DB\u02DC\x07\n\x02\x02\u02DC\u02DE" + + "\x05@!\x02\u02DD\u02DB\x03\x02\x02\x02\u02DE\u02DF\x03\x02\x02\x02\u02DF" + + "\u02DD\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02E1\x03\x02" + + "\x02\x02\u02E1\u02E2\x07@\x02\x02\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4" + + "\x07\x1D\x02\x02\u02E4\u02E5\x05.\x18\x02\u02E5=\x03\x02\x02\x02\u02E6" + + "\u02E9\x07\'\x02\x02\u02E7\u02E9\x05R*\x02\u02E8\u02E6\x03\x02\x02\x02" + + "\u02E8\u02E7\x03\x02\x02\x02\u02E9?\x03\x02\x02\x02\u02EA\u02EB\x05> " + + "\x02\u02EBA\x03\x02\x02\x02\u02EC\u02ED\x05> \x02\u02ED\u02EE\x07\x07" + + "\x02\x02\u02EE\u02EF\x05&\x14\x02\u02EFC\x03\x02\x02\x02\u02F0\u02F3\x07" + + "5\x02\x02\u02F1\u02F3\x05R*\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1" + + "\x03\x02\x02\x02\u02F3E\x03\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5" + + "\u02F6\x07\n\x02\x02\u02F6\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02" + + "\x02\u02F8\u02FB\x03\x02\x02\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA" + + "\x03\x02\x02\x02\u02FAG\x03\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC" + + "\u02FD\x05T+\x02\u02FD\u02FE\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02" + + "\u02FF\u0303\x03\x02\x02\x02\u0300\u0301\x07(\x02\x02\u0301\u0303\x05" + + ".\x18\x02\u0302\u02FC\x03\x02\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303" + + "I\x03\x02\x02\x02\u0304\u0307\x05R*\x02\u0305\u0307\t\x05\x02\x02\u0306" + + "\u0304\x03\x02\x02\x02\u0306\u0305\x03\x02\x02\x02\u0307K\x03\x02\x02" + + "\x02\u0308\u030B\x05R*\x02\u0309\u030B\t\x06\x02\x02\u030A\u0308\x03\x02" + + "\x02\x02\u030A\u0309\x03\x02\x02\x02\u030BM\x03\x02\x02\x02\u030C\u030D" + + "\t\x07\x02\x02\u030DO\x03\x02\x02\x02\u030E\u030F\t\b\x02\x02\u030FQ\x03" + + "\x02\x02\x02\u0310\u0315\x05V,\x02\u0311\u0312\x07)\x02\x02\u0312\u0314" + + "\x05V,\x02\u0313\u0311\x03\x02\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315" + + "\u0313\x03\x02\x02\x02\u0315\u0316\x03\x02\x02\x02\u0316S\x03\x02\x02" + + "\x02\u0317\u0315\x03\x02\x02\x02\u0318\u031D\x05V,\x02\u0319\u031A\x05" + + "R*\x02\u031A\u031B\b+\x01\x02\u031B\u031D\x03\x02\x02\x02\u031C\u0318" + + "\x03\x02\x02\x02\u031C\u0319\x03\x02\x02\x02\u031DU\x03\x02\x02\x02\u031E" + + "\u031F\t\t\x02\x02\u031FW\x03\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE" + + "\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F" + + "\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150\u0152\u0163\u0166\u0169" + + "\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC\u01C2\u01C6\u01CF\u01E1" + + "\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B\u0225\u0229\u0233\u0237" + + "\u0241\u0244\u0247\u0260\u0287\u028A\u0291\u0293\u029A\u02A1\u02A8\u02B1" + + "\u02B4\u02BF\u02C3\u02CF\u02D6\u02DF\u02E8\u02F2\u02F9\u0302\u0306\u030A" + + "\u0315\u031C"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4707,18 +4707,18 @@ export class TypeSumDefContext extends TypeDefContext { export class TypeDefHeadContext extends ParserRuleContext { public _typeName!: QualIdContext; - public _typeVar!: TypeVarContext; - public _typeVars: TypeVarContext[] = []; + public _LOW_ID!: Token; + public _typeVars: Token[] = []; public qualId(): QualIdContext { return this.getRuleContext(0, QualIdContext); } - public typeVar(): TypeVarContext[]; - public typeVar(i: number): TypeVarContext; - public typeVar(i?: number): TypeVarContext | TypeVarContext[] { + public LOW_ID(): TerminalNode[]; + public LOW_ID(i: number): TerminalNode; + public LOW_ID(i?: number): TerminalNode | TerminalNode[] { if (i === undefined) { - return this.getRuleContexts(TypeVarContext); + return this.getTokens(QuintParser.LOW_ID); } else { - return this.getRuleContext(i, TypeVarContext); + return this.getToken(QuintParser.LOW_ID, i); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index 0b0bb2bd3..d4c42e656 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -289,16 +289,20 @@ export interface QuintAssume extends WithId { assumption: QuintEx } -/** QuintTypeDefs represent both type aliases and abstract types +/** QuintTypeDefs represent declared type constructors and abstract types * * - Abstract types do not have an associated `type` - * - Type aliases always have an associated `type` + * - Type constructors aliases have an associated `type` and `n >= 0` type parameters */ export interface QuintTypeDef extends WithId { /** definition kind ('typedef') */ kind: 'typedef' /** name of a type alias */ name: string + /** type variables + * + * `typeof params === 'undefined'` is taken to mean the same as `params.length === 0` */ + params?: string[] /** type to associate with the alias (none for uninterpreted type) */ type?: QuintType } diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 0b6b296de..46d60312c 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -24,10 +24,10 @@ import { QuintConstType, QuintSumType, QuintType, - QuintVarType, Row, RowField, isUnitType, + typeNames, unitType, } from '../ir/quintTypes' import { SourceMap } from './quintParserFrontend' @@ -37,7 +37,7 @@ import { TerminalNode } from 'antlr4ts/tree/TerminalNode' import { QuintTypeDef } from '../ir/quintIr' import { zip } from '../util' import { QuintError } from '../quintError' -import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' +import { lowercaseTypeError, tooManySpreadsError, undeclaredTypeParamsError } from './parseErrors' import { Loc } from '../ErrorMessage' import assert, { fail } from 'assert' @@ -370,11 +370,14 @@ export class ToIrListener implements QuintListener { this.errors.push(lowercaseTypeError(id, name)) } - // TODO: Check that variables have all been declared - // TODO: Add types to declaration - const _typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) - const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) } @@ -392,15 +395,14 @@ export class ToIrListener implements QuintListener { const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } const type: QuintSumType = { id, kind: 'sum', fields: row } - // TODO: Check all vars in body are bound - const _typeVars = this.popTypeDefHeadTypeVars(defHead) - const def: QuintTypeDef = { - id: id, - name, - kind: 'typedef', - type, - } + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) // Used for annotations in the variant constructors const constructorReturnType: QuintConstType = { id, kind: 'const', name } @@ -490,26 +492,6 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def, ...constructors) } - // Pop all the type variables in the head of a type def from the type stack - // E.g., for a type def like - // - // type Foo[a,b,c] = ... - // - // Return the type variables [a, b, c] - private popTypeDefHeadTypeVars(ctx: p.TypeDefHeadContext): QuintVarType[] { - return ( - ctx._typeVars - .map( - _ => - this.popType().unwrap(() => - fail('internal error: type parameter parsed with no type variable') - ) as QuintVarType - ) - // The stack stores the variables in reverse order - .reverse() - ) - } - exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value @@ -521,6 +503,22 @@ export class ToIrListener implements QuintListener { this.variantStack.push({ fieldName, fieldType }) } + private checkForUndeclaredTypeVariables(id: bigint, typeDef: QuintTypeDef) { + if (!typeDef.type) { + return + } + + const typeVars = typeNames(typeDef.type) + const undeclaredTypeVariables: string[] = + // We are just checking if the type variables appearing in `type` are a subset of the type params + // but our version of node has no sensible set operations? + [...typeVars.typeVariables, ...typeVars.rowVariables].filter(v => !(typeDef.params ?? []).includes(v)) + + if (undeclaredTypeVariables.length > 0) { + this.errors.push(undeclaredTypeParamsError(id, undeclaredTypeVariables)) + } + } + // module Foo = Proto(x = a, y = b) // module Foo = Proto(x = a, y = b) from "" exitInstanceMod(ctx: p.InstanceModContext) { @@ -1082,7 +1080,8 @@ export class ToIrListener implements QuintListener { // The next type on the stack after the args should be the applied // type constructor const ctor: QuintConstType = { id: this.getId(ctx), kind: 'const', name: ctx._typeCtor.text } - this.typeStack.push({ id, kind: 'app', ctor, args }) + const typeApp: QuintAppType = { id, kind: 'app', ctor, args } + this.typeStack.push(typeApp) } // TODO: replace with general type application diff --git a/quint/src/parsing/parseErrors.ts b/quint/src/parsing/parseErrors.ts index 40a771e00..0572470c4 100644 --- a/quint/src/parsing/parseErrors.ts +++ b/quint/src/parsing/parseErrors.ts @@ -25,3 +25,19 @@ export function tooManySpreadsError(id: bigint): QuintError { data: {}, } } + +export function undeclaredTypeParamsError(id: bigint, unboundTypeVariables: string[]): QuintError { + return { + code: 'QNT014', + message: `the type variables ${unboundTypeVariables.join(', ')} are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]`, + reference: id, + data: {}, + } +} diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index b67b9a1e2..57c18af1b 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -51,6 +51,8 @@ export type ErrorCode = | 'QNT012' /* QNT013: import ... from : could not load */ | 'QNT013' + /* QNT014: Type variables in a type declaration are not declared as parameters */ + | 'QNT014' /* QNT098: Cyclic imports */ | 'QNT098' /* QNT099: Found cyclic definitions */ diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index a8af5a48f..bf75af9b3 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -93,7 +93,7 @@ describe('resolveNames', () => { const result = resolveNamesForDefs([ 'const a: UNKNOWN_TYPE_0', 'var b: UNKNOWN_TYPE_1', - 'type C = Set[t]', + 'type C[t] = Set[t]', 'assume d = 1', ]) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index dbead2601..1f2281e07 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -218,6 +218,24 @@ describe('syntax errors', () => { assert.equal(errors[0].message, `mismatched input ''' expecting STRING`) assert.equal(errors[0].code, 'QNT000') }) + + it('error on type declarations with undeclared variables', () => { + // we should use double quotes + const code = `module singleQuotes { type T = (List[a], Set[b]) }` + const [error] = parseErrorsFrom(defaultSourceName, code) + assert.deepEqual(error.code, 'QNT014') + assert.deepEqual( + error.message, + `the type variables a, b are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]` + ) + }) }) // Test the JSON error output. Most of the tests here should migrate to the diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 49d90a0d9..49df38868 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"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":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"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":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"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":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"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":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"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":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"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":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"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":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"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":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 67982899d..86a24fb9f 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 6ceb3f033..24a0dc8ae 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index e0af39456..f3055bd2f 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":31,"name":"m","declarations":[{"id":13,"kind":"typedef","name":"MapApp","type":{"id":12,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":10,"kind":"fun","arg":{"id":8,"kind":"var","name":"a"},"res":{"id":9,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":11,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":24,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":16,"kind":"var","name":"ok"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":23,"kind":"lambda","params":[{"id":20,"name":"__OkParam"}],"qualifier":"def","expr":{"id":22,"kind":"app","opcode":"variant","args":[{"id":19,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":21}]}}},{"id":30,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":17,"kind":"var","name":"err"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":29,"kind":"lambda","params":[{"id":26,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":28,"kind":"app","opcode":"variant","args":[{"id":25,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":27}]}}}]}],"table":{"18":{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},"21":{"id":20,"name":"__OkParam","kind":"param"},"27":{"id":26,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":26,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":19,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":18,"kind":"lambda","params":[{"id":15,"name":"__OkParam"}],"qualifier":"def","expr":{"id":17,"kind":"app","opcode":"variant","args":[{"id":14,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":16}]}}},{"id":25,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":24,"kind":"lambda","params":[{"id":21,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":23,"kind":"app","opcode":"variant","args":[{"id":20,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":22}]}}}]}],"table":{"13":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"16":{"id":15,"name":"__OkParam","kind":"param"},"22":{"id":21,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index 598ba96ac..2e0f71688 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"7":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"8":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"9":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"10":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"12":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"13":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"14":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"15":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"16":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"17":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"18":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"31":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"15":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"16":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"21":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"22":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 6d5350d45a85a6950998195b12443f8846c23703 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:35:17 -0500 Subject: [PATCH 251/428] Add lookup definition transformer --- quint/src/ir/IRTransformer.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index e095b7347..2f3401240 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -16,6 +16,7 @@ import * as ir from './quintIr' import * as t from './quintTypes' import { unreachable } from '../util' +import { LookupDefinition } from '../names/base' export class IRTransformer { enterModule?: (module: ir.QuintModule) => ir.QuintModule @@ -282,6 +283,30 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. return newType } +/** + * Transforms a Quint LookupDefinition with a transformer + * + * This is just a thin wrapper to deal with the fact that LookupDefinitions are a slightly awkward union. + * + * @param transformer: the IRTransformer instance with the functions to be invoked + * @param lud: the Quint LookupDefinition to be transformed + * + * @returns the transformed LookupDefinition + */ +export function transformLookupDefinition(transformer: IRTransformer, lud: LookupDefinition): LookupDefinition { + switch (lud.kind) { + case 'const': + case 'def': + case 'var': + case 'assume': + case 'typedef': + return transformDefinition(transformer, lud) + + case 'param': + return lud.typeAnnotation ? { ...lud, typeAnnotation: transformType(transformer, lud.typeAnnotation) } : lud + } +} + /** * Transforms a Quint declaration with a transformer, invoking the corresponding function for each * inner component. From 1e0d503803aafbda7fe1764e19cd1c761ba6c363 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:06:33 -0500 Subject: [PATCH 252/428] Fix printing of parametric type declarations --- quint/src/ir/IRprinting.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 16acc3e0e..8bbc720c1 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -121,7 +121,8 @@ export function definitionToString(def: QuintDef, includeBody: boolean = true, t return `assume ${def.name} = ${expressionToString(def.assumption)}` case 'typedef': if (def.type) { - return `type ${def.name} = ${typeToString(def.type)}` + const params = def.params && def.params.length > 0 ? `[${def.params.join(', ')}]` : '' + return `type ${def.name}${params} = ${typeToString(def.type)}` } else { return `type ${def.name}` } From 65737702bef02d932b52f1041363c80783050421 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 11:54:02 -0500 Subject: [PATCH 253/428] Fix test --- quint/test/types/parser.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 133c0c011..31d262f3f 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -103,13 +103,13 @@ describe('parseType', () => { type.map(value => assert.deepEqual(value, { kind: 'app', - ctor: { kind: 'const', name: 'Foo', id: 1n }, + ctor: { kind: 'const', name: 'Foo', id: 5n }, args: [ - { kind: 'int', id: 2n }, - { kind: 'bool', id: 3n }, - { kind: 'str', id: 4n }, + { kind: 'int', id: 1n }, + { kind: 'bool', id: 2n }, + { kind: 'str', id: 3n }, ], - id: 5n, + id: 4n, }) ) }) From a1ebe5119cfa0a22df10503c768528579ebe9f83 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:40:25 -0500 Subject: [PATCH 254/428] Comment out failing test --- quint/test/types/inferrer.test.ts | 35 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 9fe0c58ba..0c1dff0b8 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -395,23 +395,24 @@ module B { ) }) - it('checks correct polymorphic types', () => { - const defs = [ - 'type Result[ok, err] = Ok(ok) | Err(err)', - `def result_map(r: Result[a, e], f: a => b): Result[b, e] = - match r { - | Ok(x) => Ok(f(x)) - | Err(_) => r - }`, - ] - - const [errors, table] = inferTypesForDefs(defs) - assert.sameDeepMembers([...errors.entries()], []) - assert.sameDeepMembers( - [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), - [] - ) - }) + // TODO + // it('checks correct polymorphic types', () => { + // const defs = [ + // 'type Result[ok, err] = Ok(ok) | Err(err)', + // `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + // match r { + // | Ok(x) => Ok(f(x)) + // | Err(_) => r + // }`, + // ] + + // const [errors, table] = inferTypesForDefs(defs) + // assert.sameDeepMembers([...errors.entries()], []) + // assert.sameDeepMembers( + // [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), + // [] + // ) + // }) it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From caf3821959fd4fce9bf1157ec10cea08c9082c57 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 18:30:25 -0500 Subject: [PATCH 255/428] Fix variant constructor type annotations They were omitting type arguments --- quint/src/parsing/ToIrListener.ts | 15 ++++++- quint/test/types/inferrer.test.ts | 66 ++++++++++++++++--------------- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 46d60312c..2dc64cd5b 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -24,6 +24,7 @@ import { QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, @@ -405,7 +406,17 @@ export class ToIrListener implements QuintListener { this.checkForUndeclaredTypeVariables(id, def) // Used for annotations in the variant constructors - const constructorReturnType: QuintConstType = { id, kind: 'const', name } + let constructorReturnType: QuintType + // The constant identifying the type definition. E.g. `Result` + const typeConst: QuintConstType = { id: this.getId(ctx), kind: 'const', name } + if (def.params) { + // The type takes parameters, so we need a type application as the return type. E.g., `Result[ok, err]` + const args: QuintVarType[] = def.params.map(name => ({ id: this.getId(ctx), kind: 'var', name })) + constructorReturnType = { id, kind: 'app', ctor: typeConst, args } + } else { + // The type takes no parameters, so we only need the constant name + constructorReturnType = typeConst + } // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression @@ -451,7 +462,7 @@ export class ToIrListener implements QuintListener { // ``` qualifier = 'val' - // The nullary variant constructor is actualy + // The nullary variant constructor is actually // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 0c1dff0b8..5cf311add 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -164,21 +164,22 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], + [15n, 'str'], + [16n, 'int'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [5n, 'int'], - [4n, 'str'], + [18n, '(A(int) | B({}))'], [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], [9n, '(int) => (A(int) | B({}))'], + [10n, '(int) => (A(int) | B({}))'], + [11n, 'str'], + [12n, '{}'], + [13n, '(B({}) | A(int))'], + [14n, '(B({}) | A(int))'], ]) }) @@ -205,34 +206,35 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], + [15n, 'str'], + [16n, 'int'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], [18n, '(A(int) | B({}))'], - [24n, 'str'], - [26n, 'int'], - [19n, 'int'], + [6n, 'int'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], + [10n, '(int) => (A(int) | B({}))'], + [11n, 'str'], + [12n, '{}'], + [13n, '(B({}) | A(int))'], + [14n, '(B({}) | A(int))'], + [19n, '(A(int) | B({}))'], + [25n, 'str'], + [27n, 'int'], [20n, 'int'], [21n, 'int'], - [25n, '(int) => int'], - [27n, 'str'], - [29n, '{}'], [22n, 'int'], - [28n, '({}) => int'], + [26n, '(int) => int'], + [28n, 'str'], + [30n, '{}'], [23n, 'int'], - [30n, 'int'], - [5n, 'int'], - [4n, 'str'], - [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [29n, '({}) => int'], + [24n, 'int'], + [31n, 'int'], ]) }) From f86104e1b29ee51687bf91799dfd2a2c9224d504 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:47:11 -0500 Subject: [PATCH 256/428] Remove stale comments --- quint/src/types/constraintGenerator.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 4ac413bcf..aa48e3ec6 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -110,23 +110,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Nested lambdas add new entries to the stack, and pop them when exiting. private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] - // int[a] - // - // TODO: Free type variables must also use the variables in the constructor - // - // type T[a] = Set[a] - // type U[a, b] = (Set[a], List[b]) - // - // U[int, int] - // val x = (Set(1,2), List(1,2)) - // val f : a => U[a, U[a, b]] = ... - // - // U[a, b] =.= U[int, int] /\ a =.= b /\ typeOf(x) =.= (Set[a], List[b]) - // - // type MapT[a,b] = (Set[a], a => b) => Set[b] - // - // def map(s: Set[a], f: a => b): Set[b] = ... - // getResult(): [Map, Map] { return [this.errors, this.types] } @@ -315,8 +298,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.addToResults(e.id, this.fetchResult(e.expr.id)) } - // TODO: On type app exit, add constraints for the type operators? - // TODO: Need similar logic on exiting a type def (to create a scheme for a lambda) and exitOpDef(e: QuintOpDef) { if (this.errors.size !== 0) { return From 95f5fad39d305e4edc0ca9b3e8f81767094ac899 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:58:18 -0500 Subject: [PATCH 257/428] Update fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.map.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 49df38868..134bbd828 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"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":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"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":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"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":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"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":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"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":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"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":218,"kind":"int"},"id":219},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"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":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"78":{"id":77,"name":"__RectangleParam","kind":"param"},"84":{"id":83,"name":"__DogParam","kind":"param"},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"157":{"id":156,"name":"x","kind":"param"},"168":{"id":167,"kind":"typedef","name":"PROC"},"178":{"id":176,"name":"x","kind":"param"},"179":{"id":177,"name":"y","kind":"param"},"184":{"id":183,"name":"factor","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"190":{"id":189,"name":"x","kind":"param"},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"196":{"id":195,"name":"x","kind":"param"},"206":{"id":200,"name":"x","kind":"param"},"207":{"id":201,"name":"y","kind":"param"},"215":{"id":211,"name":"x","kind":"param"},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index f79f12375..789c2de56 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"224":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"226":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"237":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"238":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"240":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"241":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"242":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"244":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"245":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"246":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"248":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"249":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"250":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"253":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"254":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"255":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"256":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"257":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"261":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"262":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"263":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"264":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"265":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"269":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"270":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"271":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"272":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"273":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"277":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"278":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"279":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"280":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"281":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"282":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"283":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"284":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"285":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"286":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"287":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"288":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"289":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"290":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"291":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"292":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"293":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"294":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"295":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"296":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"297":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"298":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"299":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"301":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"302":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"303":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"304":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"305":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"307":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"308":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"310":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"311":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"316":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"317":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"319":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"320":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"321":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"322":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"323":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"324":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"325":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"326":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"329":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"330":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"331":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"332":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"333":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"334":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"335":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"336":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"337":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"338":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"339":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"340":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"341":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"342":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"343":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"344":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"347":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"348":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"349":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"350":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"351":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"352":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"353":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"354":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"355":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"367":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"368":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"369":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"370":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"371":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"372":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"373":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"374":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"375":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"378":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"379":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"380":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"381":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"382":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"383":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"385":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"386":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"387":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"388":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"389":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"390":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"393":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"394":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"395":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"396":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"397":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"398":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"399":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"400":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"401":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"402":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"404":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"405":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"406":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"407":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"408":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"409":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"410":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"411":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"412":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"413":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"414":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"415":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"416":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"417":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"419":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"420":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"421":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"422":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"423":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"424":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"425":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"426":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"427":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"428":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"429":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"430":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"431":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"432":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"433":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"434":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"435":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"436":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"437":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"439":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"441":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"442":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"443":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"444":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"445":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"446":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"447":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"448":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"449":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"451":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"453":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"456":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"457":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"458":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"459":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"460":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"461":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"462":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"464":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"466":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"467":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"471":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"472":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"473":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"474":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"475":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"476":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"480":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"481":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"482":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"483":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"484":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"488":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"489":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"490":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"491":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"492":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"493":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"494":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"495":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"496":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"497":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"498":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"499":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"500":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"501":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"502":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"503":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"504":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"505":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"506":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"508":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"509":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"510":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"512":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"513":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"514":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"515":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"516":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"517":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"518":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"519":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"520":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"521":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"522":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"523":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"76":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"77":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"83":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"88":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"89":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"90":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"91":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"92":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"93":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"94":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"95":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"97":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"98":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"99":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"101":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"102":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"103":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"105":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"106":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"107":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"109":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"110":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"111":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"113":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"114":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"115":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"117":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"118":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"120":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"121":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"122":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"124":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"125":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"126":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"128":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"129":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"130":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"132":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"133":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"134":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"136":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"137":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"138":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"140":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"141":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"142":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"144":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"146":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"148":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"149":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"150":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"151":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"152":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"153":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"154":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"156":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"157":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"159":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"160":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"161":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"162":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"163":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"164":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"165":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"166":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"167":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"168":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"169":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"170":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"171":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"172":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"173":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"174":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"175":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"176":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"177":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"178":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"179":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"183":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"185":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"189":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"190":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"195":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"196":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"197":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"200":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"201":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"202":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"203":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"204":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"205":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"206":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"207":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"208":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"211":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"212":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"213":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"214":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"215":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"218":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"219":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"220":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"223":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"228":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"229":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"230":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"231":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"232":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"233":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"234":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 86a24fb9f..db8016a6e 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 9d2b689b9..5d16f8502 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"15":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"16":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"17":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"18":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"19":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"20":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"21":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"22":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 24a0dc8ae..093e3b648 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"18":{"id":17,"name":"__CParam","kind":"param"},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index 5a444ca1c..19be73e13 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"16":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"17":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"22":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"23":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"24":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"25":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"26":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"27":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"28":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"29":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"30":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"40":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"41":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index f3055bd2f..f8280eaa1 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":26,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":19,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":18,"kind":"lambda","params":[{"id":15,"name":"__OkParam"}],"qualifier":"def","expr":{"id":17,"kind":"app","opcode":"variant","args":[{"id":14,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":16}]}}},{"id":25,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":24,"kind":"lambda","params":[{"id":21,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":23,"kind":"app","opcode":"variant","args":[{"id":20,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":22}]}}}]}],"table":{"13":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"16":{"id":15,"name":"__OkParam","kind":"param"},"22":{"id":21,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"19":{"id":18,"name":"__OkParam","kind":"param"},"25":{"id":24,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index 2e0f71688..d374b67c1 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"15":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"16":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"21":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"22":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 5b28d8892f53d489416edae9d24a6b3560e38851 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:32:00 -0500 Subject: [PATCH 258/428] Fix lightclient typedefs The new syntax for parametric types has enabled us to catch the error here: the target type started with a lowercase letter, and so was accidentally a variable. --- examples/cosmos/lightclient/typedefs.qnt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/cosmos/lightclient/typedefs.qnt b/examples/cosmos/lightclient/typedefs.qnt index 342e8ab7f..9de850f85 100644 --- a/examples/cosmos/lightclient/typedefs.qnt +++ b/examples/cosmos/lightclient/typedefs.qnt @@ -13,8 +13,8 @@ module typedefs { Commits: Set[str] } - type Blockchain = int -> blockHeader - type LightBlockMap = int -> lightBlock + type Blockchain = int -> BlockHeader + type LightBlockMap = int -> LightBlock type LightBlockStatus = int -> str -} \ No newline at end of file +} From e0dd072c1280c05b545b6f0773c1bdd010fb3bfb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:41:09 -0500 Subject: [PATCH 259/428] Remove old comment --- quint/src/parsing/ToIrListener.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 2dc64cd5b..a444e6d51 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -363,7 +363,6 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text - // NOTE: `rhs` must precede `typeVariables` due to the stack order! const type = this.popType().unwrap(() => fail('internal error: type alias declaration parsed with no right hand side') ) From b9577318a729859eef8d2762451d2b45665743e8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:42:49 -0500 Subject: [PATCH 260/428] Remove unused import --- quint/src/graphics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index d1fcbcb15..cafa467bc 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,7 +8,7 @@ * See LICENSE in the project root for license information. */ -import { strict as assert, fail } from 'assert' +import { strict as assert } from 'assert' import chalk from 'chalk' import { Doc, From 68d1322038dbaf126efae582f06d8cb1f3326802 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:45:40 -0500 Subject: [PATCH 261/428] Remove abs from vscode completion --- vscode/quint-vscode/server/src/complete.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index e823d9660..cbeb7c855 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,7 +219,6 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': - case 'abs': case 'app': return [] } From 699219dd66795c5d14d4bdf4346367430a80e3b3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:51:13 -0500 Subject: [PATCH 262/428] Remove old comment --- quint/src/types/inferrer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 16d26f8c0..481fa206a 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -24,7 +24,6 @@ import { simplify } from './simplification' export type TypeInferenceResult = [Map, Map] -// TODO: Get rid of this class? It is very shallow. What do we need it for? export class TypeInferrer extends ConstraintGeneratorVisitor { constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) From 164ed1d9520c4fdf4215b4d613d48b6b0537710d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 20:11:20 -0500 Subject: [PATCH 263/428] Ensure transformations can't mutate the original object There was some mutation happening via the transformer, which was wreaking havoc on attempts to complete #1298. Apparently it was also somehow leading to incorrect printing of sum type variants. I haven't had time to investigate why, but deep cloning the original object must be safer and it is fixing a blocking problem in ongoing work in #1298. Since the cases in which this causes problems are quite subtle, I havent been able to figure out how to test this directly. --- quint/package-lock.json | 128 ++++++++++++++------------ quint/package.json | 16 +--- quint/src/ir/IRTransformer.ts | 13 +-- quint/test/types/aliasInliner.test.ts | 14 +-- 4 files changed, 89 insertions(+), 82 deletions(-) diff --git a/quint/package-lock.json b/quint/package-lock.json index dd192ef04..026906f79 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -15,6 +15,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -23,6 +24,7 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", "seedrandom": "^3.0.5", "tar": "^6.1.14", @@ -181,9 +183,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -191,11 +193,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -382,14 +384,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -481,9 +483,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -493,23 +495,23 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -518,8 +520,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -537,9 +539,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -822,9 +824,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1073,8 +1075,15 @@ "node_modules/@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/lodash.isequal": { "version": "4.5.8", @@ -1107,9 +1116,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.18.tgz", - "integrity": "sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg==", + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2400,9 +2409,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.682", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", - "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", + "version": "1.4.689", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.689.tgz", + "integrity": "sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2416,18 +2425,18 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", @@ -2435,15 +2444,15 @@ "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", @@ -2456,10 +2465,10 @@ "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.14" }, @@ -6515,6 +6524,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -8533,12 +8547,12 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" diff --git a/quint/package.json b/quint/package.json index 4bee3265d..cda2d27d1 100644 --- a/quint/package.json +++ b/quint/package.json @@ -2,13 +2,7 @@ "name": "@informalsystems/quint", "version": "0.18.3", "description": "Core tool for the Quint specification language", - "keywords": [ - "temporal", - "logic", - "formal", - "specification", - "verification" - ], + "keywords": ["temporal", "logic", "formal", "specification", "verification"], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -35,11 +29,7 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": [ - "README.md", - "dist/**/*", - "test/**/*.ts" - ], + "files": ["README.md", "dist/**/*", "test/**/*.ts"], "engines": { "node": "18 - 20" }, @@ -63,6 +53,8 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", + "lodash.clonedeep": "4.5.0", + "@types/lodash.clonedeep": "4.5.0", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2f3401240..68789e632 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -17,6 +17,7 @@ import * as ir from './quintIr' import * as t from './quintTypes' import { unreachable } from '../util' import { LookupDefinition } from '../names/base' +import cloneDeep from 'lodash.clonedeep' export class IRTransformer { enterModule?: (module: ir.QuintModule) => ir.QuintModule @@ -111,7 +112,7 @@ export class IRTransformer { * @returns the tranformed Quint module */ export function transformModule(transformer: IRTransformer, quintModule: ir.QuintModule): ir.QuintModule { - let newModule = { ...quintModule } + let newModule = cloneDeep(quintModule) if (transformer.enterModule) { newModule = transformer.enterModule(newModule) @@ -136,7 +137,7 @@ export function transformModule(transformer: IRTransformer, quintModule: ir.Quin * @returns the transformed Quint type */ export function transformType(transformer: IRTransformer, type: t.QuintType): t.QuintType { - let newType = { ...type } + let newType = cloneDeep(type) if (transformer.enterType) { newType = transformer.enterType(newType) } @@ -317,7 +318,7 @@ export function transformLookupDefinition(transformer: IRTransformer, lud: Looku * @returns the transformed Quint definition */ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintDeclaration): ir.QuintDeclaration { - let newDecl = { ...decl } + let newDecl = cloneDeep(decl) if (transformer.enterDecl) { newDecl = transformer.enterDecl(newDecl) } @@ -375,7 +376,7 @@ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintD * @returns the transformed Quint definition */ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef): ir.QuintDef { - let newDef = { ...def } + let newDef = cloneDeep(def) if (transformer.enterDef) { newDef = transformer.enterDef(newDef) } @@ -450,7 +451,7 @@ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef * @returns the transformed Quint expression */ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.QuintEx { - let newExpr = { ...expr } + let newExpr = cloneDeep(expr) if (transformer.enterExpr) { newExpr = transformer.enterExpr(newExpr) } @@ -542,7 +543,7 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q * @returns the transformed Quint row */ export function transformRow(transformer: IRTransformer, row: t.Row): t.Row { - let newRow = row + let newRow = cloneDeep(row) if (transformer.enterRow) { newRow = transformer.enterRow(newRow) } diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index 3d57494d1..f7f836b87 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -70,13 +70,13 @@ describe('inlineAliases', () => { const { modules } = inlineModule(quintModule) const expectedModule = dedent(`module A { - | type T1 = (B({}) | C({})) - | val C: (B({}) | C({})) = variant("C", Rec()) - | type T2 = (Some((B({}) | C({}))) | None({})) - | val B: (B({}) | C({})) = variant("B", Rec()) - | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) - | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) - | var x: (Some((B({}) | C({}))) | None({})) + | type T1 = (B | C) + | val C: (B | C) = variant("C", Rec()) + | type T2 = (Some((B | C)) | None) + | val B: (B | C) = variant("B", Rec()) + | def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam)) + | val None: (Some((B | C)) | None) = variant("None", Rec()) + | var x: (Some((B | C)) | None) |}`) assert.deepEqual(moduleToString(modules[0]), expectedModule) From 1ce07b31a0d5a6c484c359424cd0b98981e3b342 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 12:03:46 -0500 Subject: [PATCH 264/428] Use addToResult for updating types This ensures that we only update the `this.types` thru the `addToResult` method, ensuring that any invariants we want to enforce about added types get applied throughout. --- quint/src/types/constraintGenerator.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index aa48e3ec6..97ca160f2 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -356,13 +356,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Apply substitution to environment // FIXME: We have to figure out the scope of the constraints/substitutions // https://github.com/informalsystems/quint/issues/690 - this.types = new Map( - [...this.types.entries()].map(([id, te]) => { - const newType = applySubstitution(this.table, subs, te.type) - const scheme: TypeScheme = this.quantify(newType) - return [id, scheme] - }) - ) + this.types.forEach((oldScheme, id) => { + const newType = applySubstitution(this.table, subs, oldScheme.type) + const newScheme: TypeScheme = this.quantify(newType) + this.addToResults(id, right(newScheme)) + }) return subs }) From 20454f7ed8367c47eec602125beb1f58b6d20abb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 12:37:18 -0500 Subject: [PATCH 265/428] Add method to quantify type defs --- quint/src/types/constraintGenerator.ts | 57 +++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 97ca160f2..05af2da7f 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -12,7 +12,7 @@ * @module */ -import { IRVisitor } from '../ir/IRVisitor' +import { IRVisitor, walkType } from '../ir/IRVisitor' import { QuintApp, QuintAssume, @@ -29,8 +29,9 @@ import { QuintStr, QuintVar, isAnnotatedDef, + QuintTypeAlias, } from '../ir/quintIr' -import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -49,6 +50,7 @@ import { withConstraints, } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' +import { IRTransformer, transformType } from '../ir/IRTransformer' export type SolvingFunctionType = ( _table: LookupTable, @@ -416,6 +418,36 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } + // Converts a type definition into a TypeScheme with all fresh variables, and + // a list of params providing the fresh type variables corresponding to the + // order they are specified in the type declaration. This is binding the type + // parameters of a declared polymorphic type via universal quantification. + // + // E.g., the type definition + // + // type Result[ok, err] = Ok(ok) | Err(err) + // + // Will produce the result + // + // { params: [fresh_ok, fresh_err], + // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) + // } + private quantifyTypeDef(typeDef: QuintTypeAlias): { params: string[]; scheme: TypeScheme } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], scheme: this.quantify(typeDef.type) } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n)!, typeDef.type) + + return { scheme: this.quantify(typeWithFreshVars), params: [...varsMap.values()] } + } + private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { @@ -478,3 +510,24 @@ function checkAnnotationGenerality( return right(subs) } } + +function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { + const transformer = new TypeVariableNameMapper(f) + return transformType(transformer, t) +} + +class TypeVariableNameMapper implements IRTransformer { + private mapper: (_: string) => string + + constructor(f: (_: string) => string) { + this.mapper = f + } + + exitVar(t: QuintVar): QuintVar { + return { ...t, name: this.mapper(t.name) } + } + + exitRow(r: Row): Row { + return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r + } +} From d5b52e585471a24e95406431d23b0747d74e4236 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:07:09 -0500 Subject: [PATCH 266/428] Enable accessing some state --- quint/src/types/constraintGenerator.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 05af2da7f..3ff773d63 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -84,6 +84,8 @@ function validateArity( } // A visitor that collects types and constraints for a module's expressions +// +// NOTE: Assumes all type applications have been resolved by typeApplicationResolution first export class ConstraintGeneratorVisitor implements IRVisitor { // Inject dependency to allow manipulation in unit tests constructor(solvingFunction: SolvingFunctionType, table: LookupTable, types?: Map) { @@ -97,13 +99,13 @@ export class ConstraintGeneratorVisitor implements IRVisitor { protected types: Map = new Map() protected errors: Map = new Map() + protected constraints: Constraint[] = [] + protected freshVarGenerator: FreshVarGenerator + protected table: LookupTable private solvingFunction: SolvingFunctionType - private constraints: Constraint[] = [] private builtinSignatures: Map = getSignatures() - private table: LookupTable - private freshVarGenerator: FreshVarGenerator // Track location descriptions for error tree traces private location: string = '' From f3cad9bd570e128face4cab954a59be6781ded37 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 21:41:05 -0500 Subject: [PATCH 267/428] Polymorphic type declarations are working --- quint/src/FreshVarGenerator.ts | 2 +- quint/src/types/constraintGenerator.ts | 3 +- quint/src/types/inferrer.ts | 14 +- quint/src/types/typeApplicationResolution.ts | 140 +++++++++++++++++++ quint/test/types/inferrer.test.ts | 61 +++++--- 5 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 quint/src/types/typeApplicationResolution.ts diff --git a/quint/src/FreshVarGenerator.ts b/quint/src/FreshVarGenerator.ts index 55db3d18b..672ebcabd 100644 --- a/quint/src/FreshVarGenerator.ts +++ b/quint/src/FreshVarGenerator.ts @@ -16,7 +16,7 @@ export class FreshVarGenerator { private freshVarCounters: Map = new Map() freshVar(prefix: string): string { - const counter = this.freshVarCounters.get(prefix)! ?? 0 + const counter = this.freshVarCounters.get(prefix) ?? 0 this.freshVarCounters.set(prefix, counter + 1) return `${prefix}${counter}` diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3ff773d63..d51e3aff4 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -32,7 +32,7 @@ import { QuintTypeAlias, } from '../ir/quintIr' import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' +import { definitionToString, expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' @@ -51,6 +51,7 @@ import { } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' +import { constraintToString, typeSchemeToString } from './printing' export type SolvingFunctionType = ( _table: LookupTable, diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 481fa206a..752030206 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -21,12 +21,16 @@ import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' import { simplify } from './simplification' +import { TypeApplicationResolver } from './typeApplicationResolution' +import { transformDeclaration, transformLookupDefinition } from '../ir/IRTransformer' export type TypeInferenceResult = [Map, Map] export class TypeInferrer extends ConstraintGeneratorVisitor { + private resolver: TypeApplicationResolver constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) + this.resolver = new TypeApplicationResolver(this.table, this.freshVarGenerator) } /** @@ -38,8 +42,16 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { + this.table.forEach((def, id) => { + // Don't resolve type definitions, since those should keep their original type variable names + // They are our source of truth for all resolutions + if (def.kind !== 'typedef') { + this.table.set(id, transformLookupDefinition(this.resolver, def)) + } + }) declarations.forEach(decl => { - walkDeclaration(this, decl) + const declWithTypeApplicationsResolved = transformDeclaration(this.resolver, decl) + walkDeclaration(this, declWithTypeApplicationsResolved) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts new file mode 100644 index 000000000..4ea7a85c4 --- /dev/null +++ b/quint/src/types/typeApplicationResolution.ts @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Resolution of type application + * + * @author Shon Feder + * + * @module + */ + +import { fail } from 'assert' +import { FreshVarGenerator } from '../FreshVarGenerator' +import { IRTransformer, transformType } from '../ir/IRTransformer' +import { QuintTypeAlias } from '../ir/quintIr' +import { QuintAppType, QuintType, QuintVarType, Row, typeNames } from '../ir/quintTypes' +import { LookupTable } from '../names/base' +import { zip } from '../util' +import { TypeScheme } from './base' +import { Substitutions, applySubstitution } from './substitutions' + +export class TypeApplicationResolver implements IRTransformer { + /** Fresh variable generator, shared with the TypeInferrer */ + freshVarGenerator: FreshVarGenerator + // Lookup table from the parser + table: LookupTable + + constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { + this.table = table + this.freshVarGenerator = freshVarGenerator + } + + exitType(t: QuintType): QuintType { + return this.resolveTypeApplications(t) + } + + // Converts a type definition into a TypeScheme with all fresh variables, and + // a list of params providing the fresh type variables corresponding to the + // order they are specified in the type declaration. This is binding the type + // parameters of a declared polymorphic type via universal quantification. + // + // E.g., the type definition + // + // type Result[ok, err] = Ok(ok) | Err(err) + // + // Will produce the result + // + // { params: [fresh_ok, fresh_err], + // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) + // } + private quantifyTypeDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; scheme: TypeScheme } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], scheme: schemeOfParametricDef([], typeDef.type) } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) + const freshParamNames = [...varsMap.values()] + const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) + + return { scheme: schemeOfParametricDef(freshParamNames, typeWithFreshVars), params } + } + + private resolveTypeApp(t: QuintAppType): QuintType { + const typeDef = this.table.get(t.ctor.id!)! // TODO + if (typeDef.kind !== 'typedef' || !typeDef.type) { + fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) + } + const { params, scheme } = this.quantifyTypeDef(typeDef as QuintTypeAlias) + const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ + kind: 'type', + name: param.name, + value: arg, + })) + const newType = applySubstitution(this.table, subs, scheme.type) + return newType + } + + // Transforms `t` by resolving all the type applications in all its sub-terms + // + // E.g., given + // + // type Foo[a, b] = (a, b) + // type Bar[x, y] = {i: x, j: y} + // + // + // resolveTypeAllication(Foo[a, {f: Bar[int, str]}]) => (a, {f: {i: int, j: str}}) + resolveTypeApplications(t: QuintType): QuintType { + const transformer = new TypeMapper(x => (x.kind === 'app' ? this.resolveTypeApp(x) : x)) + return transformType(transformer, t) + } +} + +function schemeOfParametricDef(param: string[], type: QuintType): TypeScheme { + const typeVariables = new Set([...typeNames(type).typeVariables].filter(name => param.includes(name))) + const rowVariables = new Set([...typeNames(type).rowVariables].filter(name => param.includes(name))) + return { type, typeVariables, rowVariables } +} + +// Map type variable names according to `f` +function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { + const transformer = new TypeVariableNameMapper(f) + return transformType(transformer, t) +} + +class TypeVariableNameMapper implements IRTransformer { + private mapper: (_: string) => string + + constructor(f: (_: string) => string) { + this.mapper = f + } + + exitVarType(t: QuintVarType): QuintVarType { + return { ...t, name: this.mapper(t.name) } + } + + exitRow(r: Row): Row { + return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r + } +} + +class TypeMapper implements IRTransformer { + private mapper: (_: QuintType) => QuintType + + constructor(f: (_: QuintType) => QuintType) { + this.mapper = f + } + + exitType(t: QuintType): QuintType { + return this.mapper(t) + } +} diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 5cf311add..be12dfcf3 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -397,24 +397,49 @@ module B { ) }) - // TODO - // it('checks correct polymorphic types', () => { - // const defs = [ - // 'type Result[ok, err] = Ok(ok) | Err(err)', - // `def result_map(r: Result[a, e], f: a => b): Result[b, e] = - // match r { - // | Ok(x) => Ok(f(x)) - // | Err(_) => r - // }`, - // ] - - // const [errors, table] = inferTypesForDefs(defs) - // assert.sameDeepMembers([...errors.entries()], []) - // assert.sameDeepMembers( - // [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), - // [] - // ) - // }) + it('checks correct polymorphic types', () => { + const defs = [ + 'type Option[a] = Some(a) | None', + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + match r { + | Ok(x) => Ok(f(x)) + | Err(_) => r + }`, + `def option_to_result(o: Option[ok], e: err): Result[ok, err] = + match o { + | Some(x) => Ok(x) + | None => Err(e) + }`, + 'val nested_type_application: Result[Option[int], str] = Ok(Some(42))', + ] + + const [errors, _] = inferTypesForDefs(defs) + assert.sameDeepMembers([...errors.entries()], []) + }) + + it('fails when polymorphic types are not unifiable', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[bool, e]): Result[int, e] = + match r { + | Ok(x) => Ok(x) + | Err(_) => r + }`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedError = `Couldn't unify bool and int +Trying to unify bool and int +Trying to unify { Ok: bool, Err: _t5 } and { Ok: int, Err: _t5 } +Trying to unify (Ok(bool) | Err(_t5)) and (Ok(int) | Err(_t5)) +Trying to unify ((Ok(bool) | Err(_t5))) => (Ok(bool) | Err(_t5)) and ((Ok(bool) | Err(_t5))) => (Ok(int) | Err(_t5)) +` + assert.deepEqual(actualErrors, [expectedError]) + }) it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From 9b45e7bdc9c2fa275aa321404768c64902d438d3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 22:05:56 -0500 Subject: [PATCH 268/428] Cleanup --- quint/src/types/inferrer.ts | 8 +- quint/src/types/typeApplicationResolution.ts | 90 ++++++++++---------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 752030206..1fbfedfd1 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -42,16 +42,18 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { + // Resolve all type applications used in expressions in the lookup table this.table.forEach((def, id) => { // Don't resolve type definitions, since those should keep their original type variable names // They are our source of truth for all resolutions if (def.kind !== 'typedef') { - this.table.set(id, transformLookupDefinition(this.resolver, def)) + const resolvedLookupDef = transformLookupDefinition(this.resolver, def) + this.table.set(id, resolvedLookupDef) } }) declarations.forEach(decl => { - const declWithTypeApplicationsResolved = transformDeclaration(this.resolver, decl) - walkDeclaration(this, declWithTypeApplicationsResolved) + const resolvedDecl = transformDeclaration(this.resolver, decl) + walkDeclaration(this, resolvedDecl) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 4ea7a85c4..6ff453667 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -23,10 +23,10 @@ import { TypeScheme } from './base' import { Substitutions, applySubstitution } from './substitutions' export class TypeApplicationResolver implements IRTransformer { - /** Fresh variable generator, shared with the TypeInferrer */ - freshVarGenerator: FreshVarGenerator + // Fresh variable generator, shared with the TypeInferrer + private freshVarGenerator: FreshVarGenerator // Lookup table from the parser - table: LookupTable + private table: LookupTable constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { this.table = table @@ -37,36 +37,18 @@ export class TypeApplicationResolver implements IRTransformer { return this.resolveTypeApplications(t) } - // Converts a type definition into a TypeScheme with all fresh variables, and - // a list of params providing the fresh type variables corresponding to the - // order they are specified in the type declaration. This is binding the type - // parameters of a declared polymorphic type via universal quantification. + // Transforms `t` by resolving all the type applications in all its sub-terms // - // E.g., the type definition + // E.g., given // - // type Result[ok, err] = Ok(ok) | Err(err) + // type Foo[a, b] = (a, b) + // type Bar[x, y] = {i: x, j: y} // - // Will produce the result // - // { params: [fresh_ok, fresh_err], - // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) - // } - private quantifyTypeDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; scheme: TypeScheme } { - if (!typeDef.params || typeDef.params.length === 0) { - return { params: [], scheme: schemeOfParametricDef([], typeDef.type) } - } - - // Coordinates parameter names with their corresponding fresh variables - const varsMap: Map = new Map( - typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) - ) - - // Parsing guarantees that every variable in a type def is in the params - const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) - const freshParamNames = [...varsMap.values()] - const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) - - return { scheme: schemeOfParametricDef(freshParamNames, typeWithFreshVars), params } + // resolveTypeAllications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + resolveTypeApplications(t: QuintType): QuintType { + const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) + return mapType(f, t) } private resolveTypeApp(t: QuintAppType): QuintType { @@ -74,35 +56,47 @@ export class TypeApplicationResolver implements IRTransformer { if (typeDef.kind !== 'typedef' || !typeDef.type) { fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) } - const { params, scheme } = this.quantifyTypeDef(typeDef as QuintTypeAlias) + const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', name: param.name, value: arg, })) - const newType = applySubstitution(this.table, subs, scheme.type) + const newType = applySubstitution(this.table, subs, type) return newType } - // Transforms `t` by resolving all the type applications in all its sub-terms + // Given a type definition, extract the type it is defined by (with all type + // parameters replaced with fresh variables) and a list of params giving the + // fresh type variables in the order corresponding to the params they + // replaced in the type declaration. // - // E.g., given + // E.g., the type definition // - // type Foo[a, b] = (a, b) - // type Bar[x, y] = {i: x, j: y} + // type Result[ok, err] = Ok(ok) | Err(err) // + // Will produce the result // - // resolveTypeAllication(Foo[a, {f: Bar[int, str]}]) => (a, {f: {i: int, j: str}}) - resolveTypeApplications(t: QuintType): QuintType { - const transformer = new TypeMapper(x => (x.kind === 'app' ? this.resolveTypeApp(x) : x)) - return transformType(transformer, t) - } -} + // { params: [fresh_ok, fresh_err], + // type: (Ok(fresh_ok) | Err(fresh_err)) + // } + private freshTypeFromDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; type: QuintType } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], type: typeDef.type } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const type = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) + const freshParamNames = [...varsMap.values()] + const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) -function schemeOfParametricDef(param: string[], type: QuintType): TypeScheme { - const typeVariables = new Set([...typeNames(type).typeVariables].filter(name => param.includes(name))) - const rowVariables = new Set([...typeNames(type).rowVariables].filter(name => param.includes(name))) - return { type, typeVariables, rowVariables } + return { type, params } + } } // Map type variable names according to `f` @@ -127,6 +121,12 @@ class TypeVariableNameMapper implements IRTransformer { } } +// Transform `t`, and all its subterms, by `f` +function mapType(f: (_: QuintType) => QuintType, t: QuintType): QuintType { + const transformer = new TypeMapper(f) + return transformType(transformer, t) +} + class TypeMapper implements IRTransformer { private mapper: (_: QuintType) => QuintType From 33c1b7fb3abb0a023ce82b83df411893ff41c209 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 22:28:01 -0500 Subject: [PATCH 269/428] Fix formatting --- quint/src/types/constraintGenerator.ts | 7 +++---- quint/src/types/typeApplicationResolution.ts | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index d51e3aff4..b6c9afc5a 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -12,7 +12,7 @@ * @module */ -import { IRVisitor, walkType } from '../ir/IRVisitor' +import { IRVisitor } from '../ir/IRVisitor' import { QuintApp, QuintAssume, @@ -27,12 +27,12 @@ import { QuintName, QuintOpDef, QuintStr, + QuintTypeAlias, QuintVar, isAnnotatedDef, - QuintTypeAlias, } from '../ir/quintIr' import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { definitionToString, expressionToString, rowToString, typeToString } from '../ir/IRprinting' +import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' @@ -51,7 +51,6 @@ import { } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' -import { constraintToString, typeSchemeToString } from './printing' export type SolvingFunctionType = ( _table: LookupTable, diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 6ff453667..c85f8766c 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -16,10 +16,9 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' import { QuintTypeAlias } from '../ir/quintIr' -import { QuintAppType, QuintType, QuintVarType, Row, typeNames } from '../ir/quintTypes' +import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' -import { TypeScheme } from './base' import { Substitutions, applySubstitution } from './substitutions' export class TypeApplicationResolver implements IRTransformer { From d5d3d5021af5e2070a0765996c4ddc3572bab55f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 23:25:32 -0500 Subject: [PATCH 270/428] Use polymorphic types in option.qnt --- examples/language-features/option.qnt | 36 +++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 871eda916..ae524f1ec 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -1,12 +1,26 @@ module option { // A demonstration of sum types, specifying an option type. - // An option type for int values. - type VoteOption = + // A polymorphic option type + type Option[a] = + | Some(a) | None - | Some(int) - var votes: List[VoteOption] + // `o.optionMap(f)` is `Some(f(v))` if `o = Some(v)` or `None` of `o = None` + def optionMap(o: Option[a], f: a => b): Option[b] = + match o { + | Some(x) => Some(f(x)) + | None => None + } + + // `o.getOr(v)` is `x` or `Some(x) = o` or `v` if `o = None` + def getOr(o: Option[a], default: a): a = + match o { + | Some(x) => x + | None => default + } + + var votes: List[Option[int]] var outcome: int action init = all { @@ -18,22 +32,24 @@ module option { votes' = votes.append(Some(v)) } + action incrVote(i, n) = { + val vote0 = votes[i] + val vote1 = vote0.optionMap(x => x + n) + votes' = votes.replaceAt(i, vote1) + } + action unvote(i) = all { - votes[i] != None, votes' = votes.replaceAt(i, None), } val sumVotes = - votes.foldl(0, (sum, v) => match v { - | Some(n) => sum + n - | None => sum - } - ) + votes.foldl(0, (sum, v) => v.getOr(0) + sum) action step = all { any { nondet v = oneOf(Int); vote(v), nondet i = oneOf(votes.indices()); unvote(i), + nondet i = oneOf(votes.indices()); nondet v = oneOf(Int) incrVote(i, v), }, outcome' = sumVotes } From 12ca582f88095b51ca285a403d37ce9ea4dc4ef5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 23:34:04 -0500 Subject: [PATCH 271/428] Document polymorphic type declarations in lang.md --- doc/lang.md | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index 31c578b99..cc3ef8b01 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -147,31 +147,34 @@ This is the same type system as in Apalache: A type is one of the following: - - Basic type: `bool`, `int`, `str`. +- Basic type: `bool`, `int`, `str`. - - Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. +- Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. - - Type variable (parameter): `a`, ..., `z`. +- Type variable (parameter): `a`, ..., `z`. - - Set: `Set[T]` for a type `T`. +- Set: `Set[T]` for a type `T`. - - List: `List[T]` for a type `T`. +- List: `List[T]` for a type `T`. - - Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. +- Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. - - Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` - for `n >= 1` types `T_1`, ..., `T_n`. +- Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` + for `n >= 1` types `T_1`, ..., `T_n`. - - Function: `T1 -> T2` for types `T1` and `T2`. +- Function: `T1 -> T2` for types `T1` and `T2`. - - Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` - and result type `R`. +- Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` + and result type `R`. - - Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types - `T_1`, ..., `T_n`, and a type alais `T`. +- Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types + `T_1`, ..., `T_n`, and a type alais `T`. - - Type in parentheses: `(T)` for a type `T`. +- Type in parentheses: `(T)` for a type `T`. +- An instance of a defined polymorphic type `T[T_1, ..., T_n]` for a defined type + constructor with type parameters `T[p_1, ..., p_n]` and types `T_1, ..., + T_n`. It is often convenient to declare a type alias. You can use `type` to define an alias inside a module definition. For instance: @@ -180,6 +183,18 @@ an alias inside a module definition. For instance: type Temperature = int ``` +A type alias specified with type parameters defines a polymorphic type +constructor for instances of the defined type. For instance, given + +```bluespec +type Option[a] = + | Some(a) + | None +``` + +You can then construct concrete types such as `Option[int]` or +`Option[List[int]]`. + A type identifier can also introduce an uninterpreted type by defining a type without any constructors for values of that type: ```bluespec From b3aec3f35725d7c382a3a23c274fd7e8363c0cb8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 11:58:58 -0500 Subject: [PATCH 272/428] Clean up dead code --- quint/src/types/constraintGenerator.ts | 54 +------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index b6c9afc5a..4a31fd09c 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -99,12 +99,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { protected types: Map = new Map() protected errors: Map = new Map() - protected constraints: Constraint[] = [] protected freshVarGenerator: FreshVarGenerator protected table: LookupTable + private constraints: Constraint[] = [] private solvingFunction: SolvingFunctionType - private builtinSignatures: Map = getSignatures() // Track location descriptions for error tree traces @@ -420,36 +419,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } - // Converts a type definition into a TypeScheme with all fresh variables, and - // a list of params providing the fresh type variables corresponding to the - // order they are specified in the type declaration. This is binding the type - // parameters of a declared polymorphic type via universal quantification. - // - // E.g., the type definition - // - // type Result[ok, err] = Ok(ok) | Err(err) - // - // Will produce the result - // - // { params: [fresh_ok, fresh_err], - // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) - // } - private quantifyTypeDef(typeDef: QuintTypeAlias): { params: string[]; scheme: TypeScheme } { - if (!typeDef.params || typeDef.params.length === 0) { - return { params: [], scheme: this.quantify(typeDef.type) } - } - - // Coordinates parameter names with their corresponding fresh variables - const varsMap: Map = new Map( - typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) - ) - - // Parsing guarantees that every variable in a type def is in the params - const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n)!, typeDef.type) - - return { scheme: this.quantify(typeWithFreshVars), params: [...varsMap.values()] } - } - private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { @@ -512,24 +481,3 @@ function checkAnnotationGenerality( return right(subs) } } - -function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { - const transformer = new TypeVariableNameMapper(f) - return transformType(transformer, t) -} - -class TypeVariableNameMapper implements IRTransformer { - private mapper: (_: string) => string - - constructor(f: (_: string) => string) { - this.mapper = f - } - - exitVar(t: QuintVar): QuintVar { - return { ...t, name: this.mapper(t.name) } - } - - exitRow(r: Row): Row { - return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r - } -} From 32a48274c55a4d34836cd7be9fd686b7d4a759b8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 13:38:16 -0500 Subject: [PATCH 273/428] Cleanup --- quint/src/types/typeApplicationResolution.ts | 27 ++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index c85f8766c..c84ce9474 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -14,6 +14,7 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' +import { typeToString } from '../ir/IRprinting' import { IRTransformer, transformType } from '../ir/IRTransformer' import { QuintTypeAlias } from '../ir/quintIr' import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' @@ -21,6 +22,7 @@ import { LookupTable } from '../names/base' import { zip } from '../util' import { Substitutions, applySubstitution } from './substitutions' +/** Resolves all type applications in an IR object */ export class TypeApplicationResolver implements IRTransformer { // Fresh variable generator, shared with the TypeInferrer private freshVarGenerator: FreshVarGenerator @@ -44,30 +46,45 @@ export class TypeApplicationResolver implements IRTransformer { // type Bar[x, y] = {i: x, j: y} // // - // resolveTypeAllications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + // resolveTypeApplications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) resolveTypeApplications(t: QuintType): QuintType { const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) return mapType(f, t) } private resolveTypeApp(t: QuintAppType): QuintType { - const typeDef = this.table.get(t.ctor.id!)! // TODO + if (!t.ctor.id) { + // This should be ensured by parsing + fail( + `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` + ) + } + + const typeDef = this.table.get(t.ctor.id) + if (!typeDef) { + // This should be ensured by name resolution + fail(`invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) + } + if (typeDef.kind !== 'typedef' || !typeDef.type) { + // This should be ensured by the grammar and by name resolution fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) } + const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) + + // Substitute the type `args` for each corresponding fresh variable const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', name: param.name, value: arg, })) - const newType = applySubstitution(this.table, subs, type) - return newType + return applySubstitution(this.table, subs, type) } // Given a type definition, extract the type it is defined by (with all type // parameters replaced with fresh variables) and a list of params giving the - // fresh type variables in the order corresponding to the params they + // fresh type variables in the order corresponding to the params they // replaced in the type declaration. // // E.g., the type definition From 2707ec1042d992bee723cf08ebaf960f292ca6aa Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 13:54:50 -0500 Subject: [PATCH 274/428] Update changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2960af69a..9534e7ca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added polymorphic type declarations, allowing abstracting commonly used data + types like `Option[a]` and `Result[err, ok]`. Note that this is not yet + supported by `verify`. (#1298) + ### Changed + +- The latest supported node version is now bounded at <= 20, which covers the + latest LTS. (#1380) + ### Deprecated ### Removed ### Fixed + +- Removed a dependency causing deprecation errors messages to be emitted. + (#1380) + ### Security ## v0.18.3 -- 2024-02-08 From 502008853381b0d3e92329532582b0b6c9ba2b73 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 14:10:32 -0500 Subject: [PATCH 275/428] Update the examples --- examples/.scripts/run-example.sh | 2 ++ examples/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index aacd34f45..4fdbea46b 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -60,6 +60,8 @@ result () { printf "https://github.com/informalsystems/quint/issues/1284" elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then printf "https://github.com/informalsystems/quint/issues/1299" + elif [[ "$file" == "language-features/option.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1391" fi fi } diff --git a/examples/README.md b/examples/README.md index 5cd3b2523..a51536d54 100644 --- a/examples/README.md +++ b/examples/README.md @@ -86,7 +86,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1391 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 3816c25e0172ced6bde5f4ebb71851786cf9c2e8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 15:52:14 -0500 Subject: [PATCH 276/428] Make option.qnt runnable --- examples/language-features/option.qnt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index ae524f1ec..23e822872 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -47,9 +47,16 @@ module option { action step = all { any { - nondet v = oneOf(Int); vote(v), - nondet i = oneOf(votes.indices()); unvote(i), - nondet i = oneOf(votes.indices()); nondet v = oneOf(Int) incrVote(i, v), + nondet v = oneOf(0.to(5)); vote(v), + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); unvote(i), + }, + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); nondet v = oneOf(0.to(5)) incrVote(i, v), + } + }, outcome' = sumVotes } From 420f295df266fe009399c821e5366f3e9435f18e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 16:05:10 -0500 Subject: [PATCH 277/428] Fix lints --- quint/src/types/constraintGenerator.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 4a31fd09c..3f19dd1fb 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -27,11 +27,10 @@ import { QuintName, QuintOpDef, QuintStr, - QuintTypeAlias, QuintVar, isAnnotatedDef, } from '../ir/quintIr' -import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -50,7 +49,6 @@ import { withConstraints, } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' -import { IRTransformer, transformType } from '../ir/IRTransformer' export type SolvingFunctionType = ( _table: LookupTable, From 06c24e76e1cf32acea762f7a523eb33719b9dac2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 1 Mar 2024 18:16:36 -0300 Subject: [PATCH 278/428] Resolve type applications at the IR level --- quint/src/quintAnalyzer.ts | 17 ++++++++++---- quint/src/types/inferrer.ts | 17 ++------------ quint/src/types/typeApplicationResolution.ts | 24 ++++++++++++++------ 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index e7bc4b7c9..beace6c1f 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -22,6 +22,7 @@ import { ModeChecker } from './effects/modeChecker' import { QuintError } from './quintError' import { errorTreeToString } from './errorTree' import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker' +import { TypeApplicationResolver } from './types/typeApplicationResolution' /* Products from static analysis */ export type AnalysisOutput = { @@ -42,7 +43,7 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) - quintModules.map(m => analyzer.analyzeDeclarations(m.declarations)) + quintModules.forEach(m => (m.declarations = analyzer.analyzeDeclarations(m.declarations))) return analyzer.getResult() } @@ -75,6 +76,7 @@ export function analyzeInc( * @param previousOutput - The previous analysis output to be used as a starting point. */ class QuintAnalyzer { + private typeApplicationResolver: TypeApplicationResolver private effectInferrer: EffectInferrer private typeInferrer: TypeInferrer private modeChecker: ModeChecker @@ -84,17 +86,20 @@ class QuintAnalyzer { private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } constructor(lookupTable: LookupTable, previousOutput?: AnalysisOutput) { + this.typeApplicationResolver = new TypeApplicationResolver(lookupTable) this.typeInferrer = new TypeInferrer(lookupTable, previousOutput?.types) this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) } - analyzeDeclarations(decls: QuintDeclaration[]): void { - const [typeErrMap, types] = this.typeInferrer.inferTypes(decls) - const [effectErrMap, effects] = this.effectInferrer.inferEffects(decls) + analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { + const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + + const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) + const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) - const [modeErrMap, modes] = this.modeChecker.checkModes(decls, effects) + const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap] @@ -114,6 +119,8 @@ class QuintAnalyzer { effects: new Map([...this.output.effects, ...effects]), modes: new Map([...this.output.modes, ...modes]), } + + return resolvedDecls } getResult(): AnalysisResult { diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 1fbfedfd1..a0f349552 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -16,21 +16,17 @@ import { ErrorTree } from '../errorTree' import { walkDeclaration } from '../ir/IRVisitor' import { LookupTable } from '../names/base' -import { QuintDeclaration } from '../ir/quintIr' +import { QuintDeclaration, isDef } from '../ir/quintIr' import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' import { simplify } from './simplification' -import { TypeApplicationResolver } from './typeApplicationResolution' -import { transformDeclaration, transformLookupDefinition } from '../ir/IRTransformer' export type TypeInferenceResult = [Map, Map] export class TypeInferrer extends ConstraintGeneratorVisitor { - private resolver: TypeApplicationResolver constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) - this.resolver = new TypeApplicationResolver(this.table, this.freshVarGenerator) } /** @@ -43,17 +39,8 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { // Resolve all type applications used in expressions in the lookup table - this.table.forEach((def, id) => { - // Don't resolve type definitions, since those should keep their original type variable names - // They are our source of truth for all resolutions - if (def.kind !== 'typedef') { - const resolvedLookupDef = transformLookupDefinition(this.resolver, def) - this.table.set(id, resolvedLookupDef) - } - }) declarations.forEach(decl => { - const resolvedDecl = transformDeclaration(this.resolver, decl) - walkDeclaration(this, resolvedDecl) + walkDeclaration(this, decl) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index c84ce9474..a20d0a975 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -14,9 +14,10 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' + import { typeToString } from '../ir/IRprinting' -import { IRTransformer, transformType } from '../ir/IRTransformer' -import { QuintTypeAlias } from '../ir/quintIr' +import { IRTransformer, transformDeclaration, transformLookupDefinition, transformType } from '../ir/IRTransformer' +import { QuintDeclaration, QuintTypeAlias } from '../ir/quintIr' import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' @@ -29,13 +30,22 @@ export class TypeApplicationResolver implements IRTransformer { // Lookup table from the parser private table: LookupTable - constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { + constructor(table: LookupTable) { this.table = table - this.freshVarGenerator = freshVarGenerator + this.freshVarGenerator = new FreshVarGenerator() + + this.table.forEach((def, id) => { + const resolvedLookupDef = transformLookupDefinition(this, def) + this.table.set(id, resolvedLookupDef) + }) + } + + resolveTypeApplications(decls: QuintDeclaration[]): QuintDeclaration[] { + return decls.map(decl => transformDeclaration(this, decl)) } exitType(t: QuintType): QuintType { - return this.resolveTypeApplications(t) + return this.resolveTypeApplicationsForType(t) } // Transforms `t` by resolving all the type applications in all its sub-terms @@ -46,8 +56,8 @@ export class TypeApplicationResolver implements IRTransformer { // type Bar[x, y] = {i: x, j: y} // // - // resolveTypeApplications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) - resolveTypeApplications(t: QuintType): QuintType { + // resolveTypeApplicationsForType(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + private resolveTypeApplicationsForType(t: QuintType): QuintType { const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) return mapType(f, t) } From 44ad95176dda6a01f1703c3886815cf50f6db2b2 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 22:36:48 -0500 Subject: [PATCH 279/428] Add regression test for 1391 --- quint/test/flattening/fullFlattener.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/quint/test/flattening/fullFlattener.test.ts b/quint/test/flattening/fullFlattener.test.ts index f55422999..6dc0c8c39 100644 --- a/quint/test/flattening/fullFlattener.test.ts +++ b/quint/test/flattening/fullFlattener.test.ts @@ -235,4 +235,19 @@ describe('flattenModules', () => { assertFlattenedModule(text) }) + + // Regression test for https://github.com/informalsystems/quint/issues/1391 + describe('can flatten with polymorphic types between different modules (#802)', () => { + const text = `module A { + type Foo[a] = F(a) + def mapFoo(x: Foo[a], f: a => b): Foo[b] = match x { F(v) => F(f(v)) } + } + + module B { + import A.* + val b: Foo[int] = F("one").mapFoo(_ => 1) + }` + + assertFlattenedModule(text) + }) }) From be70a9ed41ca1294e5022e9a1fda8acc5b758b06 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:08:40 -0500 Subject: [PATCH 280/428] Resolve type apps in type inference tests --- quint/test/types/inferrer.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index be12dfcf3..1a1e20976 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -4,6 +4,7 @@ import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +import { TypeApplicationResolver } from '../../src/types/typeApplicationResolution' // Utility used to print update `stringType` values to make // updating the expected values in the following tests less @@ -16,9 +17,12 @@ function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { - const { modules, table } = parseMockedModule(text) + const { modules: parsedModules, table } = parseMockedModule(text) + // Type inference assumes all type applications (e.g., `Foo[int, str]`) have been resolved. + const resolver = new TypeApplicationResolver(table) const inferrer = new TypeInferrer(table) + const modules = parsedModules.map(m => ({ ...m, declarations: resolver.resolveTypeApplications(m.declarations) })) return inferrer.inferTypes(modules.flatMap(m => m.declarations)) } From bdabe6433e6f4dfc954e29d91374608bab6ddda1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:08:56 -0500 Subject: [PATCH 281/428] Warn about mutations --- quint/src/quintAnalyzer.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index beace6c1f..970c7bfc8 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -37,12 +37,16 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] /** * Analyzes multiple Quint modules and returns the analysis result. * + * NOTE: This is modifies the `lookupTable` and the `quintModules`! + * See XXX for the mutation sites. + * * @param lookupTable - The lookup tables for the modules. * @param quintModules - The Quint modules to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) + // XXX: the modules are mutated here. quintModules.forEach(m => (m.declarations = analyzer.analyzeDeclarations(m.declarations))) return analyzer.getResult() } @@ -50,6 +54,9 @@ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModu /** * Analyzes declarations incrementally and returns the analysis result. * + * NOTE: This is modifies the `lookupTable`! + * See XXX for the mutation sites. + * * @param analysisOutput - The previous analysis output to be used as a starting point. * @param lookupTable - The lookup tables for the modules. * @param declarations - The Quint declarations to be analyzed. @@ -86,6 +93,7 @@ class QuintAnalyzer { private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } constructor(lookupTable: LookupTable, previousOutput?: AnalysisOutput) { + // XXX: the lookUp table is mutated when TypeApplicationResolver is instantiated this.typeApplicationResolver = new TypeApplicationResolver(lookupTable) this.typeInferrer = new TypeInferrer(lookupTable, previousOutput?.types) this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) @@ -96,6 +104,7 @@ class QuintAnalyzer { analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + // XXX: the lookUp table is mutated during type inference const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) From 3f7f1d9ae5a55bdbb0bca7eab85a98efcad8bbec Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:53:22 -0500 Subject: [PATCH 282/428] Add error handling for invaild type applications Closes #1390 --- quint/src/quintAnalyzer.ts | 4 +- quint/src/types/typeApplicationResolution.ts | 54 +++++++++++++------- quint/test/types/inferrer.test.ts | 40 +++++++++++++-- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 970c7bfc8..32cd723c8 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -102,7 +102,7 @@ class QuintAnalyzer { } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { - const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + const [typAppErrMap, resolvedDecls] = this.typeApplicationResolver.resolveTypeApplications(decls) // XXX: the lookUp table is mutated during type inference const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) @@ -110,7 +110,7 @@ class QuintAnalyzer { const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) - const errorTrees = [...typeErrMap, ...effectErrMap] + const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] // TODO: Type and effect checking should return QuintErrors instead of error trees this.errors.push( diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index a20d0a975..9f62ec4a3 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -12,7 +12,7 @@ * @module */ -import { fail } from 'assert' +import { buildErrorLeaf, buildErrorTree, ErrorTree } from '../errorTree' import { FreshVarGenerator } from '../FreshVarGenerator' import { typeToString } from '../ir/IRprinting' @@ -22,9 +22,12 @@ import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' import { Substitutions, applySubstitution } from './substitutions' +import assert from 'assert' /** Resolves all type applications in an IR object */ export class TypeApplicationResolver implements IRTransformer { + // Errors found during type application resolution + private errors: Map = new Map() // Fresh variable generator, shared with the TypeInferrer private freshVarGenerator: FreshVarGenerator // Lookup table from the parser @@ -40,8 +43,10 @@ export class TypeApplicationResolver implements IRTransformer { }) } - resolveTypeApplications(decls: QuintDeclaration[]): QuintDeclaration[] { - return decls.map(decl => transformDeclaration(this, decl)) + resolveTypeApplications(decls: QuintDeclaration[]): [Map, QuintDeclaration[]] { + const resolvedDecls = decls.map(decl => transformDeclaration(this, decl)) + const errors = this.errors + return [errors, resolvedDecls] } exitType(t: QuintType): QuintType { @@ -63,26 +68,39 @@ export class TypeApplicationResolver implements IRTransformer { } private resolveTypeApp(t: QuintAppType): QuintType { - if (!t.ctor.id) { - // This should be ensured by parsing - fail( - `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` - ) - } + // Ensured by parsing + assert(t.id, `invalid IR node: type application ${typeToString(t)} has no id`) + // Ensured by parsing + assert( + t.ctor.id, + `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` + ) const typeDef = this.table.get(t.ctor.id) - if (!typeDef) { - // This should be ensured by name resolution - fail(`invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) - } - - if (typeDef.kind !== 'typedef' || !typeDef.type) { - // This should be ensured by the grammar and by name resolution - fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) - } + // Ensured by name resolution + assert(typeDef, `invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) + // Ensured by the grammar and by name resolution + assert( + typeDef.kind === 'typedef' && typeDef.type, + `invalid kind looked up for constructor of type application with id ${t.ctor.id} ` + ) const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) + // NOTE: Early exit on error + // Check for arity mismatch in type application + if (params.length !== t.args.length) { + const ctorMsg = typeToString(t.ctor) + const typeArgsMsg = t.args.map(typeToString).join(', ') + const manyOrFew = params.length > t.args.length ? 'few' : 'many' + const err = buildErrorLeaf( + `applying type constructor ${ctorMsg} to arguments ${typeArgsMsg}`, + `too ${manyOrFew} arguments supplied: ${ctorMsg} only accepts ${params.length} parameters` + ) + this.errors.set(t.id, err) + return t + } + // Substitute the type `args` for each corresponding fresh variable const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 1a1e20976..a3471cf5d 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,7 +2,7 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { errorTreeToString } from '../../src/errorTree' +import { ErrorTree, errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' import { TypeApplicationResolver } from '../../src/types/typeApplicationResolution' @@ -22,8 +22,17 @@ describe('inferTypes', () => { // Type inference assumes all type applications (e.g., `Foo[int, str]`) have been resolved. const resolver = new TypeApplicationResolver(table) const inferrer = new TypeInferrer(table) - const modules = parsedModules.map(m => ({ ...m, declarations: resolver.resolveTypeApplications(m.declarations) })) - return inferrer.inferTypes(modules.flatMap(m => m.declarations)) + + // Used to collect errors found during type application + let typeAppErrs: Map = new Map() + const modules = parsedModules.map(m => { + const [errs, declarations] = resolver.resolveTypeApplications(m.declarations) + typeAppErrs = new Map([...typeAppErrs, ...errs]) + return { ...m, declarations } + }) + const [inferenceErrors, inferenceSchemes] = inferrer.inferTypes(modules.flatMap(m => m.declarations)) + const combinedErrors = new Map([...inferenceErrors, ...typeAppErrs]) + return [combinedErrors, inferenceSchemes] } function inferTypesForDefs(defs: string[]): TypeInferenceResult { @@ -445,6 +454,31 @@ Trying to unify ((Ok(bool) | Err(_t5))) => (Ok(bool) | Err(_t5)) and ((Ok(bool) assert.deepEqual(actualErrors, [expectedError]) }) + it('errors when polymorphic types are applied to invalid numbers of arguments', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `val too_many: Result[a, b, c] = Ok(1)`, + `val too_few: Result[a] = Ok(1)`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedErrors = [ + `Couldn't unify sum and app +Trying to unify (Ok(int) | Err(_t3)) and Result[a, b, c] +`, + `too many arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a, b, c +`, + `too few arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a +`, + ] + assert.deepEqual(actualErrors, expectedErrors) + }) + it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From 07fbfd0e545037aa685713c755c7f5d4d23d8352 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Sat, 2 Mar 2024 00:07:42 -0500 Subject: [PATCH 283/428] Fix lints --- quint/src/types/inferrer.ts | 2 +- quint/src/types/typeApplicationResolution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index a0f349552..f1bb378a9 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -16,7 +16,7 @@ import { ErrorTree } from '../errorTree' import { walkDeclaration } from '../ir/IRVisitor' import { LookupTable } from '../names/base' -import { QuintDeclaration, isDef } from '../ir/quintIr' +import { QuintDeclaration } from '../ir/quintIr' import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 9f62ec4a3..7dd83d45e 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -12,7 +12,7 @@ * @module */ -import { buildErrorLeaf, buildErrorTree, ErrorTree } from '../errorTree' +import { ErrorTree, buildErrorLeaf } from '../errorTree' import { FreshVarGenerator } from '../FreshVarGenerator' import { typeToString } from '../ir/IRprinting' From 862ee0aaac27e48a881b968a9c812a47759f4892 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Sat, 2 Mar 2024 00:13:18 -0500 Subject: [PATCH 284/428] Update examples --- examples/.scripts/run-example.sh | 2 +- examples/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 4fdbea46b..e64273133 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -61,7 +61,7 @@ result () { elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then printf "https://github.com/informalsystems/quint/issues/1299" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1391" + printf "https://github.com/informalsystems/quint/issues/1393" fi fi } diff --git a/examples/README.md b/examples/README.md index a51536d54..cf82deffe 100644 --- a/examples/README.md +++ b/examples/README.md @@ -86,7 +86,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1391 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1393 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From df21b96a42e636038787763a370ba8d7b40afc62 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 09:49:26 -0300 Subject: [PATCH 285/428] Track depth of lambda params --- quint/src/ir/IRVisitor.ts | 6 ++++++ quint/src/names/resolver.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index f321ef8df..b7b4195a5 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -444,6 +444,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { break } case 'lambda': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLambda) { visitor.enterLambda(expr) } @@ -457,6 +460,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.exitLambda) { visitor.exitLambda(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break case 'let': if (visitor.enterLet) { diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 826c51efe..edad7f581 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -88,7 +88,7 @@ class NameResolver implements IRVisitor { enterLambda(expr: QuintLambda): void { // Lambda parameters are scoped, so they are collected here expr.params.forEach(p => { - this.collector.collectDefinition({ ...p, kind: 'param' }) + this.collector.collectDefinition({ ...p, kind: 'param', depth: this.definitionDepth }) }) } From 31085e1c47abffe86e357616bf3f75d795c4c9bd Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:06:29 -0300 Subject: [PATCH 286/428] Allow shadowing by keeping a list of definitions in the `definitionsByName` map --- quint/src/names/base.ts | 19 +++- quint/src/names/collector.ts | 100 +++++++++++++----- quint/src/names/resolver.ts | 4 +- quint/test/names/collector.test.ts | 50 ++++----- quint/test/names/resolver.test.ts | 25 ++++- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1012unknownType.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1016nonConstOverride.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- quint/testFixture/_1040compileError.json | 2 +- quint/testFixture/_1041compileConst.json | 2 +- .../_1042qualifiersInRecordsFieldsError.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 23 files changed, 153 insertions(+), 81 deletions(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 6e8e2071e..e34415dc5 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -12,6 +12,7 @@ * @module */ +import { cloneDeep, compact } from 'lodash' import { QuintDef, QuintExport, QuintImport, QuintInstance, QuintLambdaParameter } from '../ir/quintIr' import { QuintType } from '../ir/quintTypes' import { QuintError } from '../quintError' @@ -49,7 +50,7 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam /** * A module's definitions, indexed by name. */ -export type DefinitionsByName = Map +export type DefinitionsByName = Map /** * Definitions for each module @@ -83,6 +84,10 @@ export type NameResolutionResult = { errors: QuintError[] } +export function getTopLevelDef(defs: DefinitionsByName, name: string): LookupDefinition | undefined { + return defs.get(name)?.at(0) +} + /** * Copy the names of a definitions table to a new one, ignoring hidden * definitions, and optionally adding a namespace. @@ -100,11 +105,15 @@ export function copyNames( ): DefinitionsByName { const table = new Map() - originTable.forEach((def, identifier) => { + originTable.forEach((defs, identifier) => { const name = namespace ? [namespace, identifier].join('::') : identifier - if (!def.hidden || def.kind === 'const') { - table.set(name, copyAsHidden ? { ...def, hidden: copyAsHidden } : def) - } + const newDefs = defs.map(def => { + if (!def.hidden || def.kind === 'const') { + return cloneDeep(copyAsHidden ? { ...def, hidden: copyAsHidden } : def) + } + }) + + table.set(name, compact(newDefs)) }) return table diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index 52e8dc054..86918a9cc 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -34,6 +34,7 @@ import { addNamespacesToDef, builtinNames, copyNames, + getTopLevelDef, } from './base' import { moduleNotFoundError, @@ -42,7 +43,7 @@ import { paramNotFoundError, selfReferenceError, } from './importErrors' -import { compact } from 'lodash' +import { cloneDeep, compact } from 'lodash' /** * Collects all top-level definitions in Quint modules. Used internally by @@ -118,7 +119,7 @@ export class NameCollector implements IRVisitor { return } - const instanceTable = new Map([...moduleTable.entries()]) + const instanceTable = cloneDeep(moduleTable) if (decl.qualifiedName) { // Add the qualifier to `definitionsMyModule` map with a copy of the // definitions, so if there is an export of that qualifier, we know which @@ -129,7 +130,8 @@ export class NameCollector implements IRVisitor { // For each override, check if the name exists in the instantiated module and is a constant. // If so, update the value definition to point to the expression being overriden decl.overrides.forEach(([param, ex]) => { - const constDef = instanceTable.get(param.name) + // Constants are always top-level + const constDef = getTopLevelDef(instanceTable, param.name) if (!constDef) { this.errors.push(paramNotFoundError(decl, param)) @@ -142,13 +144,14 @@ export class NameCollector implements IRVisitor { } // Update the definition to point to the expression being overriden - instanceTable.set(param.name, { ...constDef, id: ex.id }) + constDef.id = ex.id + constDef.hidden = false }) // All names from the instanced module should be acessible with the instance namespace // So, copy them to the current module's lookup table const newDefs = copyNames(instanceTable, decl.qualifiedName, true) - this.collectDefinitions(newDefs, decl) + this.collectTopLevelDefinitions(newDefs, decl) } enterImport(decl: QuintImport): void { @@ -158,7 +161,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Importing non-existing module @@ -178,12 +181,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Imports all definitions - this.collectDefinitions(importableDefinitions, decl) + this.collectTopLevelDefinitions(importableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = importableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(importableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) return @@ -203,7 +206,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Exporting non-existing module this.errors.push(moduleNotFoundError(decl)) @@ -214,12 +217,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Export all definitions - this.collectDefinitions(exportableDefinitions, decl) + this.collectTopLevelDefinitions(exportableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = exportableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(exportableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) @@ -257,14 +260,36 @@ export class NameCollector implements IRVisitor { return } - if (this.definitionsByName.has(identifier) && this.definitionsByName.get(identifier)!.id != def.id) { - // Conflict with a previous definition - this.recordConflict(identifier, this.definitionsByName.get(identifier)!.id, source) + def.depth ??= 0 + const namespaces = importedFrom ? this.namespaces(importedFrom) : [] + + if (!this.definitionsByName.has(identifier)) { + // No existing defs with this name. Create an entry with a single def. + this.definitionsByName.set(identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]) return } - const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - this.definitionsByName.set(identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }) + // Else: There are exiting defs. We need to check for conflicts + const existingEntries = this.definitionsByName.get(identifier)! + // Entries conflict if they have different ids, but the same depth. + // Entries with different depths are ok, because one is shadowing the + // other. + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id && entry.depth === def.depth) + + // Record potential errors and move on + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, source) + }) + + // Keep entries with different ids. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + this.definitionsByName.set( + identifier, + existingEntries + .filter(entry => entry.id !== def.id) + .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }]) + ) } /** @@ -273,11 +298,12 @@ export class NameCollector implements IRVisitor { * @param identifier - The identifier of the definition to delete. */ deleteDefinition(identifier: string): void { - this.definitionsByName.delete(identifier) + this.definitionsByName.get(identifier)?.pop() + return } /** - * Obtains a collected definition. + * Gets the definition with the given name, in the current (visiting) scope * * @param identifier - The identifier of the definition to retrieve. * @@ -285,7 +311,12 @@ export class NameCollector implements IRVisitor { * definitions with that identifier was never collected. */ getDefinition(identifier: string): LookupDefinition | undefined { - return this.definitionsByName.get(identifier) + const defs = this.definitionsByName.get(identifier) + if (defs === undefined || defs.length === 0) { + return + } + + return defs[defs.length - 1] } private namespaces(decl: QuintImport | QuintInstance | QuintExport): string[] { @@ -297,18 +328,33 @@ export class NameCollector implements IRVisitor { return namespace ? [namespace] : [] } - private collectDefinitions( + private collectTopLevelDefinitions( newDefs: DefinitionsByName, importedFrom?: QuintImport | QuintExport | QuintInstance ): void { const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - const newEntries: [string, LookupDefinition][] = [...newDefs.entries()].map(([identifier, def]) => { - const existingEntry = this.definitionsByName.get(identifier) - if (existingEntry && existingEntry.id !== def.id) { - this.recordConflict(identifier, existingEntry.id, def.id) - } - return [identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }] - }) + const newEntries: [string, LookupDefinition[]][] = compact( + [...newDefs.keys()].map(identifier => { + const def = getTopLevelDef(newDefs, identifier) + if (!def) { + return + } + + const existingEntries = this.definitionsByName.get(identifier) + if (existingEntries) { + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id) + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, def.id) + }) + + // Keep conflicting entries and add the new one. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + return [identifier, conflictingEntries.concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }])] + } + return [identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]] + }) + ) this.definitionsByName = new Map([...this.definitionsByName.entries(), ...newEntries]) } diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index edad7f581..777c457a1 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -58,8 +58,8 @@ class NameResolver implements IRVisitor { unusedDefinitions: UnusedDefinitions = moduleName => { const definitions: LookupDefinition[] = Array.from( this.collector.definitionsByModule.get(moduleName)?.values() || [] - ) - const usedDefinitions = [...this.table.values()] + ).flat() + const usedDefinitions = [...this.table.values()].flat() return new Set(difference(definitions, usedDefinitions)) } diff --git a/quint/test/names/collector.test.ts b/quint/test/names/collector.test.ts index 40fc688dc..16e014675 100644 --- a/quint/test/names/collector.test.ts +++ b/quint/test/names/collector.test.ts @@ -4,7 +4,7 @@ import { buildModuleWithDecls } from '../builders/ir' import { QuintError, QuintModule } from '../../src' import { NameCollector } from '../../src/names/collector' import { walkModule } from '../../src/ir/IRVisitor' -import { DefinitionsByName } from '../../src/names/base' +import { DefinitionsByName, getTopLevelDef } from '../../src/names/base' import { zerog } from '../../src/idGenerator' describe('NameCollector', () => { @@ -31,8 +31,8 @@ describe('NameCollector', () => { assert.deepInclude([...definitions.keys()], 'a') assert.notDeepInclude([...definitions.keys()], 'b') - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) }) it('imports all definitions', () => { @@ -51,7 +51,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('test_module::a') + const def = getTopLevelDef(definitions, 'test_module::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -63,7 +63,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('my_import::a') + const def = getTopLevelDef(definitions, 'my_import::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -81,8 +81,8 @@ describe('NameCollector', () => { assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::c1', 'test_module_instance::c2']) assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::T']) - assert.deepEqual(definitions.get('test_module_instance::a')?.importedFrom?.kind, 'instance') - assert.deepEqual(definitions.get('test_module_instance::a')?.namespaces ?? [], [ + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.importedFrom?.kind, 'instance') + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.namespaces ?? [], [ 'test_module_instance', 'wrapper', ]) @@ -114,7 +114,7 @@ describe('NameCollector', () => { zerog ) - const [errors, _definitions] = collect(quintModule) + const [errors, definitions] = collect(quintModule) assert.sameDeepMembers(errors, [ { @@ -124,6 +124,8 @@ describe('NameCollector', () => { data: {}, }, ]) + + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.kind, 'def') }) it('fails importing itself', () => { @@ -148,8 +150,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports previously imported definitions', () => { @@ -158,8 +160,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports imported definitions that were previously qualified', () => { @@ -168,8 +170,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports specific definitions', () => { @@ -179,9 +181,9 @@ describe('NameCollector', () => { assert.isEmpty(errors) // a is not hidden anymore - assert.isNotTrue(definitions.get('a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) // T is still hidden - assert.isTrue(definitions.get('T')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports definitions with qualifier', () => { @@ -194,8 +196,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('my_export::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'my_export::a')!.hidden) }) it('exports definitions with namespace', () => { @@ -205,14 +207,14 @@ describe('NameCollector', () => { assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('test_module::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'test_module::a')!.hidden) - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('test_module::a')?.importedFrom?.kind, 'export') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.importedFrom?.kind, 'export') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) - assert.deepEqual(definitions.get('test_module::a')?.namespaces ?? [], ['test_module']) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.namespaces ?? [], ['test_module']) }) it('fails exporting unexisting definition', () => { diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index bf75af9b3..d0d502ee1 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -4,7 +4,7 @@ import { assert } from 'chai' import { NameResolutionResult } from '../../src/names/base' import { resolveNames } from '../../src/names/resolver' import { buildModule, buildModuleWithDecls } from '../builders/ir' -import { zerog } from '../../src/idGenerator' +import { IdGenerator, newIdGenerator, zerog } from '../../src/idGenerator' describe('resolveNames', () => { const baseDefs = [ @@ -13,14 +13,16 @@ describe('resolveNames', () => { 'type MY_TYPE = int', ] - function resolveNamesForExprs(exprs: string[]): NameResolutionResult { - const module = buildModule(baseDefs, exprs, undefined, zerog) + function resolveNamesForExprs(exprs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModule(baseDefs, exprs, undefined, idGen) return resolveNames([module]) } - function resolveNamesForDefs(defs: string[]): NameResolutionResult { - const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, zerog) + function resolveNamesForDefs(defs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, idGen) return resolveNames([module]) } @@ -82,6 +84,19 @@ describe('resolveNames', () => { }) }) + describe('shadowing', () => { + it('resolves shadowed names', () => { + const result = resolveNamesForDefs( + ['val shadowing = def foo = (shadowing) => shadowing { foo(1) }', 'val a = shadowing'], + newIdGenerator() + ) + + assert.isEmpty(result.errors) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'def')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'param')) + }) + }) + describe('type aliases', () => { it('resolves defined aliases', () => { const result = resolveNamesForDefs(['const a: MY_TYPE', 'var b: a -> Set[a]']) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 134bbd828..6e84ef117 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"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":218,"kind":"int"},"id":219},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"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":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"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},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"78":{"id":77,"name":"__RectangleParam","kind":"param"},"84":{"id":83,"name":"__DogParam","kind":"param"},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"157":{"id":156,"name":"x","kind":"param"},"168":{"id":167,"kind":"typedef","name":"PROC"},"178":{"id":176,"name":"x","kind":"param"},"179":{"id":177,"name":"y","kind":"param"},"184":{"id":183,"name":"factor","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"190":{"id":189,"name":"x","kind":"param"},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"196":{"id":195,"name":"x","kind":"param"},"206":{"id":200,"name":"x","kind":"param"},"207":{"id":201,"name":"y","kind":"param"},"215":{"id":211,"name":"x","kind":"param"},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"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,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"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,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"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,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"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,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"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,"depth":0},{"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,"depth":0},{"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,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"215":{"id":211,"name":"x","kind":"param","depth":1},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"250":{"id":249,"name":"x","kind":"param","depth":1},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param","depth":1},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 3cc68b30f..1749b6095 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param"},"10":{"id":8,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index 16815402e..f2b5ffce7 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param"},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param"},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index cc35ab29e..f04f2c675 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 463c5237d..11ef1d678 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1012unknownType.json b/quint/testFixture/_1012unknownType.json index f7e30f970..4e3720254 100644 --- a/quint/testFixture/_1012unknownType.json +++ b/quint/testFixture/_1012unknownType.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2,"depth":0}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index c4b48653f..745920eed 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"}},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"}},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1016nonConstOverride.json b/quint/testFixture/_1016nonConstOverride.json index 617624975..16377145c 100644 --- a/quint/testFixture/_1016nonConstOverride.json +++ b/quint/testFixture/_1016nonConstOverride.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index a2a4bb5b0..41bd5f567 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 788b99601..f45d277dc 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 6bfc7ca63..88f583e0d 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1040compileError.json b/quint/testFixture/_1040compileError.json index a841f0e70..297159d06 100644 --- a/quint/testFixture/_1040compileError.json +++ b/quint/testFixture/_1040compileError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1041compileConst.json b/quint/testFixture/_1041compileConst.json index 3ea01a4eb..5aac7fd72 100644 --- a/quint/testFixture/_1041compileConst.json +++ b/quint/testFixture/_1041compileConst.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json index d235213b0..bdd6bb145 100644 --- a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json +++ b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index db8016a6e..90dc57e22 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 093e3b648..abd859adf 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"18":{"id":17,"name":"__CParam","kind":"param"},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index f8280eaa1..951bdacda 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"19":{"id":18,"name":"__OkParam","kind":"param"},"25":{"id":24,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 7ae45fde9..48fb05ca0 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 84d914ae9752a5ac64a02797d99f2c1505ecb1c8 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:23:29 -0300 Subject: [PATCH 287/428] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9534e7ca6..e0326d518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The latest supported node version is now bounded at <= 20, which covers the latest LTS. (#1380) +- Shadowing names are now supported, which means that the same name can be redefined + in nested scopes (#1394) ### Deprecated ### Removed From 81a363f0bc2b64982077e64cf9bba657f9f4adfa Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:25:37 -0300 Subject: [PATCH 288/428] Update documentation --- doc/lang.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index cc3ef8b01..d71ba0c3e 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -514,7 +514,7 @@ module Top { Note that in the above example, `Inner::x2` is treated as a qualified identifier, that is, it consists of the prefix `Inner` and the name `x2`. -*No collisions.* There must be no name collisions between names. Shadowing of a name is not allowed. For example: +Shadowing names is allowed. For example: ```bluespec module OS { @@ -524,13 +524,7 @@ module OS { } ``` -The Quint parser produces the following error message: - -``` -error: [QNT101] Conflicting definitions found for name 'clock' in module 'OS' -4: def increase(clock) = clock + 1 - ^^^^^ -``` +PS: Let us know if you are bothered by this. We are considering making it a togglable feature. *No order.* In contrast to TLA+, namespaces are not ordered. It is perfectly fine to write out-of-order definitions, like in many programming languages: From 4ccd20c3a58cc114d5b545b63a60f9deac645556 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 5 Mar 2024 15:34:23 -0300 Subject: [PATCH 289/428] Update quint/src/names/base.ts Co-authored-by: Shon Feder --- quint/src/names/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index e34415dc5..3a4f63908 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -50,7 +50,7 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam /** * A module's definitions, indexed by name. */ -export type DefinitionsByName = Map +export type DefinitionsByName = Map /** * Definitions for each module From f97f77cc858c5ab1fa614b36b3dcc21444c5a760 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Mar 2024 10:57:52 -0500 Subject: [PATCH 290/428] Use Apalache versin 0.44.7 --- quint/src/quintVerifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index be2f54bde..bab9b0c5d 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -38,7 +38,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.2' +const APALACHE_VERSION_TAG = '0.44.7' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From aa27c5141e2a91dcda5b3a8cae445e0cc251a70d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Mar 2024 12:49:26 -0500 Subject: [PATCH 291/428] Move Apalache client into its own module This is almost entirely a mechanical change. We just move the Apalache server manager and client into its own module, and rename a few types to reflect the generality of the functionality. This leaves `quintVerifier.ts` super slim, but all of the verify logic (excluding the IO operations) from the `cliCommand` module should be moved there eventually. Closes #1396 --- quint/src/apalache.ts | 430 +++++++++++++++++++++++++++++++++++++ quint/src/quintVerifier.ts | 421 +----------------------------------- 2 files changed, 435 insertions(+), 416 deletions(-) create mode 100644 quint/src/apalache.ts diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts new file mode 100644 index 000000000..e5cfbd130 --- /dev/null +++ b/quint/src/apalache.ts @@ -0,0 +1,430 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Interface to Apalache + * + * This functionality is enabled by managing and interacting with the Apalache + * server. + * + * @author Shon Feder + * + * @module + */ + +import { Either, chain, left, right } from '@sweet-monads/either' +import { ErrorMessage } from './ErrorMessage' +import path from 'path' +import fs from 'fs' +import os from 'os' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import semver from 'semver' +import { pipeline } from 'stream/promises' +import child_process from 'child_process' +import * as tar from 'tar' +import * as grpc from '@grpc/grpc-js' +import * as proto from '@grpc/proto-loader' +import * as protobufDescriptor from 'protobufjs/ext/descriptor' +import { setTimeout } from 'timers/promises' +import { promisify } from 'util' +import { ItfTrace } from './itf' +import { verbosity } from './verbosity' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import { request as octokitRequest } from '@octokit/request' + +import type { Buffer } from 'buffer' +import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' + +const APALACHE_SERVER_URI = 'localhost:8822' +const APALACHE_VERSION_TAG = '0.44.7' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// const APALACHE_TGZ = 'apalache.tgz' + +function quintConfigDir(): string { + return path.join(os.homedir(), '.quint') +} + +function apalacheDistDir(): string { + return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) +} + +// The structure used to report errors +type ApalacheError = { + explanation: string + errors: ErrorMessage[] + traces?: ItfTrace[] +} + +export type ApalacheResult = Either + +// An object representing the Apalache configuration +// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 +type ApalacheConfig = any + +// Interface to the apalache server +// This is likely to be expanded in the future +type Apalache = { + // Run the check command with the given configuration + check: (c: ApalacheConfig) => Promise> +} + +function handleVerificationFailure(failure: { pass_name: string; error_data: any }): ApalacheError { + switch (failure.pass_name) { + case 'SanyParser': + return { + explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'TypeCheckerSnowcat': + return { + explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'BoundedChecker': + switch (failure.error_data.checking_result) { + case 'Error': + return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } + case 'Deadlock': + return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } + default: + throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) + } + default: + throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) + } +} + +// Construct the Apalache interface around the cmdExecutor +function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { + const check = async (c: ApalacheConfig): Promise> => { + const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) + if (response.result == 'success') { + return right(void 0) + } else { + switch (response.failure.errorType) { + case 'UNEXPECTED': { + const errData = JSON.parse(response.failure.data) + return err(errData.msg) + } + case 'PASS_FAILURE': + return left(handleVerificationFailure(JSON.parse(response.failure.data))) + default: + // TODO handle other error cases + return err(`${response.failure.errorType}: ${response.failure.data}`) + } + } + } + + return { check } +} + +// Alias for an async callback for values of type T used to annotate +// callback-based methods so we can convert them into promise-based methods via +// promiseify. +type AsyncCallBack = (err: any, result: T) => void + +// The core grpc tooling doesn't support generation of typing info, +// we therefore record the structer we require from the grpc generation +// in the 6 following types. +// +// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto + +type RunRequest = { cmd: string; config: string } + +type RunResponse = + | { result: 'failure'; failure: { errorType: string; data: string } } + // The success data also includes the parsed module, but we don't need it + | { result: 'success' } + +// The interface for the CmdExecutor service generated by the gRPC library +type CmdExecutor = { + // Constructs a new client service + new (url: string, creds: any): CmdExecutor + run: (req: RunRequest, cb: AsyncCallBack) => void +} + +// The refined interface to the CmdExecutor we produce from the generated interface +type AsyncCmdExecutor = { + run: (req: RunRequest) => Promise +} + +// The interface for the Shai package +type ShaiPkg = { + cmdExecutor: { + CmdExecutor: CmdExecutor + } +} + +// Helper to construct errors results +function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): ApalacheResult { + return left({ explanation, errors, traces }) +} + +// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup +const grpcStubOptions = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +} + +async function loadProtoDefViaReflection(retry: boolean): Promise> { + // Types of the gRPC interface + type ServerReflectionRequest = { file_containing_symbol: string } + type ServerReflectionResponseSuccess = { + file_descriptor_response: { + file_descriptor_proto: Buffer[] + } + } + type ServerReflectionResponseFailure = { + error_response: { + error_code: number + error_message: string + } + } + type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure + type ServerReflectionService = { + new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService + ServerReflectionInfo: () => grpc.ClientDuplexStream + getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } + } + type ServerReflectionPkg = { + grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } + } + + // Obtain a reflection service client + const protoPath = require.resolve('./reflection.proto') + const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) + const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg + const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection + const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + + // Wait for gRPC channel to come up, with 1sec pauses + if (retry) { + for (;;) { + const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) + if (grpcChannelState == grpc.connectivityState.READY) { + break + } else { + /* I suspect that there is a race with async gRPC code that actually + * brings the connection up, so we need to yield control here. In + * particular, waiting for the channel to come up in a busy-waiting loop + * does NOT work. + */ + await setTimeout(1000) + } + } + } + + // Query reflection endpoint + return new Promise>((resolve, _) => { + const call = reflectionClient.ServerReflectionInfo() + call.on('data', (r: ServerReflectionResponse) => { + call.end() + resolve(right(r)) + }) + call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) + + call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) + }).then(protoDefResponse => + protoDefResponse.chain(protoDefResponse => { + // Construct a proto definition of the reflection response. + if ('error_response' in protoDefResponse) { + return err( + `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` + ) + } + + // Decode reflection response to FileDescriptorProto + let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( + bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto + ) + + // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet + return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) + }) + ) +} + +function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { + const protoDescriptor = grpc.loadPackageDefinition(protoDef) + // The cast thru `unkown` lets us convince the type system of anything + // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion + const pkg = protoDescriptor.shai as unknown as ShaiPkg + const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + return { + run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), + } +} + +/** + * Connect to the Apalache server, and verify that the gRPC channel is up. + * + * @param retry Wait for the gRPC connection to come up. + * + * @returns A promise resolving to a `right` if the connection is + * successful, or a `left` if not. + */ +async function tryConnect(retry: boolean = false): Promise> { + return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) +} + +function downloadAndUnpackApalache(): Promise> { + const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` + return fetch(url) + .then( + // unpack response body + res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), + error => err(`Error fetching ${url}: ${error}`) + ) + .then( + _ => right(null), + error => err(`Error unpacking .tgz: ${error}`) + ) +} + +/** + * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +async function fetchApalache(verbosityLevel: number): Promise> { + const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') + if (fs.existsSync(apalacheBinary)) { + // Use existing download + debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) + return right(apalacheBinary) + } else { + fs.mkdirSync(apalacheDistDir(), { recursive: true }) + process.stdout.write('Downloading Apalache distribution...') + const res = await downloadAndUnpackApalache() + process.stdout.write(' done.\n') + return res.map(_ => apalacheBinary) + } + + // TODO: This logic makes the CLI tool extremely sensitive to environment. + // See https://github.com/informalsystems/quint/issues/1124 + // Fetch Github releases + // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( + // async resp => { + // // Find latest that satisfies `APALACHE_VERSION_TAG` + // const versions = resp.data.map((element: any) => element.tag_name) + // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) + // if (latestTaggedVersion === null) { + // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) + // } + // // Check if we have already downloaded this release + // const unpackPath = apalacheDistDir() + // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') + // if (fs.existsSync(apalacheBinary)) { + // // Use existing download + // console.log(`Using existing Apalache distribution in ${unpackPath}`) + // return right(unpackPath) + // } else { + // // No existing download, download Apalache dist + // fs.mkdirSync(unpackPath, { recursive: true }) + + // // Filter release response to get dist archive asset URL + // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) + // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) + // const downloadUrl = tgzAsset.browser_download_url + + // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) + // return fetch(downloadUrl) + // .then( + // // unpack response body + // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), + // error => err(`Error fetching ${downloadUrl}: ${error}`) + // ) + // .then( + // _ => right(unpackPath), + // error => err(`Error unpacking .tgz: ${error}`) + // ) + // } + // }, + // error => err(`Error listing the Apalache releases: ${error}`) + // ) +} + +/** + * Connect to an already running Apalache server, or – if unsuccessful – fetch + * Apalache, spawn it, and connect to it. + * + * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +export async function connect(verbosityLevel: number): Promise> { + // Try to connect to Shai, and try to ping it + const connectionResult = await tryConnect() + // We managed to connect, simply return this connection + if (connectionResult.isRight()) { + return connectionResult + } + + // Connection or pinging failed, download Apalache + debugLog(verbosityLevel, 'No running Apalache server found, launching...') + const exeResult = await fetchApalache(verbosityLevel) + // Launch Apalache from download + return exeResult + .asyncChain( + async exe => + new Promise>((resolve, _) => { + debugLog(verbosityLevel, 'Launching Apalache server') + const apalache = child_process.spawn(exe, ['server']) + + // Exit handler that kills Apalache if Quint exists + function exitHandler() { + debugLog(verbosityLevel, 'Shutting down Apalache server') + try { + process.kill(apalache.pid!) + } catch (error: any) { + // ESRCH is raised if no process with `pid` exists, i.e., + // if Apalache server exited on its own + if (error.code == 'ESRCH') { + debugLog(verbosityLevel, 'Apalache already exited') + } else { + throw error + } + } + } + + if (apalache.pid) { + // Apalache launched successfully + + // Install exit handler that kills Apalache if Quint exists + process.on('exit', exitHandler.bind(null)) + process.on('SIGINT', exitHandler.bind(null)) + process.on('SIGUSR1', exitHandler.bind(null)) + process.on('SIGUSR2', exitHandler.bind(null)) + process.on('uncaughtException', exitHandler.bind(null)) + + resolve(right(void 0)) + } + // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is + // emitted. + apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) + }) + ) + .then(chain(() => tryConnect(true))) +} + +/** + * Log `msg` to the console if `verbosityLevel` implies debug output. + * + * @param verbosityLevel the current verbosity level (set with --verbosity) + * @param msg the message to log + */ +function debugLog(verbosityLevel: number, msg: string) { + if (verbosity.hasDebugInfo(verbosityLevel)) { + console.log(msg) + } +} diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index bab9b0c5d..3749c1b65 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -1,431 +1,20 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2023 Informal Systems + * Copyright 2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ /** - * Interface to Apalache's model checking functionality - * - * This functionality is exposed thru the Apalache server. + * Core logic of verification * * @author Shon Feder * * @module */ -import { Either, chain, left, right } from '@sweet-monads/either' -import { ErrorMessage } from './ErrorMessage' -import path from 'path' -import fs from 'fs' -import os from 'os' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import semver from 'semver' -import { pipeline } from 'stream/promises' -import child_process from 'child_process' -import * as tar from 'tar' -import * as grpc from '@grpc/grpc-js' -import * as proto from '@grpc/proto-loader' -import * as protobufDescriptor from 'protobufjs/ext/descriptor' -import { setTimeout } from 'timers/promises' -import { promisify } from 'util' -import { ItfTrace } from './itf' -import { verbosity } from './verbosity' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import { request as octokitRequest } from '@octokit/request' - -import type { Buffer } from 'buffer' -import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' - -const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.7' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// const APALACHE_TGZ = 'apalache.tgz' - -// The structure used to report errors -type VerifyError = { - explanation: string - errors: ErrorMessage[] - traces?: ItfTrace[] -} - -function quintConfigDir(): string { - return path.join(os.homedir(), '.quint') -} - -function apalacheDistDir(): string { - return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) -} - -export type VerifyResult = Either - -// An object representing the Apalache configuration -// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 -type ApalacheConfig = any - -// Interface to the apalache server -// This is likely to be expanded in the future -type Apalache = { - // Run the check command with the given configuration - check: (c: ApalacheConfig) => Promise> -} - -function handleVerificationFailure(failure: { pass_name: string; error_data: any }): VerifyError { - switch (failure.pass_name) { - case 'SanyParser': - return { - explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'TypeCheckerSnowcat': - return { - explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'BoundedChecker': - switch (failure.error_data.checking_result) { - case 'Error': - return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } - case 'Deadlock': - return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } - default: - throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) - } - default: - throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) - } -} - -// Construct the Apalache interface around the cmdExecutor -function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { - const check = async (c: ApalacheConfig): Promise> => { - const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) - if (response.result == 'success') { - return right(void 0) - } else { - switch (response.failure.errorType) { - case 'UNEXPECTED': { - const errData = JSON.parse(response.failure.data) - return err(errData.msg) - } - case 'PASS_FAILURE': - return left(handleVerificationFailure(JSON.parse(response.failure.data))) - default: - // TODO handle other error cases - return err(`${response.failure.errorType}: ${response.failure.data}`) - } - } - } - - return { check } -} - -// Alias for an async callback for values of type T used to annotate -// callback-based methods so we can convert them into promise-based methods via -// promiseify. -type AsyncCallBack = (err: any, result: T) => void - -// The core grpc tooling doesn't support generation of typing info, -// we therefore record the structer we require from the grpc generation -// in the 6 following types. -// -// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto - -type RunRequest = { cmd: string; config: string } - -type RunResponse = - | { result: 'failure'; failure: { errorType: string; data: string } } - // The success data also includes the parsed module, but we don't need it - | { result: 'success' } - -// The interface for the CmdExecutor service generated by the gRPC library -type CmdExecutor = { - // Constructs a new client service - new (url: string, creds: any): CmdExecutor - run: (req: RunRequest, cb: AsyncCallBack) => void -} - -// The refined interface to the CmdExecutor we produce from the generated interface -type AsyncCmdExecutor = { - run: (req: RunRequest) => Promise -} - -// The interface for the Shai package -type ShaiPkg = { - cmdExecutor: { - CmdExecutor: CmdExecutor - } -} - -// Helper to construct errors results -function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): VerifyResult { - return left({ explanation, errors, traces }) -} - -// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup -const grpcStubOptions = { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true, -} - -async function loadProtoDefViaReflection(retry: boolean): Promise> { - // Types of the gRPC interface - type ServerReflectionRequest = { file_containing_symbol: string } - type ServerReflectionResponseSuccess = { - file_descriptor_response: { - file_descriptor_proto: Buffer[] - } - } - type ServerReflectionResponseFailure = { - error_response: { - error_code: number - error_message: string - } - } - type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure - type ServerReflectionService = { - new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService - ServerReflectionInfo: () => grpc.ClientDuplexStream - getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } - } - type ServerReflectionPkg = { - grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } - } - - // Obtain a reflection service client - const protoPath = require.resolve('./reflection.proto') - const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) - const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg - const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection - const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - - // Wait for gRPC channel to come up, with 1sec pauses - if (retry) { - for (;;) { - const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) - if (grpcChannelState == grpc.connectivityState.READY) { - break - } else { - /* I suspect that there is a race with async gRPC code that actually - * brings the connection up, so we need to yield control here. In - * particular, waiting for the channel to come up in a busy-waiting loop - * does NOT work. - */ - await setTimeout(1000) - } - } - } - - // Query reflection endpoint - return new Promise>((resolve, _) => { - const call = reflectionClient.ServerReflectionInfo() - call.on('data', (r: ServerReflectionResponse) => { - call.end() - resolve(right(r)) - }) - call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) - - call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) - }).then(protoDefResponse => - protoDefResponse.chain(protoDefResponse => { - // Construct a proto definition of the reflection response. - if ('error_response' in protoDefResponse) { - return err( - `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` - ) - } +// TODO This module should subsume the pure logic from the verify commaind in cliCommand - // Decode reflection response to FileDescriptorProto - let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( - bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto - ) - - // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet - return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) - }) - ) -} - -function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { - const protoDescriptor = grpc.loadPackageDefinition(protoDef) - // The cast thru `unkown` lets us convince the type system of anything - // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion - const pkg = protoDescriptor.shai as unknown as ShaiPkg - const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - return { - run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), - } -} - -/** - * Connect to the Apalache server, and verify that the gRPC channel is up. - * - * @param retry Wait for the gRPC connection to come up. - * - * @returns A promise resolving to a `right` if the connection is successful, or a `left` if not. - */ -async function tryConnect(retry: boolean = false): Promise> { - return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) -} - -function downloadAndUnpackApalache(): Promise> { - const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` - return fetch(url) - .then( - // unpack response body - res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), - error => err(`Error fetching ${url}: ${error}`) - ) - .then( - _ => right(null), - error => err(`Error unpacking .tgz: ${error}`) - ) -} - -/** - * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function fetchApalache(verbosityLevel: number): Promise> { - const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') - if (fs.existsSync(apalacheBinary)) { - // Use existing download - debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) - return right(apalacheBinary) - } else { - fs.mkdirSync(apalacheDistDir(), { recursive: true }) - process.stdout.write('Downloading Apalache distribution...') - const res = await downloadAndUnpackApalache() - process.stdout.write(' done.\n') - return res.map(_ => apalacheBinary) - } - - // TODO: This logic makes the CLI tool extremely sensitive to environment. - // See https://github.com/informalsystems/quint/issues/1124 - // Fetch Github releases - // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( - // async resp => { - // // Find latest that satisfies `APALACHE_VERSION_TAG` - // const versions = resp.data.map((element: any) => element.tag_name) - // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) - // if (latestTaggedVersion === null) { - // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) - // } - // // Check if we have already downloaded this release - // const unpackPath = apalacheDistDir() - // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') - // if (fs.existsSync(apalacheBinary)) { - // // Use existing download - // console.log(`Using existing Apalache distribution in ${unpackPath}`) - // return right(unpackPath) - // } else { - // // No existing download, download Apalache dist - // fs.mkdirSync(unpackPath, { recursive: true }) - - // // Filter release response to get dist archive asset URL - // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) - // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) - // const downloadUrl = tgzAsset.browser_download_url - - // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) - // return fetch(downloadUrl) - // .then( - // // unpack response body - // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), - // error => err(`Error fetching ${downloadUrl}: ${error}`) - // ) - // .then( - // _ => right(unpackPath), - // error => err(`Error unpacking .tgz: ${error}`) - // ) - // } - // }, - // error => err(`Error listing the Apalache releases: ${error}`) - // ) -} - -/** - * Connect to an already running Apalache server, or – if unsuccessful – fetch - * Apalache, spawn it, and connect to it. - * - * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function connect(verbosityLevel: number): Promise> { - // Try to connect to Shai, and try to ping it - const connectionResult = await tryConnect() - // We managed to connect, simply return this connection - if (connectionResult.isRight()) { - return connectionResult - } - - // Connection or pinging failed, download Apalache - debugLog(verbosityLevel, 'No running Apalache server found, launching...') - const exeResult = await fetchApalache(verbosityLevel) - // Launch Apalache from download - return exeResult - .asyncChain( - async exe => - new Promise>((resolve, _) => { - debugLog(verbosityLevel, 'Launching Apalache server') - const apalache = child_process.spawn(exe, ['server']) - - // Exit handler that kills Apalache if Quint exists - function exitHandler() { - debugLog(verbosityLevel, 'Shutting down Apalache server') - try { - process.kill(apalache.pid!) - } catch (error: any) { - // ESRCH is raised if no process with `pid` exists, i.e., - // if Apalache server exited on its own - if (error.code == 'ESRCH') { - debugLog(verbosityLevel, 'Apalache already exited') - } else { - throw error - } - } - } - - if (apalache.pid) { - // Apalache launched successfully - - // Install exit handler that kills Apalache if Quint exists - process.on('exit', exitHandler.bind(null)) - process.on('SIGINT', exitHandler.bind(null)) - process.on('SIGUSR1', exitHandler.bind(null)) - process.on('SIGUSR2', exitHandler.bind(null)) - process.on('uncaughtException', exitHandler.bind(null)) - - resolve(right(void 0)) - } - // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is - // emitted. - apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) - }) - ) - .then(chain(() => tryConnect(true))) -} - -/** - * Log `msg` to the console if `verbosityLevel` implies debug output. - * - * @param verbosityLevel the current verbosity level (set with --verbosity) - * @param msg the message to log - */ -function debugLog(verbosityLevel: number, msg: string) { - if (verbosity.hasDebugInfo(verbosityLevel)) { - console.log(msg) - } -} +import { ApalacheResult, connect } from './apalache' /** * Verifies the configuration `config` by model checking it with the Apalache server @@ -435,7 +24,7 @@ function debugLog(verbosityLevel: number, msg: string) { * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(config: any, verbosityLevel: number): Promise> { +export async function verify(config: any, verbosityLevel: number): Promise> { const connectionResult = await connect(verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } From b01272a9974e8156d0d57de4151aae4db8b879eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 11:50:05 -0400 Subject: [PATCH 292/428] Use guessMainModule function --- quint/src/cliCommands.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index a23b3178d..2822e6a73 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -623,8 +623,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise m.name === mainName) if (!main) { return cliErr(`module ${mainName} does not exist`, { ...verifying, errors: [], sourceCode: new Map() }) From e8ef56bd5bbf0bf6d5ef0d601f86196e39253f08 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:23:50 -0400 Subject: [PATCH 293/428] Remove unnecessary `async` --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 21df3eb7d..35837fa54 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -58,7 +58,7 @@ const parseCmd = { desc: 'name of the source map', type: 'string', }), - handler: async (args: any) => load(args).then(chainCmd(parse)).then(outputResult), + handler: (args: any) => load(args).then(chainCmd(parse)).then(outputResult), } // construct typecheck commands with yargs From d2ccc5ebcb51bb05d0b38fd38ac0698288bf3767 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:24:42 -0400 Subject: [PATCH 294/428] Preserve successful data received from Apalache We didn't need this before when just using the `check` command. --- quint/src/apalache.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index e5cfbd130..d2cf3cccc 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -136,8 +136,9 @@ type RunRequest = { cmd: string; config: string } type RunResponse = | { result: 'failure'; failure: { errorType: string; data: string } } - // The success data also includes the parsed module, but we don't need it - | { result: 'success' } + // The success data also includes the parsed module, either as JSON + // representing the Apalache IR, ir as a TLA string (if the `TLA` command is used) + | { result: 'success'; success: string } // The interface for the CmdExecutor service generated by the gRPC library type CmdExecutor = { From 4e6197570dbbd5b7884d3051d9aaeac6195dea6d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:26:17 -0400 Subject: [PATCH 295/428] Add support for the `TLA` Apalache cmdServer cmd --- quint/src/apalache.ts | 44 ++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index d2cf3cccc..fdcfa91e0 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -69,6 +69,8 @@ type ApalacheConfig = any type Apalache = { // Run the check command with the given configuration check: (c: ApalacheConfig) => Promise> + // Convert the provided input into formatted TLA + tla: (c: ApalacheConfig) => Promise> } function handleVerificationFailure(failure: { pass_name: string; error_data: any }): ApalacheError { @@ -97,28 +99,36 @@ function handleVerificationFailure(failure: { pass_name: string; error_data: any } } +async function handleResponse(response: RunResponse): Promise> { + if (response.result == 'success') { + const success = JSON.parse(response.success) + return right(success) + } else { + switch (response.failure.errorType) { + case 'UNEXPECTED': { + const errData = JSON.parse(response.failure.data) + return err(errData.msg) + } + case 'PASS_FAILURE': + return left(handleVerificationFailure(JSON.parse(response.failure.data))) + default: + // TODO handle other error cases + return err(`${response.failure.errorType}: ${response.failure.data}`) + } + } +} + // Construct the Apalache interface around the cmdExecutor function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { const check = async (c: ApalacheConfig): Promise> => { - const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) - if (response.result == 'success') { - return right(void 0) - } else { - switch (response.failure.errorType) { - case 'UNEXPECTED': { - const errData = JSON.parse(response.failure.data) - return err(errData.msg) - } - case 'PASS_FAILURE': - return left(handleVerificationFailure(JSON.parse(response.failure.data))) - default: - // TODO handle other error cases - return err(`${response.failure.errorType}: ${response.failure.data}`) - } - } + return cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }).then(handleResponse) + } + + const tla = async (c: ApalacheConfig): Promise> => { + return cmdExecutor.run({ cmd: 'TLA', config: JSON.stringify(c) }).then(handleResponse) } - return { check } + return { check, tla } } // Alias for an async callback for values of type T used to annotate From e98270404e3bea5d3e5f619bfb2c345fe3e04e7d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:37:20 -0400 Subject: [PATCH 296/428] Add compile subcommand Closes #1309 Closes #359 Both issues include ideas for followup work (e.g., compiling to a `js` or UX improvements for a TLC integration). But this covers the core of both. --- quint/src/cli.ts | 25 ++++++++++++++ quint/src/cliCommands.ts | 64 ++++++++++++++++++++++++++++++++++- quint/src/compileToTlaplus.ts | 36 ++++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 quint/src/compileToTlaplus.ts diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 35837fa54..9663c3c02 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -13,6 +13,7 @@ import yargs from 'yargs/yargs' import { CLIProcedure, + compile, docs, load, outputResult, @@ -69,6 +70,29 @@ const typecheckCmd = { handler: (args: any) => load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(outputResult), } +// construct the compile subcommand +const compileCmd = { + command: 'compile ', + desc: 'compile a Quint specification into the target kind, the output is written to stdout', + builder: (yargs: any) => + defaultOpts(yargs) + .option('main', { + desc: 'name of the main module (by default, computed from filename)', + type: 'string', + }) + .option('target', { + desc: 'the compilation target. Supported values: `tlaplus`, `json`', + type: 'string', + }) + .option('verbosity', { + desc: 'control how much output is produced (0 to 5)', + type: 'number', + default: verbosity.defaultLevel, + }), + handler: (args: any) => + load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(compile)).then(outputResult), +} + // construct repl commands with yargs const replCmd = { command: ['repl', '*'], @@ -292,6 +316,7 @@ async function main() { await yargs(process.argv.slice(2)) .command(parseCmd) .command(typecheckCmd) + .command(compileCmd) .command(replCmd) .command(runCmd) .command(testCmd) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 2822e6a73..24f36032f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -24,6 +24,7 @@ import { } from './parsing/quintParserFrontend' import { ErrorMessage } from './ErrorMessage' +import { fail } from 'assert' import { Either, left, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' @@ -47,8 +48,9 @@ import { analyzeInc, analyzeModules } from './quintAnalyzer' import { ExecutionFrame } from './runtime/trace' import { flow, isEqual, uniqWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' +import { compileToTlaplus } from './compileToTlaplus' -export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'documentation' +export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'compiling' | 'documentation' /** The data from a ProcedureStage that may be output to --out */ interface OutputStage { @@ -604,6 +606,66 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { + const stage: stage = 'compiling' + const args = typechecked.args + const verbosityLevel = deriveVerbosity(args) + + const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( + typechecked.modules, + typechecked.table, + typechecked.idGen, + typechecked.sourceMap, + typechecked + ) + + const mainName = guessMainModule(typechecked) + const main = flattenedModules.find(m => m.name === mainName)! + if (!main) { + return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) + } + + const flattenedStage: TypecheckedStage = { + ...typechecked, + ...flattenedAnalysis, + modules: [main], + table: flattenedTable, + stage, + } + + const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage(flattenedStage)) + switch ((typechecked.args.target as string).toLowerCase()) { + case 'json': + process.stdout.write(parsedSpecJson) + return right(flattenedStage) + case 'tlaplus': { + const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) + return toTlaResult + .mapRight(tla => { + process.stdout.write(tla) // Write out, since all went right + return flattenedStage + }) + .mapLeft(err => { + return { + msg: err.explanation, + stage: { ...flattenedStage, stage, status: 'error', errors: err.errors }, + } + }) + } + default: + fail(`Invalid option for --target: ${args.target}. Valid options: json, tlaplus`) + } +} + /** * Verify a spec via Apalache. * diff --git a/quint/src/compileToTlaplus.ts b/quint/src/compileToTlaplus.ts new file mode 100644 index 000000000..4df0a7995 --- /dev/null +++ b/quint/src/compileToTlaplus.ts @@ -0,0 +1,36 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Use apalache to convert quint parse data into TLA+ + * + * @author Shon Feder + * + * @module + */ + +import { ApalacheResult, connect } from './apalache' + +/** + * Get apalache to convert quint parse data into TLA+ + * + * @param parseDataJson the flattened, analyzed, parse data, in as a json string + * + * @returns right(tlaString) if parsing succeeds, or left(err) explaining the failure + */ +export async function compileToTlaplus(parseDataJson: string, verbosityLevel: number): Promise> { + const config = { + input: { + source: { + type: 'string', + format: 'qnt', + content: parseDataJson, + }, + }, + } + const connectionResult = await connect(verbosityLevel) + return connectionResult.asyncChain(conn => conn.tla(config)) +} From 4d2c10d26d76f2edb9f87a04cff82218ca43a8f5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:39:04 -0400 Subject: [PATCH 297/428] Add tests for `compile --target tlaplus` --- quint/apalache-tests.md | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 1ffc501d2..8a716f60c 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -219,3 +219,54 @@ An example execution: __saved_n: 1, n: 1 ``` + +## Compiling to TLA+ + +### Test that we can compile to TLA+ of the expected form + + +``` +quint compile --target tlaplus ../examples/language-features/booleans.qnt +``` + + +``` +------------------------------- MODULE booleans ------------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache + +VARIABLE b + +step == + (b \/ TRUE) + /\ ~(b /\ FALSE) + /\ (b => b) + /\ (b <=> b) + /\ b = b + /\ b /= (~b) + /\ b' := (~b) + +init == b' := TRUE + +================================================================================ +``` + +### Test that we can compile a module with imports and instances to TLA+ + + + +``` +quint compile --target tlaplus ../examples/classic/distributed/ClockSync/clockSync3.qnt | head +``` + + +TODO: This is an incorrect result, we are removing all "unused" declarations +which leaves nothing, thanks to the way clockSync3 is instanced. + +``` +------------------------------ MODULE clockSync3 ------------------------------ + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache + +================================================================================ +``` From 7811f8627e1d564b85113ff5ab015e389eba3722 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:53:28 -0400 Subject: [PATCH 298/428] Add test for `compile --target json` --- quint/io-cli-tests.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 3f3d3e663..dff7aa198 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -171,6 +171,20 @@ Trying to unify bool and int error: typechecking failed ``` +## The `compile` commaind + +### Can compile `booleans.qnt` to JSON + + +``` +quint compile --target json ../examples/language-features/booleans.qnt | jq '.modules[0].name' +``` + + +``` +"booleans" +``` + ## Use of `repl`, `test`, and `run` ### Repl loads a file with -r From 7003ef2fcc7fb2e902f3398f7b7a7de92e169031 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 21:37:45 -0400 Subject: [PATCH 299/428] Give a clean CLI error for invalid options --- quint/io-cli-tests.md | 18 ++++++++++++++++++ quint/src/cli.ts | 10 +++++++++- quint/src/cliCommands.ts | 3 ++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index dff7aa198..6907f5c47 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -173,6 +173,24 @@ error: typechecking failed ## The `compile` commaind +### Reports in error for invalid `--target` + +We pipe stderr to `tail` here. Following https://stackoverflow.com/a/52575213/1187277 +This is a clean CLI interface error, but we don't want to put the entire output +in the test, lest it require fiddling when unrelated things are updated. + + + +``` +quint compile --target invalidTarget ../examples/language-features/booleans.qnt 2> >(tail -1 >&2) +``` + + +``` +Invalid option for --target: invalidTarget. Valid options: tlaplus, json +``` + + ### Can compile `booleans.qnt` to JSON diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 9663c3c02..11fffcefe 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -9,6 +9,7 @@ * @author Igor Konnov, Gabriela Moreira, Shon Feder, Informal Systems, 2021-2023 */ +import { fail } from 'assert' import yargs from 'yargs/yargs' import { @@ -70,6 +71,7 @@ const typecheckCmd = { handler: (args: any) => load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(outputResult), } +const supportedTarges = ['tlaplus', 'json'] // construct the compile subcommand const compileCmd = { command: 'compile ', @@ -81,9 +83,15 @@ const compileCmd = { type: 'string', }) .option('target', { - desc: 'the compilation target. Supported values: `tlaplus`, `json`', + desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', }) + .coerce('target', (target: string): string => { + if (!supportedTarges.includes(target)) { + fail(`Invalid option for --target: ${target}. Valid options: ${supportedTarges.join(', ')}`) + } + return target + }) .option('verbosity', { desc: 'control how much output is produced (0 to 5)', type: 'number', diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 24f36032f..2fdb81b2c 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -662,7 +662,8 @@ export async function compile(typechecked: TypecheckedStage): Promise Date: Tue, 12 Mar 2024 11:56:56 -0400 Subject: [PATCH 300/428] Update quint/src/apalache.ts Co-authored-by: Gabriela Moreira --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index fdcfa91e0..c398c6ea1 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -147,7 +147,7 @@ type RunRequest = { cmd: string; config: string } type RunResponse = | { result: 'failure'; failure: { errorType: string; data: string } } // The success data also includes the parsed module, either as JSON - // representing the Apalache IR, ir as a TLA string (if the `TLA` command is used) + // representing the Apalache IR, or as a TLA string (if the `TLA` command is used) | { result: 'success'; success: string } // The interface for the CmdExecutor service generated by the gRPC library From dda6aee1662b700095bf7860b38d9684e1090479 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:33:31 -0400 Subject: [PATCH 301/428] Fix comment --- quint/src/apalache.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index c398c6ea1..a382957a8 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -137,8 +137,8 @@ function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { type AsyncCallBack = (err: any, result: T) => void // The core grpc tooling doesn't support generation of typing info, -// we therefore record the structer we require from the grpc generation -// in the 6 following types. +// we therefore record the structure we require from the grpc generation +// in the following types. // // The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto From f078b5760e9e7d7ed191d1c56287928002aa088c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:33:40 -0400 Subject: [PATCH 302/428] Defualt compile to the `json` target --- quint/src/cli.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 11fffcefe..189620ee3 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -85,6 +85,7 @@ const compileCmd = { .option('target', { desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', + default: 'json', }) .coerce('target', (target: string): string => { if (!supportedTarges.includes(target)) { From 620baf3c78fb862f3a391815ab567214aec6661c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:42:22 -0400 Subject: [PATCH 303/428] Add documentation --- doc/quint.md | 34 ++++++++++++++++++++++++++++++++++ quint/src/cli.ts | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/quint.md b/doc/quint.md index e455f2e4a..18eed574b 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -14,6 +14,8 @@ and integration with other tools. The main commands of `quint` are as follows: - [x] `repl` starts the REPL (Read-Eval-Print loop) for Quint + - [x] `compile` parses, typechecks, and processes a quint specification + into the `--target` format, writing the results to stdout - [x] `parse` parses a Quint specification and resolves names - [x] `typecheck` infers types in a Quint specification - [x] `run` executes a Quint specification via random simulation @@ -65,6 +67,38 @@ The REPL is especially useful for learning the language. See the The verbosity levels 3 and 4 are used to show execution details. They are especially useful for debugging complex specifications. +## Command `compile` + +```sh +$ quint compile --help +quint compile + +compile a Quint specification into the target, the output is written to +stdout + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from filename) + [string] + --target the compilation target. Supported values: tlaplus, json + [string] [default: "json"] + --verbosity control how much output is produced (0 to 5)[number] [default: 2] +``` + +Given a quint specification as input, this command parses, resolves imports, +typechecks, and then "flattens" the specification into on module containing just +the needed definitions. + +The following compilation targets are supported + +- `json`: The default target, this produces a json representation, in the same + format which is described under [`parse`](#command-parse) and + [`typecheck`](#command-typecheck), below. +- `tlaplus`: Quint uses its integration with Apalache to compile the + specification into TLA+. + ## Command `parse` *Warning: The language is still in active development, and breaking changes are diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 189620ee3..da318605e 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -75,7 +75,7 @@ const supportedTarges = ['tlaplus', 'json'] // construct the compile subcommand const compileCmd = { command: 'compile ', - desc: 'compile a Quint specification into the target kind, the output is written to stdout', + desc: 'compile a Quint specification into the target, the output is written to stdout', builder: (yargs: any) => defaultOpts(yargs) .option('main', { From f10ab04b2ff6989d6114671679d41cb0652f414f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:48:55 -0400 Subject: [PATCH 304/428] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0326d518..4f2f95c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added polymorphic type declarations, allowing abstracting commonly used data types like `Option[a]` and `Result[err, ok]`. Note that this is not yet supported by `verify`. (#1298) +- Added `compile` subcommand, allowing compiling specs to TLA+ (via Apalache) + and to a JSON format. (#1309, #359) ### Changed From 2c03d4647668135bb4843b46caa55601aec62f88 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:03:11 -0400 Subject: [PATCH 305/428] Use () instead of {} for the unit We had been using the empty record `{}` for the unit, but this was causing problems with conversion to TLA+. We now use the empty tuple, `()`, which is easily and type-correctly represented in TLA+ as `<<>>`. --- quint/io-cli-tests.md | 2 +- quint/src/generated/Quint.g4 | 3 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintListener.ts | 14 + quint/src/generated/QuintParser.ts | 1071 +++++++++--------- quint/src/generated/QuintVisitor.ts | 9 + quint/src/ir/quintTypes.ts | 16 +- quint/src/parsing/ToIrListener.ts | 7 +- quint/src/types/constraintGenerator.ts | 4 +- quint/test/runtime/compile.test.ts | 2 +- quint/test/types/aliasInliner.test.ts | 6 +- quint/test/types/constraintGenerator.test.ts | 8 - quint/test/types/inferrer.test.ts | 38 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- 15 files changed, 623 insertions(+), 563 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 6907f5c47..d9744bc60 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1130,7 +1130,7 @@ rm xTest.itf.json ``` -[{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] +[{"#meta":{"index":0},"x":{"tag":"None","value":{"#tup":[]}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] ``` ### FAIL on parsing filenames with different casing diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 5e571e491..b562a451a 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -176,8 +176,9 @@ expr: // apply a built-in operator via the dot notation | 'all' '{' expr (',' expr)* ','? '}' # actionAll | 'any' '{' expr (',' expr)* ','? '}' # actionAny | ( qualId | INT | BOOL | STRING) # literalOrId - // a tuple constructor, the form tup(...) is just an operator call + // a tuple constructor, the form Tup(...) is just an operator call | '(' expr ',' expr (',' expr)* ','? ')' # tuple + | '(' ')' # unit // short-hand syntax for pairs, mainly designed for maps | expr '->' expr # pair | '{' recElem (',' recElem)* ','? '}' # record diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index f54adf8d9..f372f04a1 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 562, 10, 24, 12, 24, 14, 24, 565, 11, 24, 3, 24, 5, 24, 568, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 576, 10, 24, 12, 24, 14, 24, 579, 11, 24, 5, 24, 581, 10, 24, 3, 24, 5, 24, 584, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 609, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 658, 10, 24, 12, 24, 14, 24, 661, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 667, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 672, 10, 25, 12, 25, 14, 25, 675, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 681, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 690, 10, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 704, 10, 28, 3, 29, 3, 29, 5, 29, 708, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 718, 10, 30, 12, 30, 14, 30, 721, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 727, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 734, 10, 31, 13, 31, 14, 31, 735, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 755, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 760, 10, 36, 12, 36, 14, 36, 763, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 771, 10, 37, 3, 38, 3, 38, 5, 38, 775, 10, 38, 3, 39, 3, 39, 5, 39, 779, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 788, 10, 42, 12, 42, 14, 42, 791, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 797, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 898, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 608, 3, 2, 2, 2, 48, 662, 3, 2, 2, 2, 50, 680, 3, 2, 2, 2, 52, 685, 3, 2, 2, 2, 54, 703, 3, 2, 2, 2, 56, 707, 3, 2, 2, 2, 58, 726, 3, 2, 2, 2, 60, 728, 3, 2, 2, 2, 62, 744, 3, 2, 2, 2, 64, 746, 3, 2, 2, 2, 66, 748, 3, 2, 2, 2, 68, 754, 3, 2, 2, 2, 70, 756, 3, 2, 2, 2, 72, 770, 3, 2, 2, 2, 74, 774, 3, 2, 2, 2, 76, 778, 3, 2, 2, 2, 78, 780, 3, 2, 2, 2, 80, 782, 3, 2, 2, 2, 82, 784, 3, 2, 2, 2, 84, 796, 3, 2, 2, 2, 86, 798, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 609, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 609, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 609, 5, 46, 24, 27, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 23, 473, 609, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 609, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 609, 3, 2, 2, 2, 504, 609, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 609, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 609, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 609, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 609, 3, 2, 2, 2, 557, 558, 7, 4, 2, 2, 558, 563, 5, 72, 37, 2, 559, 560, 7, 10, 2, 2, 560, 562, 5, 72, 37, 2, 561, 559, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 568, 7, 10, 2, 2, 567, 566, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 7, 5, 2, 2, 570, 609, 3, 2, 2, 2, 571, 580, 7, 13, 2, 2, 572, 577, 5, 46, 24, 2, 573, 574, 7, 10, 2, 2, 574, 576, 5, 46, 24, 2, 575, 573, 3, 2, 2, 2, 576, 579, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 580, 572, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 583, 3, 2, 2, 2, 582, 584, 7, 10, 2, 2, 583, 582, 3, 2, 2, 2, 583, 584, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 609, 7, 14, 2, 2, 586, 587, 7, 37, 2, 2, 587, 588, 7, 63, 2, 2, 588, 589, 5, 46, 24, 2, 589, 590, 7, 64, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 38, 2, 2, 592, 593, 5, 46, 24, 7, 593, 609, 3, 2, 2, 2, 594, 595, 5, 10, 6, 2, 595, 596, 5, 46, 24, 6, 596, 609, 3, 2, 2, 2, 597, 598, 5, 20, 11, 2, 598, 599, 5, 46, 24, 5, 599, 609, 3, 2, 2, 2, 600, 601, 7, 63, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 64, 2, 2, 603, 609, 3, 2, 2, 2, 604, 605, 7, 4, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 5, 2, 2, 607, 609, 3, 2, 2, 2, 608, 458, 3, 2, 2, 2, 608, 460, 3, 2, 2, 2, 608, 467, 3, 2, 2, 2, 608, 469, 3, 2, 2, 2, 608, 474, 3, 2, 2, 2, 608, 489, 3, 2, 2, 2, 608, 504, 3, 2, 2, 2, 608, 505, 3, 2, 2, 2, 608, 520, 3, 2, 2, 2, 608, 539, 3, 2, 2, 2, 608, 541, 3, 2, 2, 2, 608, 557, 3, 2, 2, 2, 608, 571, 3, 2, 2, 2, 608, 586, 3, 2, 2, 2, 608, 594, 3, 2, 2, 2, 608, 597, 3, 2, 2, 2, 608, 600, 3, 2, 2, 2, 608, 604, 3, 2, 2, 2, 609, 659, 3, 2, 2, 2, 610, 611, 12, 28, 2, 2, 611, 612, 7, 33, 2, 2, 612, 658, 5, 46, 24, 28, 613, 614, 12, 26, 2, 2, 614, 615, 9, 2, 2, 2, 615, 658, 5, 46, 24, 27, 616, 617, 12, 25, 2, 2, 617, 618, 9, 3, 2, 2, 618, 658, 5, 46, 24, 26, 619, 620, 12, 24, 2, 2, 620, 621, 9, 4, 2, 2, 621, 658, 5, 46, 24, 25, 622, 623, 12, 22, 2, 2, 623, 624, 7, 62, 2, 2, 624, 625, 5, 46, 24, 23, 625, 626, 8, 24, 1, 2, 626, 658, 3, 2, 2, 2, 627, 628, 12, 20, 2, 2, 628, 629, 7, 45, 2, 2, 629, 658, 5, 46, 24, 21, 630, 631, 12, 18, 2, 2, 631, 632, 7, 46, 2, 2, 632, 658, 5, 46, 24, 19, 633, 634, 12, 17, 2, 2, 634, 635, 7, 47, 2, 2, 635, 658, 5, 46, 24, 18, 636, 637, 12, 16, 2, 2, 637, 638, 7, 48, 2, 2, 638, 658, 5, 46, 24, 17, 639, 640, 12, 10, 2, 2, 640, 641, 7, 28, 2, 2, 641, 658, 5, 46, 24, 11, 642, 643, 12, 32, 2, 2, 643, 644, 7, 24, 2, 2, 644, 650, 5, 76, 39, 2, 645, 647, 7, 63, 2, 2, 646, 648, 5, 70, 36, 2, 647, 646, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 64, 2, 2, 650, 645, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 658, 3, 2, 2, 2, 652, 653, 12, 29, 2, 2, 653, 654, 7, 13, 2, 2, 654, 655, 5, 46, 24, 2, 655, 656, 7, 14, 2, 2, 656, 658, 3, 2, 2, 2, 657, 610, 3, 2, 2, 2, 657, 613, 3, 2, 2, 2, 657, 616, 3, 2, 2, 2, 657, 619, 3, 2, 2, 2, 657, 622, 3, 2, 2, 2, 657, 627, 3, 2, 2, 2, 657, 630, 3, 2, 2, 2, 657, 633, 3, 2, 2, 2, 657, 636, 3, 2, 2, 2, 657, 639, 3, 2, 2, 2, 657, 642, 3, 2, 2, 2, 657, 652, 3, 2, 2, 2, 658, 661, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 47, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 662, 663, 7, 50, 2, 2, 663, 664, 5, 46, 24, 2, 664, 666, 7, 4, 2, 2, 665, 667, 7, 15, 2, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 673, 5, 50, 26, 2, 669, 670, 7, 15, 2, 2, 670, 672, 5, 50, 26, 2, 671, 669, 3, 2, 2, 2, 672, 675, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 676, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 676, 677, 7, 5, 2, 2, 677, 49, 3, 2, 2, 2, 678, 681, 5, 52, 27, 2, 679, 681, 7, 39, 2, 2, 680, 678, 3, 2, 2, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 7, 29, 2, 2, 683, 684, 5, 46, 24, 2, 684, 51, 3, 2, 2, 2, 685, 692, 5, 84, 43, 2, 686, 689, 7, 63, 2, 2, 687, 690, 5, 84, 43, 2, 688, 690, 7, 39, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 693, 7, 64, 2, 2, 692, 686, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 695, 5, 8, 5, 2, 695, 696, 7, 2, 2, 3, 696, 704, 3, 2, 2, 2, 697, 698, 5, 46, 24, 2, 698, 699, 7, 2, 2, 3, 699, 704, 3, 2, 2, 2, 700, 701, 7, 69, 2, 2, 701, 704, 7, 2, 2, 3, 702, 704, 7, 2, 2, 3, 703, 694, 3, 2, 2, 2, 703, 697, 3, 2, 2, 2, 703, 700, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 55, 3, 2, 2, 2, 705, 708, 5, 58, 30, 2, 706, 708, 5, 60, 31, 2, 707, 705, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 57, 3, 2, 2, 2, 709, 710, 5, 64, 33, 2, 710, 711, 7, 29, 2, 2, 711, 712, 5, 46, 24, 2, 712, 727, 3, 2, 2, 2, 713, 714, 7, 63, 2, 2, 714, 719, 5, 64, 33, 2, 715, 716, 7, 10, 2, 2, 716, 718, 5, 64, 33, 2, 717, 715, 3, 2, 2, 2, 718, 721, 3, 2, 2, 2, 719, 717, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 722, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 722, 723, 7, 64, 2, 2, 723, 724, 7, 29, 2, 2, 724, 725, 5, 46, 24, 2, 725, 727, 3, 2, 2, 2, 726, 709, 3, 2, 2, 2, 726, 713, 3, 2, 2, 2, 727, 59, 3, 2, 2, 2, 728, 729, 7, 63, 2, 2, 729, 730, 7, 63, 2, 2, 730, 733, 5, 64, 33, 2, 731, 732, 7, 10, 2, 2, 732, 734, 5, 64, 33, 2, 733, 731, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 7, 64, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 29, 2, 2, 740, 741, 5, 46, 24, 2, 741, 61, 3, 2, 2, 2, 742, 745, 7, 39, 2, 2, 743, 745, 5, 82, 42, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 63, 3, 2, 2, 2, 746, 747, 5, 62, 32, 2, 747, 65, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 750, 7, 7, 2, 2, 750, 751, 5, 38, 20, 2, 751, 67, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 82, 42, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 69, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 71, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 84, 43, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 73, 3, 2, 2, 2, 772, 775, 5, 82, 42, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 75, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 77, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 79, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 81, 3, 2, 2, 2, 784, 789, 5, 86, 44, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 86, 44, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 83, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 86, 44, 2, 793, 794, 5, 82, 42, 2, 794, 795, 8, 43, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 85, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 563, 567, 577, 580, 583, 608, 647, 650, 657, 659, 666, 673, 680, 689, 692, 703, 707, 719, 726, 735, 744, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 803, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 564, 10, 24, 12, 24, 14, 24, 567, 11, 24, 3, 24, 5, 24, 570, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 578, 10, 24, 12, 24, 14, 24, 581, 11, 24, 5, 24, 583, 10, 24, 3, 24, 5, 24, 586, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 611, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 650, 10, 24, 3, 24, 5, 24, 653, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 660, 10, 24, 12, 24, 14, 24, 663, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 669, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 674, 10, 25, 12, 25, 14, 25, 677, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 683, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 692, 10, 27, 3, 27, 5, 27, 695, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 706, 10, 28, 3, 29, 3, 29, 5, 29, 710, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 720, 10, 30, 12, 30, 14, 30, 723, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 729, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 736, 10, 31, 13, 31, 14, 31, 737, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 747, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 757, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 762, 10, 36, 12, 36, 14, 36, 765, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 773, 10, 37, 3, 38, 3, 38, 5, 38, 777, 10, 38, 3, 39, 3, 39, 5, 39, 781, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 790, 10, 42, 12, 42, 14, 42, 793, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 799, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 901, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 610, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 682, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 705, 3, 2, 2, 2, 56, 709, 3, 2, 2, 2, 58, 728, 3, 2, 2, 2, 60, 730, 3, 2, 2, 2, 62, 746, 3, 2, 2, 2, 64, 748, 3, 2, 2, 2, 66, 750, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 758, 3, 2, 2, 2, 72, 772, 3, 2, 2, 2, 74, 776, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 786, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 800, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 611, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 611, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 611, 5, 46, 24, 28, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 24, 473, 611, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 611, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 611, 3, 2, 2, 2, 504, 611, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 611, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 611, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 611, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 611, 3, 2, 2, 2, 557, 558, 7, 63, 2, 2, 558, 611, 7, 64, 2, 2, 559, 560, 7, 4, 2, 2, 560, 565, 5, 72, 37, 2, 561, 562, 7, 10, 2, 2, 562, 564, 5, 72, 37, 2, 563, 561, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 568, 570, 7, 10, 2, 2, 569, 568, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 572, 7, 5, 2, 2, 572, 611, 3, 2, 2, 2, 573, 582, 7, 13, 2, 2, 574, 579, 5, 46, 24, 2, 575, 576, 7, 10, 2, 2, 576, 578, 5, 46, 24, 2, 577, 575, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 582, 574, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 586, 7, 10, 2, 2, 585, 584, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 611, 7, 14, 2, 2, 588, 589, 7, 37, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 38, 2, 2, 594, 595, 5, 46, 24, 7, 595, 611, 3, 2, 2, 2, 596, 597, 5, 10, 6, 2, 597, 598, 5, 46, 24, 6, 598, 611, 3, 2, 2, 2, 599, 600, 5, 20, 11, 2, 600, 601, 5, 46, 24, 5, 601, 611, 3, 2, 2, 2, 602, 603, 7, 63, 2, 2, 603, 604, 5, 46, 24, 2, 604, 605, 7, 64, 2, 2, 605, 611, 3, 2, 2, 2, 606, 607, 7, 4, 2, 2, 607, 608, 5, 46, 24, 2, 608, 609, 7, 5, 2, 2, 609, 611, 3, 2, 2, 2, 610, 458, 3, 2, 2, 2, 610, 460, 3, 2, 2, 2, 610, 467, 3, 2, 2, 2, 610, 469, 3, 2, 2, 2, 610, 474, 3, 2, 2, 2, 610, 489, 3, 2, 2, 2, 610, 504, 3, 2, 2, 2, 610, 505, 3, 2, 2, 2, 610, 520, 3, 2, 2, 2, 610, 539, 3, 2, 2, 2, 610, 541, 3, 2, 2, 2, 610, 557, 3, 2, 2, 2, 610, 559, 3, 2, 2, 2, 610, 573, 3, 2, 2, 2, 610, 588, 3, 2, 2, 2, 610, 596, 3, 2, 2, 2, 610, 599, 3, 2, 2, 2, 610, 602, 3, 2, 2, 2, 610, 606, 3, 2, 2, 2, 611, 661, 3, 2, 2, 2, 612, 613, 12, 29, 2, 2, 613, 614, 7, 33, 2, 2, 614, 660, 5, 46, 24, 29, 615, 616, 12, 27, 2, 2, 616, 617, 9, 2, 2, 2, 617, 660, 5, 46, 24, 28, 618, 619, 12, 26, 2, 2, 619, 620, 9, 3, 2, 2, 620, 660, 5, 46, 24, 27, 621, 622, 12, 25, 2, 2, 622, 623, 9, 4, 2, 2, 623, 660, 5, 46, 24, 26, 624, 625, 12, 23, 2, 2, 625, 626, 7, 62, 2, 2, 626, 627, 5, 46, 24, 24, 627, 628, 8, 24, 1, 2, 628, 660, 3, 2, 2, 2, 629, 630, 12, 21, 2, 2, 630, 631, 7, 45, 2, 2, 631, 660, 5, 46, 24, 22, 632, 633, 12, 19, 2, 2, 633, 634, 7, 46, 2, 2, 634, 660, 5, 46, 24, 20, 635, 636, 12, 18, 2, 2, 636, 637, 7, 47, 2, 2, 637, 660, 5, 46, 24, 19, 638, 639, 12, 17, 2, 2, 639, 640, 7, 48, 2, 2, 640, 660, 5, 46, 24, 18, 641, 642, 12, 10, 2, 2, 642, 643, 7, 28, 2, 2, 643, 660, 5, 46, 24, 11, 644, 645, 12, 33, 2, 2, 645, 646, 7, 24, 2, 2, 646, 652, 5, 76, 39, 2, 647, 649, 7, 63, 2, 2, 648, 650, 5, 70, 36, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 7, 64, 2, 2, 652, 647, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 12, 30, 2, 2, 655, 656, 7, 13, 2, 2, 656, 657, 5, 46, 24, 2, 657, 658, 7, 14, 2, 2, 658, 660, 3, 2, 2, 2, 659, 612, 3, 2, 2, 2, 659, 615, 3, 2, 2, 2, 659, 618, 3, 2, 2, 2, 659, 621, 3, 2, 2, 2, 659, 624, 3, 2, 2, 2, 659, 629, 3, 2, 2, 2, 659, 632, 3, 2, 2, 2, 659, 635, 3, 2, 2, 2, 659, 638, 3, 2, 2, 2, 659, 641, 3, 2, 2, 2, 659, 644, 3, 2, 2, 2, 659, 654, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 47, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 50, 2, 2, 665, 666, 5, 46, 24, 2, 666, 668, 7, 4, 2, 2, 667, 669, 7, 15, 2, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 675, 5, 50, 26, 2, 671, 672, 7, 15, 2, 2, 672, 674, 5, 50, 26, 2, 673, 671, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 678, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 679, 7, 5, 2, 2, 679, 49, 3, 2, 2, 2, 680, 683, 5, 52, 27, 2, 681, 683, 7, 39, 2, 2, 682, 680, 3, 2, 2, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 7, 29, 2, 2, 685, 686, 5, 46, 24, 2, 686, 51, 3, 2, 2, 2, 687, 694, 5, 84, 43, 2, 688, 691, 7, 63, 2, 2, 689, 692, 5, 84, 43, 2, 690, 692, 7, 39, 2, 2, 691, 689, 3, 2, 2, 2, 691, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 7, 64, 2, 2, 694, 688, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 53, 3, 2, 2, 2, 696, 697, 5, 8, 5, 2, 697, 698, 7, 2, 2, 3, 698, 706, 3, 2, 2, 2, 699, 700, 5, 46, 24, 2, 700, 701, 7, 2, 2, 3, 701, 706, 3, 2, 2, 2, 702, 703, 7, 69, 2, 2, 703, 706, 7, 2, 2, 3, 704, 706, 7, 2, 2, 3, 705, 696, 3, 2, 2, 2, 705, 699, 3, 2, 2, 2, 705, 702, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 55, 3, 2, 2, 2, 707, 710, 5, 58, 30, 2, 708, 710, 5, 60, 31, 2, 709, 707, 3, 2, 2, 2, 709, 708, 3, 2, 2, 2, 710, 57, 3, 2, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 46, 24, 2, 714, 729, 3, 2, 2, 2, 715, 716, 7, 63, 2, 2, 716, 721, 5, 64, 33, 2, 717, 718, 7, 10, 2, 2, 718, 720, 5, 64, 33, 2, 719, 717, 3, 2, 2, 2, 720, 723, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 724, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 724, 725, 7, 64, 2, 2, 725, 726, 7, 29, 2, 2, 726, 727, 5, 46, 24, 2, 727, 729, 3, 2, 2, 2, 728, 711, 3, 2, 2, 2, 728, 715, 3, 2, 2, 2, 729, 59, 3, 2, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 63, 2, 2, 732, 735, 5, 64, 33, 2, 733, 734, 7, 10, 2, 2, 734, 736, 5, 64, 33, 2, 735, 733, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 735, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 64, 2, 2, 741, 742, 7, 29, 2, 2, 742, 743, 5, 46, 24, 2, 743, 61, 3, 2, 2, 2, 744, 747, 7, 39, 2, 2, 745, 747, 5, 82, 42, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 63, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 65, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 752, 7, 7, 2, 2, 752, 753, 5, 38, 20, 2, 753, 67, 3, 2, 2, 2, 754, 757, 7, 53, 2, 2, 755, 757, 5, 82, 42, 2, 756, 754, 3, 2, 2, 2, 756, 755, 3, 2, 2, 2, 757, 69, 3, 2, 2, 2, 758, 763, 5, 46, 24, 2, 759, 760, 7, 10, 2, 2, 760, 762, 5, 46, 24, 2, 761, 759, 3, 2, 2, 2, 762, 765, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 71, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 766, 767, 5, 84, 43, 2, 767, 768, 7, 7, 2, 2, 768, 769, 5, 46, 24, 2, 769, 773, 3, 2, 2, 2, 770, 771, 7, 40, 2, 2, 771, 773, 5, 46, 24, 2, 772, 766, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 73, 3, 2, 2, 2, 774, 777, 5, 82, 42, 2, 775, 777, 9, 5, 2, 2, 776, 774, 3, 2, 2, 2, 776, 775, 3, 2, 2, 2, 777, 75, 3, 2, 2, 2, 778, 781, 5, 82, 42, 2, 779, 781, 9, 6, 2, 2, 780, 778, 3, 2, 2, 2, 780, 779, 3, 2, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 7, 2, 2, 783, 79, 3, 2, 2, 2, 784, 785, 9, 8, 2, 2, 785, 81, 3, 2, 2, 2, 786, 791, 5, 86, 44, 2, 787, 788, 7, 41, 2, 2, 788, 790, 5, 86, 44, 2, 789, 787, 3, 2, 2, 2, 790, 793, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 83, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 794, 799, 5, 86, 44, 2, 795, 796, 5, 82, 42, 2, 796, 797, 8, 43, 1, 2, 797, 799, 3, 2, 2, 2, 798, 794, 3, 2, 2, 2, 798, 795, 3, 2, 2, 2, 799, 85, 3, 2, 2, 2, 800, 801, 9, 9, 2, 2, 801, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 565, 569, 579, 582, 585, 610, 649, 652, 659, 661, 668, 675, 682, 691, 694, 705, 709, 721, 728, 737, 746, 756, 763, 772, 776, 780, 791, 798] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 7eade795d..0c24f2792 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -47,6 +47,7 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; @@ -609,6 +610,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTuple?: (ctx: TupleContext) => void; + /** + * Enter a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + enterUnit?: (ctx: UnitContext) => void; + /** + * Exit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + exitUnit?: (ctx: UnitContext) => void; + /** * Enter a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 8cb906851..42faa5ee2 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1881,7 +1881,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 606; + this.state = 608; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1927,7 +1927,7 @@ export class QuintParser extends Parser { this.state = 465; this.match(QuintParser.MINUS); this.state = 466; - this.expr(25); + this.expr(26); } break; @@ -1943,7 +1943,7 @@ export class QuintParser extends Parser { this.state = 469; this.match(QuintParser.ASGN); this.state = 470; - this.expr(21); + this.expr(22); } break; @@ -2220,172 +2220,184 @@ export class QuintParser extends Parser { case 12: { - _localctx = new RecordContext(_localctx); + _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; this.state = 555; - this.match(QuintParser.T__1); + this.match(QuintParser.LPAREN); this.state = 556; + this.match(QuintParser.RPAREN); + } + break; + + case 13: + { + _localctx = new RecordContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 557; + this.match(QuintParser.T__1); + this.state = 558; this.recElem(); - this.state = 561; + this.state = 563; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 557; + this.state = 559; this.match(QuintParser.T__7); - this.state = 558; + this.state = 560; this.recElem(); } } } - this.state = 563; + this.state = 565; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 565; + this.state = 567; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 564; + this.state = 566; this.match(QuintParser.T__7); } } - this.state = 567; + this.state = 569; this.match(QuintParser.T__2); } break; - case 13: + case 14: { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 569; + this.state = 571; this.match(QuintParser.T__10); - this.state = 578; + this.state = 580; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 570; + this.state = 572; this.expr(0); - this.state = 575; + this.state = 577; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 571; + this.state = 573; this.match(QuintParser.T__7); - this.state = 572; + this.state = 574; this.expr(0); } } } - this.state = 577; + this.state = 579; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 581; + this.state = 583; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 580; + this.state = 582; this.match(QuintParser.T__7); } } - this.state = 583; + this.state = 585; this.match(QuintParser.T__11); } break; - case 14: + case 15: { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 584; - this.match(QuintParser.T__34); - this.state = 585; - this.match(QuintParser.LPAREN); this.state = 586; - this.expr(0); + this.match(QuintParser.T__34); this.state = 587; - this.match(QuintParser.RPAREN); + this.match(QuintParser.LPAREN); this.state = 588; this.expr(0); this.state = 589; - this.match(QuintParser.T__35); + this.match(QuintParser.RPAREN); this.state = 590; + this.expr(0); + this.state = 591; + this.match(QuintParser.T__35); + this.state = 592; this.expr(5); } break; - case 15: + case 16: { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 592; + this.state = 594; this.operDef(); - this.state = 593; + this.state = 595; this.expr(4); } break; - case 16: + case 17: { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 595; + this.state = 597; this.nondetOperDef(); - this.state = 596; + this.state = 598; this.expr(3); } break; - case 17: + case 18: { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 598; + this.state = 600; this.match(QuintParser.LPAREN); - this.state = 599; + this.state = 601; this.expr(0); - this.state = 600; + this.state = 602; this.match(QuintParser.RPAREN); } break; - case 18: + case 19: { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 604; this.match(QuintParser.T__1); - this.state = 603; + this.state = 605; this.expr(0); - this.state = 604; + this.state = 606; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 657; + this.state = 659; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2395,21 +2407,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 655; + this.state = 657; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; - if (!(this.precpred(this._ctx, 26))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); + this.state = 610; + if (!(this.precpred(this._ctx, 27))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 609; + this.state = 611; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 610; - this.expr(26); + this.state = 612; + this.expr(27); } break; @@ -2417,11 +2429,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 611; - if (!(this.precpred(this._ctx, 24))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); + this.state = 613; + if (!(this.precpred(this._ctx, 25))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); } - this.state = 612; + this.state = 614; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2434,8 +2446,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 613; - this.expr(25); + this.state = 615; + this.expr(26); } break; @@ -2443,11 +2455,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 614; - if (!(this.precpred(this._ctx, 23))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); + this.state = 616; + if (!(this.precpred(this._ctx, 24))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 615; + this.state = 617; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2460,8 +2472,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 616; - this.expr(24); + this.state = 618; + this.expr(25); } break; @@ -2469,11 +2481,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 617; - if (!(this.precpred(this._ctx, 22))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); + this.state = 619; + if (!(this.precpred(this._ctx, 23))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 618; + this.state = 620; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2486,8 +2498,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 619; - this.expr(23); + this.state = 621; + this.expr(24); } break; @@ -2495,14 +2507,14 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 620; - if (!(this.precpred(this._ctx, 20))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); + this.state = 622; + if (!(this.precpred(this._ctx, 21))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); } - this.state = 621; + this.state = 623; this.match(QuintParser.ASGN); - this.state = 622; - this.expr(21); + this.state = 624; + this.expr(22); const m = "[QNT006] unexpected '=', did you mean '=='?" this.notifyErrorListeners(m) @@ -2514,14 +2526,14 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 625; - if (!(this.precpred(this._ctx, 18))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); + this.state = 627; + if (!(this.precpred(this._ctx, 19))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 626; + this.state = 628; this.match(QuintParser.AND); - this.state = 627; - this.expr(19); + this.state = 629; + this.expr(20); } break; @@ -2529,14 +2541,14 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 628; - if (!(this.precpred(this._ctx, 16))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); + this.state = 630; + if (!(this.precpred(this._ctx, 17))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } - this.state = 629; + this.state = 631; this.match(QuintParser.OR); - this.state = 630; - this.expr(17); + this.state = 632; + this.expr(18); } break; @@ -2544,14 +2556,14 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 631; - if (!(this.precpred(this._ctx, 15))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); + this.state = 633; + if (!(this.precpred(this._ctx, 16))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 632; + this.state = 634; this.match(QuintParser.IFF); - this.state = 633; - this.expr(16); + this.state = 635; + this.expr(17); } break; @@ -2559,14 +2571,14 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 634; - if (!(this.precpred(this._ctx, 14))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + this.state = 636; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 635; + this.state = 637; this.match(QuintParser.IMPLIES); - this.state = 636; - this.expr(15); + this.state = 638; + this.expr(16); } break; @@ -2574,13 +2586,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 637; + this.state = 639; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 638; + this.state = 640; this.match(QuintParser.T__25); - this.state = 639; + this.state = 641; this.expr(9); } break; @@ -2589,32 +2601,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 640; - if (!(this.precpred(this._ctx, 30))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); + this.state = 642; + if (!(this.precpred(this._ctx, 31))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); } - this.state = 641; + this.state = 643; this.match(QuintParser.T__21); - this.state = 642; + this.state = 644; this.nameAfterDot(); - this.state = 648; + this.state = 650; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 643; - this.match(QuintParser.LPAREN); this.state = 645; + this.match(QuintParser.LPAREN); + this.state = 647; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 644; + this.state = 646; this.argList(); } } - this.state = 647; + this.state = 649; this.match(QuintParser.RPAREN); } break; @@ -2626,22 +2638,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 650; - if (!(this.precpred(this._ctx, 27))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); + this.state = 652; + if (!(this.precpred(this._ctx, 28))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); } - this.state = 651; + this.state = 653; this.match(QuintParser.T__10); - this.state = 652; + this.state = 654; this.expr(0); - this.state = 653; + this.state = 655; this.match(QuintParser.T__11); } break; } } } - this.state = 659; + this.state = 661; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2669,43 +2681,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 660; + this.state = 662; this.match(QuintParser.MATCH); - this.state = 661; + this.state = 663; this.expr(0); - this.state = 662; - this.match(QuintParser.T__1); this.state = 664; + this.match(QuintParser.T__1); + this.state = 666; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 663; + this.state = 665; this.match(QuintParser.T__12); } } - this.state = 666; + this.state = 668; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 671; + this.state = 673; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 667; + this.state = 669; this.match(QuintParser.T__12); - this.state = 668; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 673; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 674; + this.state = 676; this.match(QuintParser.T__2); } } @@ -2730,28 +2742,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 678; + this.state = 680; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 676; + this.state = 678; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 677; + this.state = 679; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 680; + this.state = 682; this.match(QuintParser.T__26); - this.state = 681; + this.state = 683; this.expr(0); } } @@ -2778,36 +2790,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 683; + this.state = 685; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 690; + this.state = 692; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 684; + this.state = 686; this.match(QuintParser.LPAREN); - this.state = 687; + this.state = 689; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 685; + this.state = 687; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 686; + this.state = 688; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 689; + this.state = 691; this.match(QuintParser.RPAREN); } } @@ -2833,15 +2845,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 701; + this.state = 703; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 692; + this.state = 694; this.declaration(); - this.state = 693; + this.state = 695; this.match(QuintParser.EOF); } break; @@ -2849,9 +2861,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 695; + this.state = 697; this.expr(0); - this.state = 696; + this.state = 698; this.match(QuintParser.EOF); } break; @@ -2859,9 +2871,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 698; + this.state = 700; this.match(QuintParser.DOCCOMMENT); - this.state = 699; + this.state = 701; this.match(QuintParser.EOF); } break; @@ -2869,7 +2881,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 700; + this.state = 702; this.match(QuintParser.EOF); } break; @@ -2894,13 +2906,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 705; + this.state = 707; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 703; + this.state = 705; this.lambdaUnsugared(); } break; @@ -2908,7 +2920,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 704; + this.state = 706; this.lambdaTupleSugar(); } break; @@ -2934,7 +2946,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 724; + this.state = 726; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2942,42 +2954,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 709; this.parameter(); - this.state = 708; + this.state = 710; this.match(QuintParser.T__26); - this.state = 709; + this.state = 711; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 711; + this.state = 713; this.match(QuintParser.LPAREN); - this.state = 712; + this.state = 714; this.parameter(); - this.state = 717; + this.state = 719; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 713; + this.state = 715; this.match(QuintParser.T__7); - this.state = 714; + this.state = 716; this.parameter(); } } - this.state = 719; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 720; + this.state = 722; this.match(QuintParser.RPAREN); - this.state = 721; + this.state = 723; this.match(QuintParser.T__26); - this.state = 722; + this.state = 724; this.expr(0); } break; @@ -3007,35 +3019,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 726; + this.state = 728; this.match(QuintParser.LPAREN); - this.state = 727; + this.state = 729; this.match(QuintParser.LPAREN); - this.state = 728; + this.state = 730; this.parameter(); - this.state = 731; + this.state = 733; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 729; + this.state = 731; this.match(QuintParser.T__7); - this.state = 730; + this.state = 732; this.parameter(); } } - this.state = 733; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 735; + this.state = 737; this.match(QuintParser.RPAREN); - this.state = 736; + this.state = 738; this.match(QuintParser.RPAREN); - this.state = 737; + this.state = 739; this.match(QuintParser.T__26); - this.state = 738; + this.state = 740; this.expr(0); } } @@ -3058,13 +3070,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 742; + this.state = 744; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 740; + this.state = 742; this.match(QuintParser.T__36); } break; @@ -3072,7 +3084,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 741; + this.state = 743; this.qualId(); } break; @@ -3101,7 +3113,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 746; _localctx._paramName = this.identOrHole(); } } @@ -3126,11 +3138,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 748; _localctx._paramName = this.identOrHole(); - this.state = 747; + this.state = 749; this.match(QuintParser.T__4); - this.state = 748; + this.state = 750; this.type(0); } } @@ -3153,13 +3165,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 752; + this.state = 754; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 752; this.match(QuintParser.MUL); } break; @@ -3167,7 +3179,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 751; + this.state = 753; this.qualId(); } break; @@ -3197,21 +3209,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 756; this.expr(0); - this.state = 759; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 755; + this.state = 757; this.match(QuintParser.T__7); - this.state = 756; + this.state = 758; this.expr(0); } } - this.state = 761; + this.state = 763; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3236,27 +3248,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 768; + this.state = 770; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; + this.state = 764; this.simpleId("record"); - this.state = 763; + this.state = 765; this.match(QuintParser.T__4); - this.state = 764; + this.state = 766; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 766; + this.state = 768; this.match(QuintParser.T__37); - this.state = 767; + this.state = 769; this.expr(0); } break; @@ -3284,14 +3296,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 772; + this.state = 774; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 772; this.qualId(); } break; @@ -3304,7 +3316,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 771; + this.state = 773; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3343,14 +3355,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 776; + this.state = 778; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 776; this.qualId(); } break; @@ -3360,7 +3372,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 777; _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))) { @@ -3401,7 +3413,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 780; _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); @@ -3437,7 +3449,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 782; _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); @@ -3473,23 +3485,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 784; this.identifier(); - this.state = 787; + this.state = 789; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 783; + this.state = 785; this.match(QuintParser.T__38); - this.state = 784; + this.state = 786; this.identifier(); } } } - this.state = 789; + this.state = 791; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3514,13 +3526,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 794; + this.state = 796; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 790; + this.state = 792; this.identifier(); } break; @@ -3528,7 +3540,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 791; + this.state = 793; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3564,7 +3576,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 796; + this.state = 798; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3616,47 +3628,47 @@ export class QuintParser extends Parser { private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { case 2: - return this.precpred(this._ctx, 26); + return this.precpred(this._ctx, 27); case 3: - return this.precpred(this._ctx, 24); + return this.precpred(this._ctx, 25); case 4: - return this.precpred(this._ctx, 23); + return this.precpred(this._ctx, 24); case 5: - return this.precpred(this._ctx, 22); + return this.precpred(this._ctx, 23); case 6: - return this.precpred(this._ctx, 20); + return this.precpred(this._ctx, 21); case 7: - return this.precpred(this._ctx, 18); + return this.precpred(this._ctx, 19); case 8: - return this.precpred(this._ctx, 16); + return this.precpred(this._ctx, 17); case 9: - return this.precpred(this._ctx, 15); + return this.precpred(this._ctx, 16); case 10: - return this.precpred(this._ctx, 14); + return this.precpred(this._ctx, 15); case 11: return this.precpred(this._ctx, 8); case 12: - return this.precpred(this._ctx, 30); + return this.precpred(this._ctx, 31); case 13: - return this.precpred(this._ctx, 27); + return this.precpred(this._ctx, 28); } return true; } private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0323\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" + @@ -3717,142 +3729,142 @@ export class QuintParser extends Parser { "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + - "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u0232\n\x18\f\x18\x0E\x18\u0235\v\x18\x03\x18\x05\x18\u0238\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0240\n\x18\f\x18" + - "\x0E\x18\u0243\v\x18\x05\x18\u0245\n\x18\x03\x18\x05\x18\u0248\n\x18\x03" + + "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x07\x18\u0234\n\x18\f\x18\x0E\x18\u0237\v\x18\x03\x18\x05\x18" + + "\u023A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0242" + + "\n\x18\f\x18\x0E\x18\u0245\v\x18\x05\x18\u0247\n\x18\x03\x18\x05\x18\u024A" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0263\n\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0261\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0288\n\x18\x03\x18\x05\x18\u028B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x07\x18\u0292\n\x18\f\x18\x0E\x18\u0295\v\x18\x03\x19\x03\x19" + - "\x03\x19\x03\x19\x05\x19\u029B\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A0" + - "\n\x19\f\x19\x0E\x19\u02A3\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A" + - "\u02A9\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" + - "\x1B\u02B2\n\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C0\n\x1C\x03\x1D" + - "\x03\x1D\x05\x1D\u02C4\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x07\x1E\u02CE\n\x1E\f\x1E\x0E\x1E\u02D1\v\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D7\n\x1E\x03\x1F\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x06\x1F\u02DE\n\x1F\r\x1F\x0E\x1F\u02DF\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02E9\n \x03!\x03!\x03\"\x03\"" + - "\x03\"\x03\"\x03#\x03#\x05#\u02F3\n#\x03$\x03$\x03$\x07$\u02F8\n$\f$\x0E" + - "$\u02FB\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0303\n%\x03&\x03&\x05&" + - "\u0307\n&\x03\'\x03\'\x05\'\u030B\n\'\x03(\x03(\x03)\x03)\x03*\x03*\x03" + - "*\x07*\u0314\n*\f*\x0E*\u0317\v*\x03+\x03+\x03+\x03+\x05+\u031D\n+\x03" + - ",\x03,\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@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + - "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + - "03=\x03\x02*,\x03\x02CD\x02\u0382\x02Y\x03\x02\x02\x02\x04b\x03\x02\x02" + - "\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02\x02\x02" + - "\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03\x02\x02\x02" + - "\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101\x03\x02\x02" + - "\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C\u0152\x03" + - "\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02\"\u0158" + - "\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02(\u01AF" + - "\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02.\u0260" + - "\x03\x02\x02\x020\u0296\x03\x02\x02\x022\u02A8\x03\x02\x02\x024\u02AD" + - "\x03\x02\x02\x026\u02BF\x03\x02\x02\x028\u02C3\x03\x02\x02\x02:\u02D6" + - "\x03\x02\x02\x02<\u02D8\x03\x02\x02\x02>\u02E8\x03\x02\x02\x02@\u02EA" + - "\x03\x02\x02\x02B\u02EC\x03\x02\x02\x02D\u02F2\x03\x02\x02\x02F\u02F4" + - "\x03\x02\x02\x02H\u0302\x03\x02\x02\x02J\u0306\x03\x02\x02\x02L\u030A" + - "\x03\x02\x02\x02N\u030C\x03\x02\x02\x02P\u030E\x03\x02\x02\x02R\u0310" + - "\x03\x02\x02\x02T\u031C\x03\x02\x02\x02V\u031E\x03\x02\x02\x02XZ\x05\x04" + - "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + - "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + - "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + - "bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03\x02\x02" + - "fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02\x02jm\x03" + - "\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03" + - "\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02\x02qp\x03" + - "\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02\x02tv\x03" + - "\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02\x02\x02xy" + - "\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02|\x8D\x03" + - "\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02\x02\x80" + - "\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02\x83\x84" + - "\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03\x02\x02" + - "\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05\f\x07\x02" + - "\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02\x02\x02\x8C" + - "}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02\x02\x02\x8C" + - "\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02\x02\x02\x8C" + - "\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16\f\x02\x8F\x90" + - "\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93\x07\n\x02\x02" + - "\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96" + - "\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03\x02\x02\x02\x98" + - "\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B" + - "\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03" + - "\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07" + - "\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03" + - "\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02" + - "\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7" + - "\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC" + - "\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6" + - "\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2" + - "\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5" + - "\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3" + - "\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8" + - "\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03" + - "\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03" + - "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03" + - "\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07" + - "\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + - "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + - "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + - "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + - "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9" + - "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02" + - "\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + - "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + - "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02" + - "\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02" + - "\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + - "\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02" + - "\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02" + - "\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02" + - "\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07" + - "@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03" + - "\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05" + - "R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02" + - "\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02" + - "\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02" + - "\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02" + - "\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11" + - "\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07" + - "\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101" + - "\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02" + - "\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02" + - "\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104" + - "\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02" + - "\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13" + - "\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116" + - "\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02" + - "\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010D\x03" + - "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111" + - "\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02" + - "\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103" + - "\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02" + - "\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119\u011A\x07" + - "\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D" + - "\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02" + - "\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120\u0121\x03" + - "\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122" + - "\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02" + - "\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02\u0127\u0128" + - "\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18\x02\u012A" + - "\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02" + - "\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A\x03" + - "\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131" + - "\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02" + - "\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139" + - "\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139" + - "\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02" + - "\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x05\x18\u028A\n\x18\x03\x18\x05\x18\u028D\n\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x07\x18\u0294\n\x18\f\x18\x0E\x18\u0297\v\x18\x03" + + "\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029D\n\x19\x03\x19\x03\x19\x03\x19" + + "\x07\x19\u02A2\n\x19\f\x19\x0E\x19\u02A5\v\x19\x03\x19\x03\x19\x03\x1A" + + "\x03\x1A\x05\x1A\u02AB\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x05\x1B\u02B4\n\x1B\x03\x1B\x05\x1B\u02B7\n\x1B\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C2" + + "\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C6\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D0\n\x1E\f\x1E\x0E\x1E" + + "\u02D3\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D9\n\x1E\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E0\n\x1F\r\x1F\x0E\x1F\u02E1" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EB\n \x03!" + + "\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F5\n#\x03$\x03$\x03$\x07" + + "$\u02FA\n$\f$\x0E$\u02FD\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0305\n" + + "%\x03&\x03&\x05&\u0309\n&\x03\'\x03\'\x05\'\u030D\n\'\x03(\x03(\x03)\x03" + + ")\x03*\x03*\x03*\x07*\u0316\n*\f*\x0E*\u0319\v*\x03+\x03+\x03+\x03+\x05" + + "+\u031F\n+\x03,\x03,\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@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02" + + "R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02" + + "-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0385\x02Y\x03\x02\x02\x02\x04" + + "b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03" + + "\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03" + + "\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101" + + "\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C" + + "\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02" + + "\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02" + + "(\u01AF\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02" + + ".\u0262\x03\x02\x02\x020\u0298\x03\x02\x02\x022\u02AA\x03\x02\x02\x02" + + "4\u02AF\x03\x02\x02\x026\u02C1\x03\x02\x02\x028\u02C5\x03\x02\x02\x02" + + ":\u02D8\x03\x02\x02\x02<\u02DA\x03\x02\x02\x02>\u02EA\x03\x02\x02\x02" + + "@\u02EC\x03\x02\x02\x02B\u02EE\x03\x02\x02\x02D\u02F4\x03\x02\x02\x02" + + "F\u02F6\x03\x02\x02\x02H\u0304\x03\x02\x02\x02J\u0308\x03\x02\x02\x02" + + "L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02\x02\x02" + + "R\u0312\x03\x02\x02\x02T\u031E\x03\x02\x02\x02V\u0320\x03\x02\x02\x02" + + "XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02" + + "[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02" + + "\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02" + + "\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03" + + "\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02" + + "\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02" + + "\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02" + + "\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02" + + "\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02" + + "\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02" + + "|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02" + + "\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02" + + "\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03" + + "\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05" + + "\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02" + + "\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02" + + "\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02" + + "\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16" + + "\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93" + + "\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03" + + "\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03" + + "\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07" + + "\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18" + + "\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02" + + "\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02" + + "\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5" + + "\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05" + + "@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02" + + "\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02" + + "\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02" + + "\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02" + + "\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&" + + "\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02" + + "\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02" + + "\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02" + + "\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02" + + "\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02" + + "\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3" + + "\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03" + + "\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>" + + "\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02" + + "\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02" + + "\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02" + + "\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4" + + "\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6" + + "\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9" + + "\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB" + + "\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD" + + "\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0" + + "\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3" + + "\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5" + + "\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05" + + "&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02" + + "\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10" + + "\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02" + + "\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02" + + "\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5" + + "\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102" + + "\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB" + + "\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02" + + "\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16" + + "\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA" + + "\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101" + + "\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02" + + "\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106" + + "\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108" + + "\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02" + + "\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F" + + "\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F" + + "\u010D\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02" + + "\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111" + + "\x03\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02" + + "\u0115\u0103\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03" + + "\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119" + + "\u011A\x07\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02" + + "\u011C\u011D\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07" + + "\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120" + + "\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02" + + "\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125" + + "\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02" + + "\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18" + + "\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07" + + ">\x02\x02\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A" + + "\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02" + + "\u0131\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03" + + "\x02\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136" + + "\u0139\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02" + + "\u0139\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03" + + "\x02\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + @@ -3916,168 +3928,169 @@ export class QuintParser extends Parser { "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + - "\x01\x02\u01CB\u0261\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + + "\x01\x02\u01CB\u0263\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + - "\u01D2\u0261\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0261\x05" + - ".\x18\x1B\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + - "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x17\u01D9\u0261\x03\x02\x02\x02\u01DA" + + "\u01D2\u0263\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0263\x05" + + ".\x18\x1C\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + + "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x18\u01D9\u0263\x03\x02\x02\x02\u01DA" + "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + - "\u01E8\u0261\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + + "\u01E8\u0263\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + - "\u01EF\x05.\x18\x02\u01EE\u01EC\x03\x02"; + "\u01EF\x05.\x18\x02"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0" + - "\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2\u01F0\x03\x02" + - "\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F4\u01F5" + - "\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x07\x05\x02\x02" + - "\u01F7\u0261\x03\x02\x02\x02\u01F8\u0261\x050\x19\x02\u01F9\u01FA\x07" + - "#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05.\x18\x02\u01FC\u01FD" + - "\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC\x03\x02\x02\x02\u01FF" + - "\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0200\u0201\x03\x02" + - "\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03\x02\x02\x02\u0203" + - "\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204\u0205\x03\x02\x02" + - "\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05\x02\x02\u0207\u0261" + - "\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A\x07\x04\x02\x02" + - "\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C\u020E\x05.\x18" + - "\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02\x02\u020F\u020D" + - "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213\x03\x02\x02\x02" + - "\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02\u0213\u0212\x03" + - "\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03\x02\x02\x02\u0215" + - "\u0216\x07\x05\x02\x02\u0216\u0261\x03\x02\x02\x02\u0217\u021C\x05R*\x02" + - "\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A\u021C\x07*\x02" + - "\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02\x02\u021B\u0219" + - "\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0261\x03\x02\x02\x02" + - "\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F\u0220\x07\n\x02" + - "\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0224\x05" + - ".\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03\x02\x02\x02\u0225" + - "\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0229\x03\x02" + - "\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02\x02\u0229\u0228" + - "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B\x03\x02\x02\x02" + - "\u022B\u022C\x07@\x02\x02\u022C\u0261\x03\x02\x02\x02\u022D\u022E\x07" + - "\x04\x02\x02\u022E\u0233\x05H%\x02\u022F\u0230\x07\n\x02\x02\u0230\u0232" + - "\x05H%\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02\u0233" + - "\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0237\x03\x02" + - "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0238\x07\n\x02\x02\u0237\u0236" + - "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239\x03\x02\x02\x02" + - "\u0239\u023A\x07\x05\x02\x02\u023A\u0261\x03\x02\x02\x02\u023B\u0244\x07" + - "\r\x02\x02\u023C\u0241\x05.\x18\x02\u023D\u023E\x07\n\x02\x02\u023E\u0240" + - "\x05.\x18\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0243\x03\x02\x02\x02" + - "\u0241\u023F\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242\u0245\x03" + - "\x02\x02\x02\u0243\u0241\x03\x02\x02\x02\u0244\u023C\x03\x02\x02\x02\u0244" + - "\u0245\x03\x02\x02\x02\u0245\u0247\x03\x02\x02\x02\u0246\u0248\x07\n\x02" + - "\x02\u0247\u0246\x03\x02\x02\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + - "\x03\x02\x02\x02\u0249\u0261\x07\x0E\x02\x02\u024A\u024B\x07%\x02\x02" + - "\u024B\u024C\x07?\x02\x02\u024C\u024D\x05.\x18\x02\u024D\u024E\x07@\x02" + - "\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07&\x02\x02\u0250\u0251\x05" + - ".\x18\x07\u0251\u0261\x03\x02\x02\x02\u0252\u0253\x05\n\x06\x02\u0253" + - "\u0254\x05.\x18\x06\u0254\u0261\x03\x02\x02\x02\u0255\u0256\x05\x14\v" + - "\x02\u0256\u0257\x05.\x18\x05\u0257\u0261\x03\x02\x02\x02\u0258\u0259" + - "\x07?\x02\x02\u0259\u025A\x05.\x18\x02\u025A\u025B\x07@\x02\x02\u025B" + - "\u0261\x03\x02\x02\x02\u025C\u025D\x07\x04\x02\x02\u025D\u025E\x05.\x18" + - "\x02\u025E\u025F\x07\x05\x02\x02\u025F\u0261\x03\x02\x02\x02\u0260\u01CA" + - "\x03\x02\x02\x02\u0260\u01CC\x03\x02\x02\x02\u0260\u01D3\x03\x02\x02\x02" + - "\u0260\u01D5\x03\x02\x02\x02\u0260\u01DA\x03\x02\x02\x02\u0260\u01E9\x03" + - "\x02\x02\x02\u0260\u01F8\x03\x02\x02\x02\u0260\u01F9\x03\x02\x02\x02\u0260" + - "\u0208\x03\x02\x02\x02\u0260\u021B\x03\x02\x02\x02\u0260\u021D\x03\x02" + - "\x02\x02\u0260\u022D\x03\x02\x02\x02\u0260\u023B\x03\x02\x02\x02\u0260" + - "\u024A\x03\x02\x02\x02\u0260\u0252\x03\x02\x02\x02\u0260\u0255\x03\x02" + - "\x02\x02\u0260\u0258\x03\x02\x02\x02\u0260\u025C\x03\x02\x02\x02\u0261" + - "\u0293\x03\x02\x02\x02\u0262\u0263\f\x1C\x02\x02\u0263\u0264\x07!\x02" + - "\x02\u0264\u0292\x05.\x18\x1C\u0265\u0266\f\x1A\x02\x02\u0266\u0267\t" + - "\x02\x02\x02\u0267\u0292\x05.\x18\x1B\u0268\u0269\f\x19\x02\x02\u0269" + - "\u026A\t\x03\x02\x02\u026A\u0292\x05.\x18\x1A\u026B\u026C\f\x18\x02\x02" + - "\u026C\u026D\t\x04\x02\x02\u026D\u0292\x05.\x18\x19\u026E\u026F\f\x16" + - "\x02\x02\u026F\u0270\x07>\x02\x02\u0270\u0271\x05.\x18\x17\u0271\u0272" + - "\b\x18\x01\x02\u0272\u0292\x03\x02\x02\x02\u0273\u0274\f\x14\x02\x02\u0274" + - "\u0275\x07-\x02\x02\u0275\u0292\x05.\x18\x15\u0276\u0277\f\x12\x02\x02" + - "\u0277\u0278\x07.\x02\x02\u0278\u0292\x05.\x18\x13\u0279\u027A\f\x11\x02" + - "\x02\u027A\u027B\x07/\x02\x02\u027B\u0292\x05.\x18\x12\u027C\u027D\f\x10" + - "\x02\x02\u027D\u027E\x070\x02\x02\u027E\u0292\x05.\x18\x11\u027F\u0280" + - "\f\n\x02\x02\u0280\u0281\x07\x1C\x02\x02\u0281\u0292\x05.\x18\v\u0282" + - "\u0283\f \x02\x02\u0283\u0284\x07\x18\x02\x02\u0284\u028A\x05L\'\x02\u0285" + - "\u0287\x07?\x02\x02\u0286\u0288\x05F$\x02\u0287\u0286\x03\x02\x02\x02" + - "\u0287\u0288\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289\u028B\x07" + - "@\x02\x02\u028A\u0285\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B" + - "\u0292\x03\x02\x02\x02\u028C\u028D\f\x1D\x02\x02\u028D\u028E\x07\r\x02" + - "\x02\u028E\u028F\x05.\x18\x02\u028F\u0290\x07\x0E\x02\x02\u0290\u0292" + - "\x03\x02\x02\x02\u0291\u0262\x03\x02\x02\x02\u0291\u0265\x03\x02\x02\x02" + - "\u0291\u0268\x03\x02\x02\x02\u0291\u026B\x03\x02\x02\x02\u0291\u026E\x03" + - "\x02\x02\x02\u0291\u0273\x03\x02\x02\x02\u0291\u0276\x03\x02\x02\x02\u0291" + - "\u0279\x03\x02\x02\x02\u0291\u027C\x03\x02\x02\x02\u0291\u027F\x03\x02" + - "\x02\x02\u0291\u0282\x03\x02\x02\x02\u0291\u028C\x03\x02\x02\x02\u0292" + - "\u0295\x03\x02\x02\x02\u0293\u0291\x03\x02\x02\x02\u0293\u0294\x03\x02" + - "\x02\x02\u0294/\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0296\u0297" + - "\x072\x02\x02\u0297\u0298\x05.\x18\x02\u0298\u029A\x07\x04\x02\x02\u0299" + - "\u029B\x07\x0F\x02\x02\u029A\u0299\x03\x02\x02\x02\u029A\u029B\x03\x02" + - "\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u02A1\x052\x1A\x02\u029D\u029E" + - "\x07\x0F\x02\x02\u029E\u02A0\x052\x1A\x02\u029F\u029D\x03\x02\x02\x02" + - "\u02A0\u02A3\x03\x02\x02\x02\u02A1\u029F\x03\x02\x02\x02\u02A1\u02A2\x03" + - "\x02\x02\x02\u02A2\u02A4\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4" + - "\u02A5\x07\x05\x02\x02\u02A51\x03\x02\x02\x02\u02A6\u02A9\x054\x1B\x02" + - "\u02A7\u02A9\x07\'\x02\x02\u02A8\u02A6\x03\x02\x02\x02\u02A8\u02A7\x03" + - "\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02\u02AA\u02AB\x07\x1D\x02\x02\u02AB" + - "\u02AC\x05.\x18\x02\u02AC3\x03\x02\x02\x02\u02AD\u02B4\x05T+\x02\u02AE" + - "\u02B1\x07?\x02\x02\u02AF\u02B2\x05T+\x02\u02B0\u02B2\x07\'\x02\x02\u02B1" + - "\u02AF\x03\x02\x02\x02\u02B1\u02B0\x03\x02\x02\x02\u02B2\u02B3\x03\x02" + - "\x02\x02\u02B3\u02B5\x07@\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B5" + - "\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B7\x05\b\x05\x02\u02B7" + - "\u02B8\x07\x02\x02\x03\u02B8\u02C0\x03\x02\x02\x02\u02B9\u02BA\x05.\x18" + - "\x02\u02BA\u02BB\x07\x02\x02\x03\u02BB\u02C0\x03\x02\x02\x02\u02BC\u02BD" + - "\x07E\x02\x02\u02BD\u02C0\x07\x02\x02\x03\u02BE\u02C0\x07\x02\x02\x03" + - "\u02BF\u02B6\x03\x02\x02\x02\u02BF\u02B9\x03\x02\x02\x02\u02BF\u02BC\x03" + - "\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C07\x03\x02\x02\x02\u02C1" + - "\u02C4\x05:\x1E\x02\u02C2\u02C4\x05<\x1F\x02\u02C3\u02C1\x03\x02\x02\x02" + - "\u02C3\u02C2\x03\x02\x02\x02\u02C49\x03\x02\x02\x02\u02C5\u02C6\x05@!" + - "\x02\u02C6\u02C7\x07\x1D\x02\x02\u02C7\u02C8\x05.\x18\x02\u02C8\u02D7" + - "\x03\x02\x02\x02\u02C9\u02CA\x07?\x02\x02\u02CA\u02CF\x05@!\x02\u02CB" + - "\u02CC\x07\n\x02\x02\u02CC\u02CE\x05@!\x02\u02CD\u02CB\x03\x02\x02\x02" + - "\u02CE\u02D1\x03\x02\x02\x02\u02CF\u02CD\x03\x02\x02\x02\u02CF\u02D0\x03" + - "\x02\x02\x02\u02D0\u02D2\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2" + - "\u02D3\x07@\x02\x02\u02D3\u02D4\x07\x1D\x02\x02\u02D4\u02D5\x05.\x18\x02" + - "\u02D5\u02D7\x03\x02\x02\x02\u02D6\u02C5\x03\x02\x02\x02\u02D6\u02C9\x03" + - "\x02\x02\x02\u02D7;\x03\x02\x02\x02\u02D8\u02D9\x07?\x02\x02\u02D9\u02DA" + - "\x07?\x02\x02\u02DA\u02DD\x05@!\x02\u02DB\u02DC\x07\n\x02\x02\u02DC\u02DE" + - "\x05@!\x02\u02DD\u02DB\x03\x02\x02\x02\u02DE\u02DF\x03\x02\x02\x02\u02DF" + - "\u02DD\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02E1\x03\x02" + - "\x02\x02\u02E1\u02E2\x07@\x02\x02\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4" + - "\x07\x1D\x02\x02\u02E4\u02E5\x05.\x18\x02\u02E5=\x03\x02\x02\x02\u02E6" + - "\u02E9\x07\'\x02\x02\u02E7\u02E9\x05R*\x02\u02E8\u02E6\x03\x02\x02\x02" + - "\u02E8\u02E7\x03\x02\x02\x02\u02E9?\x03\x02\x02\x02\u02EA\u02EB\x05> " + - "\x02\u02EBA\x03\x02\x02\x02\u02EC\u02ED\x05> \x02\u02ED\u02EE\x07\x07" + - "\x02\x02\u02EE\u02EF\x05&\x14\x02\u02EFC\x03\x02\x02\x02\u02F0\u02F3\x07" + - "5\x02\x02\u02F1\u02F3\x05R*\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1" + - "\x03\x02\x02\x02\u02F3E\x03\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5" + - "\u02F6\x07\n\x02\x02\u02F6\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02" + - "\x02\u02F8\u02FB\x03\x02\x02\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA" + - "\x03\x02\x02\x02\u02FAG\x03\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC" + - "\u02FD\x05T+\x02\u02FD\u02FE\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02" + - "\u02FF\u0303\x03\x02\x02\x02\u0300\u0301\x07(\x02\x02\u0301\u0303\x05" + - ".\x18\x02\u0302\u02FC\x03\x02\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303" + - "I\x03\x02\x02\x02\u0304\u0307\x05R*\x02\u0305\u0307\t\x05\x02\x02\u0306" + - "\u0304\x03\x02\x02\x02\u0306\u0305\x03\x02\x02\x02\u0307K\x03\x02\x02" + - "\x02\u0308\u030B\x05R*\x02\u0309\u030B\t\x06\x02\x02\u030A\u0308\x03\x02" + - "\x02\x02\u030A\u0309\x03\x02\x02\x02\u030BM\x03\x02\x02\x02\u030C\u030D" + - "\t\x07\x02\x02\u030DO\x03\x02\x02\x02\u030E\u030F\t\b\x02\x02\u030FQ\x03" + - "\x02\x02\x02\u0310\u0315\x05V,\x02\u0311\u0312\x07)\x02\x02\u0312\u0314" + - "\x05V,\x02\u0313\u0311\x03\x02\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315" + - "\u0313\x03\x02\x02\x02\u0315\u0316\x03\x02\x02\x02\u0316S\x03\x02\x02" + - "\x02\u0317\u0315\x03\x02\x02\x02\u0318\u031D\x05V,\x02\u0319\u031A\x05" + - "R*\x02\u031A\u031B\b+\x01\x02\u031B\u031D\x03\x02\x02\x02\u031C\u0318" + - "\x03\x02\x02\x02\u031C\u0319\x03\x02\x02\x02\u031DU\x03\x02\x02\x02\u031E" + - "\u031F\t\t\x02\x02\u031FW\x03\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE" + - "\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F" + - "\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150\u0152\u0163\u0166\u0169" + - "\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC\u01C2\u01C6\u01CF\u01E1" + - "\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B\u0225\u0229\u0233\u0237" + - "\u0241\u0244\u0247\u0260\u0287\u028A\u0291\u0293\u029A\u02A1\u02A8\u02B1" + - "\u02B4\u02BF\u02C3\u02CF\u02D6\u02DF\u02E8\u02F2\u02F9\u0302\u0306\u030A" + - "\u0315\u031C"; + "\u01EE\u01EC\x03\x02\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03" + + "\x02\x02\x02\u01F0\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2" + + "\u01F0\x03\x02\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02" + + "\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7" + + "\x07\x05\x02\x02\u01F7\u0263\x03\x02\x02\x02\u01F8\u0263\x050\x19\x02" + + "\u01F9\u01FA\x07#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05" + + ".\x18\x02\u01FC\u01FD\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC" + + "\x03\x02\x02\x02\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02" + + "\u0200\u0201\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03" + + "\x02\x02\x02\u0203\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204" + + "\u0205\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05" + + "\x02\x02\u0207\u0263\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A" + + "\x07\x04\x02\x02\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C" + + "\u020E\x05.\x18\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02" + + "\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213" + + "\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02" + + "\u0213\u0212\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03" + + "\x02\x02\x02\u0215\u0216\x07\x05\x02\x02\u0216\u0263\x03\x02\x02\x02\u0217" + + "\u021C\x05R*\x02\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A" + + "\u021C\x07*\x02\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02" + + "\x02\u021B\u0219\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0263" + + "\x03\x02\x02\x02\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F" + + "\u0220\x07\n\x02\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02" + + "\u0222\u0224\x05.\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03" + + "\x02\x02\x02\u0225\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226" + + "\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02" + + "\x02\u0229\u0228\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B" + + "\x03\x02\x02\x02\u022B\u022C\x07@\x02\x02\u022C\u0263\x03\x02\x02\x02" + + "\u022D\u022E\x07?\x02\x02\u022E\u0263\x07@\x02\x02\u022F\u0230\x07\x04" + + "\x02\x02\u0230\u0235\x05H%\x02\u0231\u0232\x07\n\x02\x02\u0232\u0234\x05" + + "H%\x02\u0233\u0231\x03\x02\x02\x02\u0234\u0237\x03\x02\x02\x02\u0235\u0233" + + "\x03\x02\x02\x02\u0235\u0236\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02" + + "\u0237\u0235\x03\x02\x02\x02\u0238\u023A\x07\n\x02\x02\u0239\u0238\x03" + + "\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x03\x02\x02\x02\u023B" + + "\u023C\x07\x05\x02\x02\u023C\u0263\x03\x02\x02\x02\u023D\u0246\x07\r\x02" + + "\x02\u023E\u0243\x05.\x18\x02\u023F\u0240\x07\n\x02\x02\u0240\u0242\x05" + + ".\x18\x02\u0241\u023F\x03\x02\x02\x02\u0242\u0245\x03\x02\x02\x02\u0243" + + "\u0241\x03\x02\x02\x02\u0243\u0244\x03\x02\x02\x02\u0244\u0247\x03\x02" + + "\x02\x02\u0245\u0243\x03\x02\x02\x02\u0246\u023E\x03\x02\x02\x02\u0246" + + "\u0247\x03\x02\x02\x02\u0247\u0249\x03\x02\x02\x02\u0248\u024A\x07\n\x02" + + "\x02\u0249\u0248\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B" + + "\x03\x02\x02\x02\u024B\u0263\x07\x0E\x02\x02\u024C\u024D\x07%\x02\x02" + + "\u024D\u024E\x07?\x02\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07@\x02" + + "\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07&\x02\x02\u0252\u0253\x05" + + ".\x18\x07\u0253\u0263\x03\x02\x02\x02\u0254\u0255\x05\n\x06\x02\u0255" + + "\u0256\x05.\x18\x06\u0256\u0263\x03\x02\x02\x02\u0257\u0258\x05\x14\v" + + "\x02\u0258\u0259\x05.\x18\x05\u0259\u0263\x03\x02\x02\x02\u025A\u025B" + + "\x07?\x02\x02\u025B\u025C\x05.\x18\x02\u025C\u025D\x07@\x02\x02\u025D" + + "\u0263\x03\x02\x02\x02\u025E\u025F\x07\x04\x02\x02\u025F\u0260\x05.\x18" + + "\x02\u0260\u0261\x07\x05\x02\x02\u0261\u0263\x03\x02\x02\x02\u0262\u01CA" + + "\x03\x02\x02\x02\u0262\u01CC\x03\x02\x02\x02\u0262\u01D3\x03\x02\x02\x02" + + "\u0262\u01D5\x03\x02\x02\x02\u0262\u01DA\x03\x02\x02\x02\u0262\u01E9\x03" + + "\x02\x02\x02\u0262\u01F8\x03\x02\x02\x02\u0262\u01F9\x03\x02\x02\x02\u0262" + + "\u0208\x03\x02\x02\x02\u0262\u021B\x03\x02\x02\x02\u0262\u021D\x03\x02" + + "\x02\x02\u0262\u022D\x03\x02\x02\x02\u0262\u022F\x03\x02\x02\x02\u0262" + + "\u023D\x03\x02\x02\x02\u0262\u024C\x03\x02\x02\x02\u0262\u0254\x03\x02" + + "\x02\x02\u0262\u0257\x03\x02\x02\x02\u0262\u025A\x03\x02\x02\x02\u0262" + + "\u025E\x03\x02\x02\x02\u0263\u0295\x03\x02\x02\x02\u0264\u0265\f\x1D\x02" + + "\x02\u0265\u0266\x07!\x02\x02\u0266\u0294\x05.\x18\x1D\u0267\u0268\f\x1B" + + "\x02\x02\u0268\u0269\t\x02\x02\x02\u0269\u0294\x05.\x18\x1C\u026A\u026B" + + "\f\x1A\x02\x02\u026B\u026C\t\x03\x02\x02\u026C\u0294\x05.\x18\x1B\u026D" + + "\u026E\f\x19\x02\x02\u026E\u026F\t\x04\x02\x02\u026F\u0294\x05.\x18\x1A" + + "\u0270\u0271\f\x17\x02\x02\u0271\u0272\x07>\x02\x02\u0272\u0273\x05.\x18" + + "\x18\u0273\u0274\b\x18\x01\x02\u0274\u0294\x03\x02\x02\x02\u0275\u0276" + + "\f\x15\x02\x02\u0276\u0277\x07-\x02\x02\u0277\u0294\x05.\x18\x16\u0278" + + "\u0279\f\x13\x02\x02\u0279\u027A\x07.\x02\x02\u027A\u0294\x05.\x18\x14" + + "\u027B\u027C\f\x12\x02\x02\u027C\u027D\x07/\x02\x02\u027D\u0294\x05.\x18" + + "\x13\u027E\u027F\f\x11\x02\x02\u027F\u0280\x070\x02\x02\u0280\u0294\x05" + + ".\x18\x12\u0281\u0282\f\n\x02\x02\u0282\u0283\x07\x1C\x02\x02\u0283\u0294" + + "\x05.\x18\v\u0284\u0285\f!\x02\x02\u0285\u0286\x07\x18\x02\x02\u0286\u028C" + + "\x05L\'\x02\u0287\u0289\x07?\x02\x02\u0288\u028A\x05F$\x02\u0289\u0288" + + "\x03\x02\x02\x02\u0289\u028A\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02" + + "\u028B\u028D\x07@\x02\x02\u028C\u0287\x03\x02\x02\x02\u028C\u028D\x03" + + "\x02\x02\x02\u028D\u0294\x03\x02\x02\x02\u028E\u028F\f\x1E\x02\x02\u028F" + + "\u0290\x07\r\x02\x02\u0290\u0291\x05.\x18\x02\u0291\u0292\x07\x0E\x02" + + "\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0264\x03\x02\x02\x02\u0293\u0267" + + "\x03\x02\x02\x02\u0293\u026A\x03\x02\x02\x02\u0293\u026D\x03\x02\x02\x02" + + "\u0293\u0270\x03\x02\x02\x02\u0293\u0275\x03\x02\x02\x02\u0293\u0278\x03" + + "\x02\x02\x02\u0293\u027B\x03\x02\x02\x02\u0293\u027E\x03\x02\x02\x02\u0293" + + "\u0281\x03\x02\x02\x02\u0293\u0284\x03\x02\x02\x02\u0293\u028E\x03\x02" + + "\x02\x02\u0294\u0297\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295" + + "\u0296\x03\x02\x02\x02\u0296/\x03\x02\x02\x02\u0297\u0295\x03\x02\x02" + + "\x02\u0298\u0299\x072\x02\x02\u0299\u029A\x05.\x18\x02\u029A\u029C\x07" + + "\x04\x02\x02\u029B\u029D\x07\x0F\x02\x02\u029C\u029B\x03\x02\x02\x02\u029C" + + "\u029D\x03\x02\x02\x02\u029D\u029E\x03\x02\x02\x02\u029E\u02A3\x052\x1A" + + "\x02\u029F\u02A0\x07\x0F\x02\x02\u02A0\u02A2\x052\x1A\x02\u02A1\u029F" + + "\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02" + + "\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02A6\x03\x02\x02\x02\u02A5\u02A3\x03" + + "\x02\x02\x02\u02A6\u02A7\x07\x05\x02\x02\u02A71\x03\x02\x02\x02\u02A8" + + "\u02AB\x054\x1B\x02\u02A9\u02AB\x07\'\x02\x02\u02AA\u02A8\x03\x02\x02" + + "\x02\u02AA\u02A9\x03\x02\x02\x02\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AD" + + "\x07\x1D\x02\x02\u02AD\u02AE\x05.\x18\x02\u02AE3\x03\x02\x02\x02\u02AF" + + "\u02B6\x05T+\x02\u02B0\u02B3\x07?\x02\x02\u02B1\u02B4\x05T+\x02\u02B2" + + "\u02B4\x07\'\x02\x02\u02B3\u02B1\x03\x02\x02\x02\u02B3\u02B2\x03\x02\x02" + + "\x02\u02B4\u02B5\x03\x02\x02\x02\u02B5\u02B7\x07@\x02\x02\u02B6\u02B0" + + "\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B75\x03\x02\x02\x02\u02B8" + + "\u02B9\x05\b\x05\x02\u02B9\u02BA\x07\x02\x02\x03\u02BA\u02C2\x03\x02\x02" + + "\x02\u02BB\u02BC\x05.\x18\x02\u02BC\u02BD\x07\x02\x02\x03\u02BD\u02C2" + + "\x03\x02\x02\x02\u02BE\u02BF\x07E\x02\x02\u02BF\u02C2\x07\x02\x02\x03" + + "\u02C0\u02C2\x07\x02\x02\x03\u02C1\u02B8\x03\x02\x02\x02\u02C1\u02BB\x03" + + "\x02\x02\x02\u02C1\u02BE\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2" + + "7\x03\x02\x02\x02\u02C3\u02C6\x05:\x1E\x02\u02C4\u02C6\x05<\x1F\x02\u02C5" + + "\u02C3\x03\x02\x02\x02\u02C5\u02C4\x03\x02\x02\x02\u02C69\x03\x02\x02" + + "\x02\u02C7\u02C8\x05@!\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05" + + ".\x18\x02\u02CA\u02D9\x03\x02\x02\x02\u02CB\u02CC\x07?\x02\x02\u02CC\u02D1" + + "\x05@!\x02\u02CD\u02CE\x07\n\x02\x02\u02CE\u02D0\x05@!\x02\u02CF\u02CD" + + "\x03\x02\x02\x02\u02D0\u02D3\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02" + + "\u02D1\u02D2\x03\x02\x02\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3\u02D1\x03" + + "\x02\x02\x02\u02D4\u02D5\x07@\x02\x02\u02D5\u02D6\x07\x1D\x02\x02\u02D6" + + "\u02D7\x05.\x18\x02\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02" + + "\x02\u02D8\u02CB\x03\x02\x02\x02\u02D9;\x03\x02\x02\x02\u02DA\u02DB\x07" + + "?\x02\x02\u02DB\u02DC\x07?\x02\x02\u02DC\u02DF\x05@!\x02\u02DD\u02DE\x07" + + "\n\x02\x02\u02DE\u02E0\x05@!\x02\u02DF\u02DD\x03\x02\x02\x02\u02E0\u02E1" + + "\x03\x02\x02\x02\u02E1\u02DF\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + + "\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07" + + "@\x02\x02\u02E5\u02E6\x07\x1D\x02\x02\u02E6\u02E7\x05.\x18\x02\u02E7=" + + "\x03\x02\x02\x02\u02E8\u02EB\x07\'\x02\x02\u02E9\u02EB\x05R*\x02\u02EA" + + "\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03\x02\x02\x02\u02EB?\x03\x02\x02" + + "\x02\u02EC\u02ED\x05> \x02\u02EDA\x03\x02\x02\x02\u02EE\u02EF\x05> \x02" + + "\u02EF\u02F0\x07\x07\x02\x02\u02F0\u02F1\x05&\x14\x02\u02F1C\x03\x02\x02" + + "\x02\u02F2\u02F5\x075\x02\x02\u02F3\u02F5\x05R*\x02\u02F4\u02F2\x03\x02" + + "\x02\x02\u02F4\u02F3\x03\x02\x02\x02\u02F5E\x03\x02\x02\x02\u02F6\u02FB" + + "\x05.\x18\x02\u02F7\u02F8\x07\n\x02\x02\u02F8\u02FA\x05.\x18\x02\u02F9" + + "\u02F7\x03\x02\x02\x02\u02FA\u02FD\x03\x02\x02\x02\u02FB\u02F9\x03\x02" + + "\x02\x02\u02FB\u02FC\x03\x02\x02\x02\u02FCG\x03\x02\x02\x02\u02FD\u02FB" + + "\x03\x02\x02\x02\u02FE\u02FF\x05T+\x02\u02FF\u0300\x07\x07\x02\x02\u0300" + + "\u0301\x05.\x18\x02\u0301\u0305\x03\x02\x02\x02\u0302\u0303\x07(\x02\x02" + + "\u0303\u0305\x05.\x18\x02\u0304\u02FE\x03\x02\x02\x02\u0304\u0302\x03" + + "\x02\x02\x02\u0305I\x03\x02\x02\x02\u0306\u0309\x05R*\x02\u0307\u0309" + + "\t\x05\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0307\x03\x02\x02\x02" + + "\u0309K\x03\x02\x02\x02\u030A\u030D\x05R*\x02\u030B\u030D\t\x06\x02\x02" + + "\u030C\u030A\x03\x02\x02\x02\u030C\u030B\x03\x02\x02\x02\u030DM\x03\x02" + + "\x02\x02\u030E\u030F\t\x07\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0311" + + "\t\b\x02\x02\u0311Q\x03\x02\x02\x02\u0312\u0317\x05V,\x02\u0313\u0314" + + "\x07)\x02\x02\u0314\u0316\x05V,\x02\u0315\u0313\x03\x02\x02\x02\u0316" + + "\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317\u0318\x03\x02" + + "\x02\x02\u0318S\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u031A\u031F" + + "\x05V,\x02\u031B\u031C\x05R*\x02\u031C\u031D\b+\x01\x02\u031D\u031F\x03" + + "\x02\x02\x02\u031E\u031A\x03\x02\x02\x02\u031E\u031B\x03\x02\x02\x02\u031F" + + "U\x03\x02\x02\x02\u0320\u0321\t\t\x02\x02\u0321W\x03\x02\x02\x02Z[bks" + + "\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1" + + "\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150" + + "\u0152\u0163\u0166\u0169\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC" + + "\u01C2\u01C6\u01CF\u01E1\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B" + + "\u0225\u0229\u0235\u0239\u0243\u0246\u0249\u0262\u0289\u028C\u0293\u0295" + + "\u029C\u02A3\u02AA\u02B3\u02B6\u02C1\u02C5\u02D1\u02D8\u02E1\u02EA\u02F4" + + "\u02FB\u0304\u0308\u030C\u0317\u031E"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -6486,6 +6499,34 @@ export class TupleContext extends ExprContext { } } } +export class UnitContext extends ExprContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: ExprContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterUnit) { + listener.enterUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitUnit) { + listener.exitUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitUnit) { + return visitor.visitUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class PairContext extends ExprContext { public expr(): ExprContext[]; public expr(i: number): ExprContext; diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 7b5cc3ea0..cca740a52 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -47,6 +47,7 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; @@ -422,6 +423,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTuple?: (ctx: TupleContext) => Result; + /** + * Visit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + * @return the visitor result + */ + visitUnit?: (ctx: UnitContext) => Result; + /** * Visit a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index f8322d67a..624bb2e31 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -69,22 +69,22 @@ export interface QuintTupleType extends WithOptionalId { fields: Row } -export interface QuintRecordType extends WithOptionalId { - kind: 'rec' - fields: Row -} - // A value of the unit type, i.e. an empty record -export function unitType(id: bigint): QuintRecordType { +export function unitType(id: bigint): QuintTupleType { return { id, - kind: 'rec', + kind: 'tup', fields: { kind: 'row', fields: [], other: { kind: 'empty' } }, } } export function isUnitType(r: QuintType): Boolean { - return r.kind === 'rec' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' + return r.kind === 'tup' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' +} + +export interface QuintRecordType extends WithOptionalId { + kind: 'rec' + fields: Row } export interface QuintSumType extends WithOptionalId { diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index a444e6d51..ce9b07be2 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -764,6 +764,11 @@ export class ToIrListener implements QuintListener { this.pushApplication(ctx, 'Tup', args) } + // The unit, (), represented by the empty tuple + exitUnit(ctx: p.UnitContext) { + this.exprStack.push(unitValue(this.getId(ctx))) + } + // pair constructor, e.g., 2 -> 3 exitPair(ctx: p.PairContext) { const args = popMany(this.exprStack, ctx.expr().length, this.undefinedExpr(ctx)) @@ -1353,7 +1358,7 @@ function unitValue(id: bigint): QuintBuiltinApp { return { id, kind: 'app', - opcode: 'Rec', + opcode: 'Tup', args: [], } } diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3f19dd1fb..9a17b6ddb 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -214,9 +214,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return validateArity(e.opcode, results, l => l === 3, '3').chain(() => withConstraints(e.id, results, a)) // Tuple operators case 'Tup': - return validateArity(e.opcode, results, l => l > 0, 'at least one').chain(() => - tupleConstructorConstraints(e.id, results, a) - ) + return tupleConstructorConstraints(e.id, results, a) case 'item': return validateArity(e.opcode, results, l => l === 2, '2').chain(() => itemConstraints(e.id, results, a)) // Sum type operators diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index fe326ff69..12deb53a5 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -873,7 +873,7 @@ describe('compiling specs to runtime values', () => { it('can compile construction of sum type variants', () => { const context = 'type T = Some(int) | None' assertResultAsString('Some(40 + 2)', 'variant("Some", 42)', context) - assertResultAsString('None', 'variant("None", Rec())', context) + assertResultAsString('None', 'variant("None", Tup())', context) }) it('can compile elimination of sum type variants via match', () => { diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index f7f836b87..931b738ba 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,11 +71,11 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B | C) - | val C: (B | C) = variant("C", Rec()) + | val C: (B | C) = variant("C", Tup()) | type T2 = (Some((B | C)) | None) - | val B: (B | C) = variant("B", Rec()) + | val B: (B | C) = variant("B", Tup()) | def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam)) - | val None: (Some((B | C)) | None) = variant("None", Rec()) + | val None: (Some((B | C)) | None) = variant("None", Tup()) | var x: (Some((B | C)) | None) |}`) diff --git a/quint/test/types/constraintGenerator.test.ts b/quint/test/types/constraintGenerator.test.ts index 8cb3fd0bf..784b62915 100644 --- a/quint/test/types/constraintGenerator.test.ts +++ b/quint/test/types/constraintGenerator.test.ts @@ -162,14 +162,6 @@ describe('ConstraintGeneratorVisitor', () => { ) }) - it('catches invalid arity on Tup operator', () => { - testArityError( - 'val x = Tup()', - 'Checking arity for application of Tup', - 'Operator expects at least one arguments but was given 0' - ) - }) - it('catches invalid arity on item operator', () => { testArityError( 'val x = (0, 1).item()', diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index a3471cf5d..7486ddf11 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -181,18 +181,18 @@ describe('inferTypes', () => { assert.sameDeepMembers(stringTypes, [ [15n, 'str'], [16n, 'int'], - [17n, '(A(int) | B({}))'], - [18n, '(A(int) | B({}))'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], [6n, 'int'], [5n, 'str'], [7n, 'int'], - [8n, '(A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], - [10n, '(int) => (A(int) | B({}))'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], [11n, 'str'], - [12n, '{}'], - [13n, '(B({}) | A(int))'], - [14n, '(B({}) | A(int))'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], ]) }) @@ -223,19 +223,19 @@ module B { assert.sameDeepMembers(stringTypes, [ [15n, 'str'], [16n, 'int'], - [17n, '(A(int) | B({}))'], - [18n, '(A(int) | B({}))'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], [6n, 'int'], [5n, 'str'], [7n, 'int'], - [8n, '(A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], - [10n, '(int) => (A(int) | B({}))'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], [11n, 'str'], - [12n, '{}'], - [13n, '(B({}) | A(int))'], - [14n, '(B({}) | A(int))'], - [19n, '(A(int) | B({}))'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], + [19n, '(A(int) | B(()))'], [25n, 'str'], [27n, 'int'], [20n, 'int'], @@ -243,9 +243,9 @@ module B { [22n, 'int'], [26n, '(int) => int'], [28n, 'str'], - [30n, '{}'], + [30n, '()'], [23n, 'int'], - [29n, '({}) => int'], + [29n, '(()) => int'], [24n, 'int'], [31n, 'int'], ]) diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 90dc57e22..53f0aa6b2 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index abd859adf..037d9dba6 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file From 80eef26f35a42211a3eeeb5584c33f88caf3a0ce Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:05:18 -0400 Subject: [PATCH 306/428] Update apalache integration test for compile We now test that identifiers are sanitized, that imports and instances are resolved as expected, and that the unit is represented correctly. --- quint/apalache-tests.md | 45 ++++++++++++++--------- quint/testFixture/ApalacheCompilation.qnt | 35 ++++++++++++++++++ 2 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 quint/testFixture/ApalacheCompilation.qnt diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 8a716f60c..5517ca4b7 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -224,34 +224,45 @@ An example execution: ### Test that we can compile to TLA+ of the expected form - + ``` -quint compile --target tlaplus ../examples/language-features/booleans.qnt +quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt ``` - + ``` -------------------------------- MODULE booleans ------------------------------- +-------------------------- MODULE ApalacheCompilation -------------------------- -EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE b +VARIABLE x -step == - (b \/ TRUE) - /\ ~(b /\ FALSE) - /\ (b => b) - /\ (b <=> b) - /\ b = b - /\ b /= (~b) - /\ b' := (~b) +A == Variant("A", <<>>) -init == b' := TRUE +B(__BParam_27) == Variant("B", __BParam_27) + +foo_bar(id__123_31) == id__123_31 + +importedValue == 0 + +ApalacheCompilation_ModuleToInstantiate_C == 0 + +step == x' := (x + 1) + +inv == x >= 0 + +ApalacheCompilation_ModuleToInstantiate_instantiatedValue == + ApalacheCompilation_ModuleToInstantiate_C + +init == + x' + := (importedValue + + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) ================================================================================ ``` -### Test that we can compile a module with imports and instances to TLA+ +### Test that we can compile a module to TLA+ that instantiates but has not declarations @@ -266,7 +277,7 @@ which leaves nothing, thanks to the way clockSync3 is instanced. ``` ------------------------------ MODULE clockSync3 ------------------------------ -EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants ================================================================================ ``` diff --git a/quint/testFixture/ApalacheCompilation.qnt b/quint/testFixture/ApalacheCompilation.qnt new file mode 100644 index 000000000..02a415496 --- /dev/null +++ b/quint/testFixture/ApalacheCompilation.qnt @@ -0,0 +1,35 @@ +module ModuleToInstantiate { + const C: int + + val instantiatedValue = C +} + +module ModuleToImport { + val importedValue = 0 +} + +module ApalacheCompilation { + // Tests whether we can compile imports + import ModuleToImport.* + + // Tests whether we can compile instantiations + import ModuleToInstantiate(C = 0).* + + var x: int + + type T = + | A // Test whether we represent the unit correctly + | B(int) + + // Tests whether we will sanitize identifiers + def foo::bar(__123) = __123 + + // TODO: Tests that we remove primes from assignments in the init functino + action init = { + x' = importedValue + instantiatedValue + } + + action step = x' = x + 1 + + def inv = x >= 0 +} From 9c08b7d8ee073e7ac598c7057522916ba4acef27 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:12:25 -0400 Subject: [PATCH 307/428] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f2f95c17..80d1fa7d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The latest supported node version is now bounded at <= 20, which covers the latest LTS. (#1380) - Shadowing names are now supported, which means that the same name can be redefined - in nested scopes (#1394) + in nested scopes. (#1394) +- The canonical unit type is now the empty tuple, `()`, rather than the empty + record, `{}`. This should only affect invisible things to do with sum type + constructors. (#1401) ### Deprecated ### Removed From c70ae5af1ab399c2b04a307cfd67dd5408dba0fe Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:14:14 -0400 Subject: [PATCH 308/428] Update the language spec --- doc/lang.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index d71ba0c3e..a598c6146 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -1300,14 +1300,14 @@ sets of records: (1) It often confuses beginners, (2) It can be expressed with ### Tuples -In contrast to TLA+, Quint tuples have length of at least 2. -If you need lists, use lists. - ```scala // Tuple constructor: << e_1, ..., e_n >> -// Warning: n >= 2 (e_1, ..., e_n) Tup(e_1, ..., e_n) +// The empty tuple is also the canonical unit type +// <<>> +() +Tup() // t[1], t[2], t[3], t[4], ... , t[50] t._1 t._2 From 606b43607fe7d202f45594c17743ce4e8c10cc93 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Mar 2024 17:15:15 -0400 Subject: [PATCH 309/428] Add q::* operators to compiled targets Closes #1402 This also shares the flattening and extension logic between the `compile` command and the `verifySpec` command. --- doc/quint.md | 53 +++++--- quint/apalache-tests.md | 71 ++++++++++- quint/src/cli.ts | 77 ++++++------ quint/src/cliCommands.ts | 147 +++++++++++----------- quint/testFixture/ApalacheCompilation.qnt | 21 +++- 5 files changed, 232 insertions(+), 137 deletions(-) diff --git a/doc/quint.md b/doc/quint.md index 18eed574b..12c5bd6c1 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -73,8 +73,7 @@ especially useful for debugging complex specifications. $ quint compile --help quint compile -compile a Quint specification into the target, the output is written to -stdout +compile a Quint specification into the target, the output is written to stdout Options: --help Show help [boolean] @@ -82,6 +81,10 @@ Options: --out output file (suppresses all console output) [string] --main name of the main module (by default, computed from filename) [string] + --init name of the initializer action [string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas [string] --target the compilation target. Supported values: tlaplus, json [string] [default: "json"] --verbosity control how much output is produced (0 to 5)[number] [default: 2] @@ -91,6 +94,16 @@ Given a quint specification as input, this command parses, resolves imports, typechecks, and then "flattens" the specification into on module containing just the needed definitions. +The main module is determined as follows: If a module name is specified by +`--main`, that takes precedence. Otherwise, if there is only one module in the +input file, that is the main module. Otherwise, the module with the same name as +the file is taken to be the main module. + +The main module must specify a state machine. This means it must either define +actions named `init` and `step`, specifying the initial state and the +transition action respectivefly, or suitable actions defined in the main module +must be indicated using the `--init` and `--step` actions. + The following compilation targets are supported - `json`: The default target, this produces a json representation, in the same @@ -105,7 +118,7 @@ The following compilation targets are supported to be expected.* ```sh -$ quint parse --help +$ quint parse --help quint parse parse a Quint specification @@ -292,30 +305,32 @@ Options: ## Command verify ```sh -$ quint verify +$ quint verify --help +quint verify Verify a Quint specification via Apalache Options: - --help Show help [boolean] - --version Show version number [boolean] - --main name of the main module (by default, computed from - filename) [string] - --out output file (suppresses all console output) [string] - --out-itf output the trace in the Informal Trace Format to file - (suppresses all console output) [string] - --max-steps the maximum number of steps in every trace - [number] [default: 10] - --init name of the initializer action [string] [default: "init"] - --step name of the step action [string] [default: "step"] - --invariant the invariants to check, separated by a comma [string] - --temporal the temporal properties to check, separated by a comma + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from + filename) [string] + --init name of the initializer action[string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas + [string] + --out-itf output the trace in the Informal Trace Format to file + (suppresses all console output) [string] + --max-steps the maximum number of steps in every trace + [number] [default: 10] --random-transitions choose transitions at random (= use symbolic simulation) [boolean] [default: false] --apalache-config path to an additional Apalache configuration file (in JSON) [string] - --verbosity control how much output is produced (0 to 5) + --verbosity control how much output is produced (0 to 5) [number] [default: 2] ``` @@ -332,7 +347,7 @@ steps: Apalache uses bounded model checking. This technique checks *all runs* up to `--max-steps` steps via [z3][]. Apalache is highly configurable. See [Apalache configuration](https://apalache.informal.systems/docs/apalache/config.html?highlight=configuration#apalache-configuration) -for guidance. +for guidance. - If there are no critical errors (e.g., in parsing, typechecking, etc.), this command sends the Quint specification to the [Apalache][] model checker, which diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 5517ca4b7..d455c834a 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -239,18 +239,24 @@ VARIABLE x A == Variant("A", <<>>) -B(__BParam_27) == Variant("B", __BParam_27) +B(__BParam_31) == Variant("B", __BParam_31) -foo_bar(id__123_31) == id__123_31 +foo_bar(id__123_35) == id__123_35 importedValue == 0 ApalacheCompilation_ModuleToInstantiate_C == 0 +altInit == x' := 0 + step == x' := (x + 1) +altStep == x' := (x + 0) + inv == x >= 0 +altInv == x >= 0 + ApalacheCompilation_ModuleToInstantiate_instantiatedValue == ApalacheCompilation_ModuleToInstantiate_C @@ -259,10 +265,59 @@ init == := (importedValue + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) +q_step == step + +q_init == init + ================================================================================ ``` -### Test that we can compile a module to TLA+ that instantiates but has not declarations +### Test that we can compile to TLA+ of the expected form with CLI confgis + +We check that specifying `--init`, `--step`, and `--invariant` work as expected + + +``` +quint compile --target tlaplus \ + --init altInit --step altStep --invariant altInv \ + ./testFixture/ApalacheCompilation.qnt \ + | grep -e q_init -e q_step -e q_inv +``` + + +``` +q_init == altInit +q_step == altStep +q_inv == altInv +``` + +### Test that we can compile to TLA+ of the expected form, specifying `--main` + + +``` +quint compile --target tlaplus --main ModuleToImport ./testFixture/ApalacheCompilation.qnt +``` + + +``` +---------------------------- MODULE ModuleToImport ---------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants + +step == TRUE + +importedValue == 0 + +init == TRUE + +q_init == init + +q_step == step + +================================================================================ +``` + +### Test that we can compile a module to TLA+ that instantiates but has no declarations @@ -270,14 +325,18 @@ init == quint compile --target tlaplus ../examples/classic/distributed/ClockSync/clockSync3.qnt | head ``` +The compiled module is not empty: -TODO: This is an incorrect result, we are removing all "unused" declarations -which leaves nothing, thanks to the way clockSync3 is instanced. ``` ------------------------------ MODULE clockSync3 ------------------------------ EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -================================================================================ +VARIABLE clockSync3_clockSync3Spec_time + +clockSync3_clockSync3Spec_Proc(clockSync3_clockSync3Spec_id_37) == + [id |-> clockSync3_clockSync3Spec_id_37] + +VARIABLE clockSync3_clockSync3Spec_hc ``` diff --git a/quint/src/cli.ts b/quint/src/cli.ts index da318605e..7bcf81866 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -17,6 +17,7 @@ import { compile, docs, load, + outputCompilationTarget, outputResult, parse, runRepl, @@ -36,6 +37,32 @@ const defaultOpts = (yargs: any) => type: 'string', }) +// Arguments used by routines that pass thru the `compile` stage +const compileOpts = (yargs: any) => + defaultOpts(yargs) + .option('main', { + desc: 'name of the main module (by default, computed from filename)', + type: 'string', + }) + .option('init', { + desc: 'name of the initializer action', + type: 'string', + default: 'init', + }) + .option('step', { + desc: 'name of the step action', + type: 'string', + default: 'step', + }) + .option('invariant', { + desc: 'the invariants to check, separated by commas (e.g.)', + type: 'string', + }) + .option('temporal', { + desc: 'the temporal properties to check, separated by commas', + type: 'string', + }) + // Chain async CLIProcedures // // This saves us having to manually thread the result argument like @@ -77,11 +104,7 @@ const compileCmd = { command: 'compile ', desc: 'compile a Quint specification into the target, the output is written to stdout', builder: (yargs: any) => - defaultOpts(yargs) - .option('main', { - desc: 'name of the main module (by default, computed from filename)', - type: 'string', - }) + compileOpts(yargs) .option('target', { desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', @@ -99,7 +122,12 @@ const compileCmd = { default: verbosity.defaultLevel, }), handler: (args: any) => - load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(compile)).then(outputResult), + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(outputCompilationTarget)) + .then(outputResult), } // construct repl commands with yargs @@ -235,15 +263,7 @@ const verifyCmd = { command: 'verify ', desc: `Verify a Quint specification via Apalache`, builder: (yargs: any) => - yargs - .option('main', { - desc: 'name of the main module (by default, computed from filename)', - type: 'string', - }) - .option('out', { - desc: 'output file (suppresses all console output)', - type: 'string', - }) + compileOpts(yargs) .option('out-itf', { desc: 'output the trace in the Informal Trace Format to file (suppresses all console output)', type: 'string', @@ -253,26 +273,6 @@ const verifyCmd = { type: 'number', default: 10, }) - .option('init', { - desc: 'name of the initializer action', - type: 'string', - default: 'init', - }) - .option('step', { - desc: 'name of the step action', - type: 'string', - default: 'step', - }) - .option('invariant', { - desc: 'the invariants to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) - .option('temporal', { - desc: 'the temporal properties to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) .option('random-transitions', { desc: 'choose transitions at random (= use symbolic simulation)', type: 'boolean', @@ -295,7 +295,12 @@ const verifyCmd = { // type: 'number', // }) handler: (args: any) => - load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(verifySpec)).then(outputResult), + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(verifySpec)) + .then(outputResult), } // construct documenting commands with yargs diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 2fdb81b2c..99c6f968f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -29,7 +29,7 @@ import { Either, left, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' import { ReplOptions, quintRepl } from './repl' -import { OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' +import { FlatModule, OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' import { TypeScheme } from './types/base' import { createFinders, formatError } from './errorReporter' import { DocumentationEntry, produceDocs, toMarkdown } from './docs' @@ -44,13 +44,21 @@ import { Rng, newRng } from './rng' import { fileSourceResolver } from './parsing/sourceResolver' import { verify } from './quintVerifier' import { flattenModules } from './flattening/fullFlattener' -import { analyzeInc, analyzeModules } from './quintAnalyzer' +import { AnalysisOutput, analyzeInc, analyzeModules } from './quintAnalyzer' import { ExecutionFrame } from './runtime/trace' import { flow, isEqual, uniqWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' import { compileToTlaplus } from './compileToTlaplus' -export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'compiling' | 'documentation' +export type stage = + | 'loading' + | 'parsing' + | 'typechecking' + | 'testing' + | 'running' + | 'compiling' + | 'outputting target' + | 'documentation' /** The data from a ProcedureStage that may be output to --out */ interface OutputStage { @@ -138,6 +146,10 @@ interface TypecheckedStage extends ParsedStage { modes: Map } +interface CompiledStage extends TypecheckedStage, AnalysisOutput { + mainModule: FlatModule +} + interface TestedStage extends LoadedStage { // the names of the passed tests passed: string[] @@ -606,20 +618,46 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { - const stage: stage = 'compiling' +export async function compile(typechecked: TypecheckedStage): Promise> { const args = typechecked.args - const verbosityLevel = deriveVerbosity(args) + const mainName = guessMainModule(typechecked) + const main = typechecked.modules.find(m => m.name === mainName) + if (!main) { + return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) + } + + // Wrap init, step, invariant and temporal properties in other definitions, + // to make sure they are not considered unused in the main module and, + // therefore, ignored by the flattener + const extraDefsAsText = [`action q::init = ${args.init}`, `action q::step = ${args.step}`] + + if (args.invariant) { + extraDefsAsText.push(`val q::inv = and(${args.invariant})`) + } + if (args.temporal) { + extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal})`) + } + const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, typechecked.idGen, new Map())) + main.declarations.push(...extraDefs) + + // We have to update the lookup table and analysis result with the new definitions. This is not ideal, and the problem + // is that is hard to add this definitions in the proper stage, in our current setup. We should try to tackle this + // while solving #1052. + const resolutionResult = parsePhase3importAndNameResolution({ ...typechecked, errors: [] }) + if (resolutionResult.errors.length > 0) { + const errors = resolutionResult.errors.map(mkErrorMessage(typechecked.sourceMap)) + return cliErr('name resolution failed', { ...typechecked, errors }) + } + + typechecked.table = resolutionResult.table + analyzeInc(typechecked, typechecked.table, extraDefs) + + // Flatten modules, replacing instances, imports and exports with their definitions const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( typechecked.modules, typechecked.table, @@ -628,36 +666,43 @@ export async function compile(typechecked: TypecheckedStage): Promise m.name === mainName)! - if (!main) { - return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) - } + // Pick the main module + const flatMain = flattenedModules.find(m => m.name === mainName)! - const flattenedStage: TypecheckedStage = { + return right({ ...typechecked, ...flattenedAnalysis, - modules: [main], + mainModule: flatMain, table: flattenedTable, - stage, - } + stage: 'compiling', + }) +} - const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage(flattenedStage)) - switch ((typechecked.args.target as string).toLowerCase()) { +/** output a compiled spec in the format specified in the `compiled.args.target` to stdout + * + * @param compiled The result of a preceding compile stage + */ +export async function outputCompilationTarget(compiled: CompiledStage): Promise> { + const stage: stage = 'outputting target' + const args = compiled.args + const verbosityLevel = deriveVerbosity(args) + + const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage({ ...compiled, modules: [compiled.mainModule] })) + switch ((compiled.args.target as string).toLowerCase()) { case 'json': process.stdout.write(parsedSpecJson) - return right(flattenedStage) + return right(compiled) case 'tlaplus': { const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) return toTlaResult .mapRight(tla => { process.stdout.write(tla) // Write out, since all went right - return flattenedStage + return compiled }) .mapLeft(err => { return { msg: err.explanation, - stage: { ...flattenedStage, stage, status: 'error', errors: err.errors }, + stage: { ...compiled, stage, status: 'error', errors: err.errors }, } }) } @@ -672,7 +717,7 @@ export async function compile(typechecked: TypecheckedStage): Promise> { +export async function verifySpec(prev: CompiledStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args const verbosityLevel = deriveVerbosity(args) @@ -686,51 +731,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise m.name === mainName) - if (!main) { - return cliErr(`module ${mainName} does not exist`, { ...verifying, errors: [], sourceCode: new Map() }) - } - - // Wrap init, step, invariant and temporal properties in other definitions, - // to make sure they are not considered unused in the main module and, - // therefore, ignored by the flattener - const extraDefsAsText = [`action q::init = ${args.init}`, `action q::step = ${args.step}`] - if (args.invariant) { - extraDefsAsText.push(`val q::inv = and(${args.invariant.join(',')})`) - } - if (args.temporal) { - extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal.join(',')})`) - } - - const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, verifying.idGen, new Map())) - main.declarations.push(...extraDefs) - - // We have to update the lookup table and analysis result with the new definitions. This is not ideal, and the problem - // is that is hard to add this definitions in the proper stage, in our current setup. We should try to tackle this - // while solving #1052. - const resolutionResult = parsePhase3importAndNameResolution({ ...prev, errors: [] }) - if (resolutionResult.errors.length > 0) { - const errors = resolutionResult.errors.map(mkErrorMessage(prev.sourceMap)) - return cliErr('name resolution failed', { ...verifying, errors }) - } - - verifying.table = resolutionResult.table - analyzeInc(verifying, verifying.table, extraDefs) - - // Flatten modules, replacing instances, imports and exports with their definitions - const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( - verifying.modules, - verifying.table, - verifying.idGen, - verifying.sourceMap, - verifying - ) - - // Pick main module, we only pass this on to Apalache - const flatMain = flattenedModules.find(m => m.name === mainName)! - - const veryfiyingFlat = { ...verifying, ...flattenedAnalysis, modules: [flatMain], table: flattenedTable } + const veryfiyingFlat = { ...prev, modules: [prev.mainModule] } const parsedSpec = jsonStringOfOutputStage(pickOutputStage(veryfiyingFlat)) // We need to insert the data form CLI args into their appropriate locations diff --git a/quint/testFixture/ApalacheCompilation.qnt b/quint/testFixture/ApalacheCompilation.qnt index 02a415496..b1ffde284 100644 --- a/quint/testFixture/ApalacheCompilation.qnt +++ b/quint/testFixture/ApalacheCompilation.qnt @@ -4,15 +4,19 @@ module ModuleToInstantiate { val instantiatedValue = C } +// Used for import tests and for testing specifying an alternate main module module ModuleToImport { val importedValue = 0 + + action init = true + action step = true } module ApalacheCompilation { // Tests whether we can compile imports - import ModuleToImport.* + import ModuleToImport.importedValue - // Tests whether we can compile instantiations + // Tests whether we can compile instances import ModuleToInstantiate(C = 0).* var x: int @@ -24,12 +28,23 @@ module ApalacheCompilation { // Tests whether we will sanitize identifiers def foo::bar(__123) = __123 - // TODO: Tests that we remove primes from assignments in the init functino + // TODO: Tests that we remove primes from assignments in the init function action init = { x' = importedValue + instantiatedValue } + // Tests that we can specify an alternative init via CLI args + action altInit = { + x' = 0 + } + action step = x' = x + 1 + // Tests that we can specify an alternative step via CLI args + action altStep = x' = x + 0 + def inv = x >= 0 + + // Tests that we can specify an alternative invariant via CLI args + def altInv = x >= 0 } From 11fcd96869d61409d1f8958fed4f1cd1d3bb010f Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 19 Mar 2024 17:37:43 -0300 Subject: [PATCH 310/428] Apply suggestions from code review --- quint/apalache-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 5517ca4b7..fc021999c 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -226,7 +226,7 @@ An example execution: ``` -quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt +quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt ``` @@ -262,7 +262,7 @@ init == ================================================================================ ``` -### Test that we can compile a module to TLA+ that instantiates but has not declarations +### Test that we can compile a module to TLA+ that instantiates but has no declarations From 0a8baa60016c9576bdcb3e7306a6ea47307f09bf Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 20 Mar 2024 09:01:13 -0300 Subject: [PATCH 311/428] Bump apalache version --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index a382957a8..b22b2c270 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.7' +const APALACHE_VERSION_TAG = '0.44.8' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 899360a86850e969436afc1fc38bd16aec8a8b27 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Mar 2024 11:36:28 -0300 Subject: [PATCH 312/428] Fix the type quantification strategy and corresponding tests --- examples/cosmwasm/zero-to-hero/vote.qnt | 5 +- quint/src/types/base.ts | 5 +- quint/src/types/constraintGenerator.ts | 192 +++++++++++++----------- quint/test/types/inferrer.test.ts | 32 ++-- 4 files changed, 128 insertions(+), 106 deletions(-) diff --git a/examples/cosmwasm/zero-to-hero/vote.qnt b/examples/cosmwasm/zero-to-hero/vote.qnt index 61adf5a58..fed0492b9 100644 --- a/examples/cosmwasm/zero-to-hero/vote.qnt +++ b/examples/cosmwasm/zero-to-hero/vote.qnt @@ -489,10 +489,7 @@ module state { ) // assert that aggregated sum in `polls[poll_id]` equals the sum from above val poll = state.polls.get(poll_id) - poll.options.listForall(option => - val optionKey = option._1 - // FIXME(#1167): Type annotation below is a workaround, inferred type is too general - val optionSum: int = option._2 + poll.options.listForall(((optionKey, optionSum)) => // `ballots` only contains entries if there are > 0 votes. optionSum > 0 implies and { summed_ballots.keys().contains(optionKey), diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 23f357f21..4ba069a3c 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -21,12 +21,13 @@ export type Constraint = */ const constraintKinds = ['empty', 'eq', 'conjunction', 'isDefined'] as const -export interface TypeScheme { - type: QuintType +export interface QuantifiedVariables { typeVariables: Set rowVariables: Set } +export type TypeScheme = { type: QuintType } & QuantifiedVariables + export type Signature = (_arity: number) => TypeScheme // Does not bind any type variables in `type`, which we take to assume diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3f19dd1fb..5c60fb58c 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2022 Informal Systems + * Copyright 2022-2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ @@ -18,7 +18,7 @@ import { QuintAssume, QuintBool, QuintConst, - QuintDef, + QuintDeclaration, QuintEx, QuintInstance, QuintInt, @@ -35,7 +35,7 @@ import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' -import { Constraint, Signature, TypeScheme, toScheme } from './base' +import { Constraint, QuantifiedVariables, Signature, TypeScheme, toScheme } from './base' import { Substitutions, applySubstitution, compose } from './substitutions' import { LookupTable } from '../names/base' import { @@ -95,7 +95,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - protected types: Map = new Map() + protected types: Map = new Map() protected errors: Map = new Map() protected freshVarGenerator: FreshVarGenerator protected table: LookupTable @@ -104,13 +104,14 @@ export class ConstraintGeneratorVisitor implements IRVisitor { private solvingFunction: SolvingFunctionType private builtinSignatures: Map = getSignatures() + // A map to save which type variables were free when we started visiting an opdef or an assume + protected tvs: Map = new Map() + // Temporary type map only for types in scope for a certain declaration + protected typesInScope: Map = new Map() + // Track location descriptions for error tree traces private location: string = '' - // A stack of free type variables and row variables for lambda expressions. - // Nested lambdas add new entries to the stack, and pop them when exiting. - private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] - getResult(): [Map, Map] { return [this.errors, this.types] } @@ -119,18 +120,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.location = `Generating constraints for ${expressionToString(e)}` } - exitDef(def: QuintDef) { - if (this.constraints.length > 0) { - this.solveConstraints().map(subs => { - if (isAnnotatedDef(def)) { - checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => - this.errors.set(def.typeAnnotation?.id ?? def.id, err) - ) - } - }) - } - } - exitVar(e: QuintVar) { this.addToResults(e.id, right(toScheme(e.typeAnnotation))) } @@ -244,22 +233,14 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } enterLambda(expr: QuintLambda) { - const lastParamNames = this.currentFreeNames() - const paramNames = { - typeVariables: new Set(lastParamNames.typeVariables), - rowVariables: new Set(lastParamNames.rowVariables), - } expr.params.forEach(p => { const varName = p.name === '_' ? this.freshVarGenerator.freshVar('_t') : `t_${p.name}_${p.id}` - paramNames.typeVariables.add(varName) const paramTypeVar: QuintVarType = { kind: 'var', name: varName } this.addToResults(p.id, right(toScheme(paramTypeVar))) if (p.typeAnnotation) { this.constraints.push({ kind: 'eq', types: [paramTypeVar, p.typeAnnotation], sourceId: p.id }) } }) - - this.freeNames.push(paramNames) } // Γ ∪ {p0: t0, ..., pn: tn} ⊢ e: (te, c) t0, ..., tn are fresh @@ -283,7 +264,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { }) this.addToResults(e.id, result) - this.freeNames.pop() } // Γ ⊢ e1: (t1, c1) s = solve(c1) s(Γ ∪ {n: t1}) ⊢ e2: (t2, c2) @@ -294,22 +274,58 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return } - // TODO: Occurs check on operator body to prevent recursion, see https://github.com/informalsystems/quint/issues/171 - this.addToResults(e.id, this.fetchResult(e.expr.id)) } - exitOpDef(e: QuintOpDef) { + exitDecl(_def: QuintDeclaration) { + this.typesInScope = new Map() + } + + enterOpDef(def: QuintOpDef) { + // Save which type variables were free when we started visiting this op def + const tvs = this.freeNamesInScope() + this.tvs.set(def.id, tvs) + } + + exitOpDef(def: QuintOpDef) { if (this.errors.size !== 0) { return } - this.fetchResult(e.expr.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) - if (e.typeAnnotation) { - this.constraints.push({ kind: 'eq', types: [t.type, e.typeAnnotation], sourceId: e.id }) + this.fetchResult(def.expr.id).map(t => { + if (def.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [t.type, def.typeAnnotation], sourceId: def.id }) } }) + + const tvs_before = this.tvs.get(def.id)! + + if (this.constraints.length > 0) { + this.solveConstraints().map(subs => { + // For every free name we are binding in the substitutions, the names occuring in the value of the substitution + // have to become free as well. + addBindingsToFreeTypes(tvs_before, subs) + + if (isAnnotatedDef(def)) { + checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => + this.errors.set(def.typeAnnotation?.id ?? def.id, err) + ) + } + }) + } + + const tvs = this.freeNamesInScope() + // Any new free names, that were not free before, have to be quantified + const toQuantify = variablesDifference(tvs, tvs_before) + + this.fetchResult(def.expr.id).map(t => { + this.addToResults(def.id, right(quantify(toQuantify, t.type))) + }) + } + + enterAssume(e: QuintAssume) { + const tvs = this.freeNamesInScope() + this.tvs.set(e.id, tvs) } exitAssume(e: QuintAssume) { @@ -318,7 +334,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } this.fetchResult(e.assumption.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) + const tvs_before = this.tvs.get(e.id)! + const tvs = this.freeNamesInScope() + const toQuantify = variablesDifference(tvs, tvs_before) + this.addToResults(e.id, right(quantify(toQuantify, t.type))) this.constraints.push({ kind: 'eq', types: [t.type, { kind: 'bool' }], sourceId: e.id }) }) } @@ -326,7 +345,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { private addToResults(exprId: bigint, result: Either) { result .mapLeft(err => this.errors.set(exprId, buildErrorTree(this.location, err))) - .map(r => this.types.set(exprId, r)) + .map(r => { + this.typesInScope.set(exprId, r) + this.types.set(exprId, r) + }) } private fetchResult(id: bigint): Either { @@ -350,16 +372,9 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return this.solvingFunction(this.table, constraint) .mapLeft(errors => errors.forEach((err, id) => this.errors.set(id, err))) .map(subs => { - // For every free name we are binding in the substitutions, the names occuring in the value of the substitution - // have to become free as well. - this.addBindingsToFreeNames(subs) - - // Apply substitution to environment - // FIXME: We have to figure out the scope of the constraints/substitutions - // https://github.com/informalsystems/quint/issues/690 - this.types.forEach((oldScheme, id) => { + this.typesInScope.forEach((oldScheme, id) => { const newType = applySubstitution(this.table, subs, oldScheme.type) - const newScheme: TypeScheme = this.quantify(newType) + const newScheme: TypeScheme = { ...oldScheme, type: newType } this.addToResults(id, right(newScheme)) }) @@ -408,45 +423,18 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return applySubstitution(this.table, subs, t.type) } - private currentFreeNames(): { typeVariables: Set; rowVariables: Set } { - return ( - this.freeNames[this.freeNames.length - 1] ?? { - typeVariables: new Set(), - rowVariables: new Set(), - } + private freeNamesInScope(): QuantifiedVariables { + return [...this.typesInScope.values()].reduce( + (acc, t) => { + const names = freeTypes(t) + return { + typeVariables: new Set([...names.typeVariables, ...acc.typeVariables]), + rowVariables: new Set([...names.rowVariables, ...acc.rowVariables]), + } + }, + { typeVariables: new Set(), rowVariables: new Set() } ) } - - private quantify(type: QuintType): TypeScheme { - const freeNames = this.currentFreeNames() - const nonFreeNames = { - typeVariables: new Set([...typeNames(type).typeVariables].filter(name => !freeNames.typeVariables.has(name))), - rowVariables: new Set([...typeNames(type).rowVariables].filter(name => !freeNames.rowVariables.has(name))), - } - return { ...nonFreeNames, type } - } - - private addBindingsToFreeNames(substitutions: Substitutions) { - // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] - substitutions.forEach(s => { - switch (s.kind) { - case 'type': - this.freeNames - .filter(free => free.typeVariables.has(s.name)) - .forEach(free => { - const names = typeNames(s.value) - names.typeVariables.forEach(v => free.typeVariables.add(v)) - names.rowVariables.forEach(v => free.rowVariables.add(v)) - }) - return - case 'row': - this.freeNames - .filter(free => free.rowVariables.has(s.name)) - .forEach(free => rowNames(s.value).forEach(v => free.rowVariables.add(v))) - return - } - }) - } } function checkAnnotationGenerality( @@ -479,3 +467,39 @@ function checkAnnotationGenerality( return right(subs) } } + +function quantify(tvs: QuantifiedVariables, type: QuintType): TypeScheme { + return { ...tvs, type } +} + +function freeTypes(t: TypeScheme): QuantifiedVariables { + const allNames = typeNames(t.type) + return variablesDifference(allNames, { typeVariables: t.typeVariables, rowVariables: t.rowVariables }) +} + +function addBindingsToFreeTypes(free: QuantifiedVariables, substitutions: Substitutions): void { + // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] + substitutions.forEach(s => { + switch (s.kind) { + case 'type': + if (free.typeVariables.has(s.name)) { + const names = typeNames(s.value) + names.typeVariables.forEach(v => free.typeVariables.add(v)) + names.rowVariables.forEach(v => free.rowVariables.add(v)) + } + return + case 'row': + if (free.rowVariables.has(s.name)) { + rowNames(s.value).forEach(v => free.rowVariables.add(v)) + } + return + } + }) +} + +function variablesDifference(a: QuantifiedVariables, b: QuantifiedVariables): QuantifiedVariables { + return { + typeVariables: new Set([...a.typeVariables].filter(tv => !b.typeVariables.has(tv))), + rowVariables: new Set([...a.rowVariables].filter(tv => !b.rowVariables.has(tv))), + } +} diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index a3471cf5d..f7664a3fb 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -97,11 +97,11 @@ describe('inferTypes', () => { [14n, 'int'], [15n, '((bool) => int, bool) => int'], [16n, '((bool) => int, bool) => int'], - [1n, '∀ t0, t1 . (t0) => t1'], - [2n, '∀ t0 . t0'], - [3n, '∀ t0 . t0'], - [4n, '∀ t0 . t0'], - [5n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], + [1n, '(t_p_2) => _t4'], + [2n, 't_p_2'], + [3n, 't_p_2'], + [4n, '_t4'], + [5n, '((t_p_2) => _t4, t_p_2) => _t4'], [6n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], ]) }) @@ -129,14 +129,14 @@ describe('inferTypes', () => { [10n, '{ f1: int, f2: bool }'], [11n, 'Set[{ f1: int, f2: bool }]'], [12n, 'Set[{ f1: int, f2: bool }]'], - [13n, '∀ r0 . { f1: int | r0 }'], + [13n, '{ f1: int | tail__t3 }'], [14n, '{ f1: int, f2: bool }'], [15n, 'str'], - [16n, '∀ r0 . { f1: int | r0 }'], + [16n, '{ f1: int | tail__t3 }'], [17n, 'str'], [18n, 'int'], [19n, '{ f1: int, f2: bool }'], - [20n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], + [20n, '({ f1: int | tail__t3 }) => { f1: int, f2: bool }'], [21n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], [23n, 'str'], [22n, 'int'], @@ -156,16 +156,16 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '∀ t0, r0 . (t0 | r0)'], - [2n, '∀ t0, t1, r0 . (t0, t1 | r0)'], - [3n, '∀ t0, r0 . (t0 | r0)'], + [1n, '(_t0 | tail__t0)'], + [2n, '(tup__t1_0, _t1 | tail__t1)'], + [3n, '(_t0 | tail__t0)'], [4n, 'int'], - [5n, '∀ t0 . t0'], - [6n, '∀ t0, t1, r0 . (t0, t1 | r0)'], + [5n, '_t0'], + [6n, '(tup__t1_0, _t1 | tail__t1)'], [7n, 'int'], - [8n, '∀ t0 . t0'], - [9n, '∀ t0, t1 . (t0, t1)'], - [10n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], + [8n, '_t1'], + [9n, '(_t0, _t1)'], + [10n, '((_t0 | tail__t0), (tup__t1_0, _t1 | tail__t1)) => (_t0, _t1)'], [11n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], ]) }) From 2c6759341985d85b2ff6982f4058587458a1c0bb Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:29:09 -0300 Subject: [PATCH 313/428] Bump Apalache version again --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index b22b2c270..83122e045 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.8' +const APALACHE_VERSION_TAG = '0.44.9' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From a43eaaa7c16ffa453fecc4aa68f0490b8f8563b3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:29:21 -0300 Subject: [PATCH 314/428] Update test expectation --- quint/apalache-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index fc021999c..e4ff60b30 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -237,7 +237,7 @@ EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants VARIABLE x -A == Variant("A", <<>>) +A == Variant("A", "U_OF_UNIT") B(__BParam_27) == Variant("B", __BParam_27) From e1ebfc214c3cb18aac9dc215d399462a01a93650 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Fri, 22 Mar 2024 08:49:19 -0300 Subject: [PATCH 315/428] Apply suggestions from code review --- doc/quint.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/quint.md b/doc/quint.md index 12c5bd6c1..af6124f07 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -101,8 +101,8 @@ the file is taken to be the main module. The main module must specify a state machine. This means it must either define actions named `init` and `step`, specifying the initial state and the -transition action respectivefly, or suitable actions defined in the main module -must be indicated using the `--init` and `--step` actions. +transition action respectively, or suitable actions defined in the main module +must be indicated using the `--init` and `--step` options. The following compilation targets are supported From f695cb857ff47004341e2029a064fcd660177a1b Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:59:39 -0300 Subject: [PATCH 316/428] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d1fa7d5..f07af671a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed a dependency causing deprecation errors messages to be emitted. (#1380) +- Fixed a type checker bug causing too general types to be inferred (#1409). ### Security From d235fd0db301e146ef33ca93602f86fb85f81411 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 12:00:55 -0300 Subject: [PATCH 317/428] Fix serialization of Sets --- quint/src/cliCommands.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 99c6f968f..e05438d9d 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -901,7 +901,7 @@ function addItfHeader(source: string, status: string, traceInJson: any): any { // Preprocess troublesome types so they are represented in JSON. // -// We need it particularly because, by default, serialization of Map +// We need it particularly because, by default, serialization of Map and Set // objects just produces an empty object // (see https://stackoverflow.com/questions/46634449/json-stringify-of-object-of-map-return-empty) // @@ -910,6 +910,9 @@ function replacer(_key: String, value: any): any { if (value instanceof Map) { // Represent Maps as JSON objects return Object.fromEntries(value) + } else if (value instanceof Set) { + // Represent Sets as JSON arrays + return Array.from(value) } else { return value } From 9557b01ae7b84822584f6e5c6ead591c5a075839 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 12:04:50 -0300 Subject: [PATCH 318/428] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f07af671a..7ede3f019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed a dependency causing deprecation errors messages to be emitted. (#1380) - Fixed a type checker bug causing too general types to be inferred (#1409). +- Fixes serialization of Sets in JSON outputs (#1410). ### Security From 0ff85c73130a2ee293a5f5ec9645a58dee1c2a93 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 15:16:36 -0300 Subject: [PATCH 319/428] Bump Apalache version --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index 83122e045..ac46dff63 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.9' +const APALACHE_VERSION_TAG = '0.44.10' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 3994c6b636bfedbe1e20bdfdd752c6ae3ff51d3c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 15:28:32 -0300 Subject: [PATCH 320/428] Release v0.19.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 16 +++++++++++++--- quint/src/version.ts | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ede3f019..72a8b2849 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.0 -- 2024-03-25 + ### Added - Added polymorphic type declarations, allowing abstracting commonly used data diff --git a/quint/package-lock.json b/quint/package-lock.json index 026906f79..e0a90bc42 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index cda2d27d1..c998fee87 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,8 +1,14 @@ { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "description": "Core tool for the Quint specification language", - "keywords": ["temporal", "logic", "formal", "specification", "verification"], + "keywords": [ + "temporal", + "logic", + "formal", + "specification", + "verification" + ], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -29,7 +35,11 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": ["README.md", "dist/**/*", "test/**/*.ts"], + "files": [ + "README.md", + "dist/**/*", + "test/**/*.ts" + ], "engines": { "node": "18 - 20" }, diff --git a/quint/src/version.ts b/quint/src/version.ts index 8172abdfa..808e70727 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.3' +export const version = '0.19.0' From 49cf203c98e743698fc5442c5a86974b99aff502 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 26 Mar 2024 08:32:45 -0300 Subject: [PATCH 321/428] VSCode Release v0.14.0 --- vscode/quint-vscode/CHANGELOG.md | 9 ++ vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 123 +++++++------------ vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 56 insertions(+), 86 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 2c8eb0c06..fb5e62dec 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.0 -- 2024-03-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.7 -- 2024-02-08 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 1b7f69401..900f52373 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.7", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.7", + "version": "0.14.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 10eb198ad..ee5f35fa2 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.7", + "version": "0.14.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index d0ffde05d..b9ff769fe 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.7", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.7", + "version": "0.14.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.3", + "@informalsystems/quint": "^0.19.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", - "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", + "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -486,6 +486,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -494,8 +495,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -504,7 +505,7 @@ "quint": "dist/src/cli.js" }, "engines": { - "node": ">=18" + "node": "18 - 20" } }, "node_modules/@informalsystems/quint/node_modules/cliui": { @@ -828,8 +829,15 @@ "node_modules/@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/mocha": { "version": "8.2.3", @@ -5129,6 +5137,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5445,25 +5458,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6421,11 +6415,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6666,20 +6655,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7207,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", - "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", + "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7217,6 +7192,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -7225,8 +7201,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -7513,8 +7489,15 @@ "@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "requires": { + "@types/lodash": "*" + } }, "@types/mocha": { "version": "8.2.3", @@ -10707,6 +10690,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -10956,14 +10944,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11650,11 +11630,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -11840,20 +11815,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index f416bbaa8..fbd39ff11 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.7", + "version": "0.14.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.3", + "@informalsystems/quint": "^0.19.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From f7b38df6490efc02fc720118f6933422bbede3c2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 09:59:55 -0300 Subject: [PATCH 322/428] Update pretty-printing of the unit type in a sum type --- quint/src/graphics.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index cafa467bc..2fa8080f4 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -108,8 +108,8 @@ export function prettyQuintEx(ex: QuintEx): Doc { const valueExpr = ex.args[1] const value = - valueExpr.kind === 'app' && valueExpr.opcode === 'Rec' && valueExpr.args.length === 0 - ? [] // A payload with the empty record is shown as a bare label + valueExpr.kind === 'app' && valueExpr.opcode === 'Tup' && valueExpr.args.length === 0 + ? [] // A payload with the empty tuple is shown as a bare label : [text('('), prettyQuintEx(valueExpr), text(')')] return group([label, ...value]) From 1ed273b7dcdd9faaff5fb65cc57ffc6bc8e67319 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:01:58 -0300 Subject: [PATCH 323/428] Convert "U_OF_UNIT" from Apalache to the empty tuple --- quint/src/itf.ts | 6 ++++++ quint/test/itf.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 525d28989..6daaa81f8 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -189,6 +189,12 @@ export function ofItf(itf: ItfTrace): QuintEx[] { if (typeof value === 'boolean') { return { id, kind: 'bool', value } } else if (typeof value === 'string') { + if (value === 'U_OF_UNIT') { + // Apalache converts empty tuples to its unit value, "U_OF_UNIT". + // We need to convert it back to Quint's unit value, the empty tuple. + return { id, kind: 'app', opcode: 'Tup', args: [] } + } + return { id, kind: 'str', value } } else if (isBigint(value)) { // this is the standard way of encoding an integer in ITF. diff --git a/quint/test/itf.test.ts b/quint/test/itf.test.ts index 507e8a23a..03d490211 100644 --- a/quint/test/itf.test.ts +++ b/quint/test/itf.test.ts @@ -88,4 +88,28 @@ describe('toItf', () => { `round trip conversion of trace failed` ) }) + + it('converts unit type from Apalache', () => { + const text = '{ a: () }' + + const trace = [buildExpression(text)] + const vars = ['a'] + const itfTrace = { + vars: vars, + states: [ + { + '#meta': { + index: 0, + }, + a: 'U_OF_UNIT', + }, + ], + } + + const roundTripTrace = ofItf(itfTrace) + assert( + zip(roundTripTrace, trace).every(([a, b]) => quintExAreEqual(a, b)), + `round trip conversion of trace failed` + ) + }) }) From 7cc7e17b309f81a44d89a0d993007c2898484ca5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:10:43 -0300 Subject: [PATCH 324/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a8b2849..770a048c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fix a problem where sum types with no parameters were being printed with + either Quint's unit type `()` or Apalache's unit type `"U_OF_UNIT"` (#1416). + ### Security ## v0.19.0 -- 2024-03-25 From 2439aeef56a83446bdbbf4bc806a68a2f6b37c5e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:34:16 -0300 Subject: [PATCH 325/428] Release v0.19.1 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 770a048c9..a34d5305a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.1 -- 2024-04-01 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index e0a90bc42..7585f9ed7 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index c998fee87..118b36ce6 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 808e70727..b49c84d06 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.0' +export const version = '0.19.1' From 00dd030959a11c5d52a17b65ffd859526a37f9f2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:42:20 -0300 Subject: [PATCH 326/428] Parse the empty tuple type --- quint/src/generated/Quint.g4 | 3 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintListener.ts | 14 + quint/src/generated/QuintParser.ts | 1451 +++++++++-------- quint/src/generated/QuintVisitor.ts | 9 + quint/src/parsing/ToIrListener.ts | 11 + .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.qnt | 1 + 9 files changed, 786 insertions(+), 709 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index b562a451a..3c2ecaeb7 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -6,7 +6,7 @@ * 2. Make it expressive enough to capture all of the TLA logic. * * @author: Igor Konnov, Shon Feder, Gabriela Moreira, Jure Kukovec, Thomas Pani - * Informal Systems, 2021-2023 + * Informal Systems, 2021-2024 */ grammar Quint; @@ -119,6 +119,7 @@ type | SET '[' type ']' # typeSet // TODO: replace List with general type application | LIST '[' type ']' # typeList + | '(' ')' # typeUnit | '(' type ',' type (',' type)* ','? ')' # typeTuple | '{' row? '}' # typeRec | 'int' # typeInt diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index f372f04a1..761f5f1b0 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 803, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 564, 10, 24, 12, 24, 14, 24, 567, 11, 24, 3, 24, 5, 24, 570, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 578, 10, 24, 12, 24, 14, 24, 581, 11, 24, 5, 24, 583, 10, 24, 3, 24, 5, 24, 586, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 611, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 650, 10, 24, 3, 24, 5, 24, 653, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 660, 10, 24, 12, 24, 14, 24, 663, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 669, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 674, 10, 25, 12, 25, 14, 25, 677, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 683, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 692, 10, 27, 3, 27, 5, 27, 695, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 706, 10, 28, 3, 29, 3, 29, 5, 29, 710, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 720, 10, 30, 12, 30, 14, 30, 723, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 729, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 736, 10, 31, 13, 31, 14, 31, 737, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 747, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 757, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 762, 10, 36, 12, 36, 14, 36, 765, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 773, 10, 37, 3, 38, 3, 38, 5, 38, 777, 10, 38, 3, 39, 3, 39, 5, 39, 781, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 790, 10, 42, 12, 42, 14, 42, 793, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 799, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 901, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 610, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 682, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 705, 3, 2, 2, 2, 56, 709, 3, 2, 2, 2, 58, 728, 3, 2, 2, 2, 60, 730, 3, 2, 2, 2, 62, 746, 3, 2, 2, 2, 64, 748, 3, 2, 2, 2, 66, 750, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 758, 3, 2, 2, 2, 72, 772, 3, 2, 2, 2, 74, 776, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 786, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 800, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 611, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 611, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 611, 5, 46, 24, 28, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 24, 473, 611, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 611, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 611, 3, 2, 2, 2, 504, 611, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 611, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 611, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 611, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 611, 3, 2, 2, 2, 557, 558, 7, 63, 2, 2, 558, 611, 7, 64, 2, 2, 559, 560, 7, 4, 2, 2, 560, 565, 5, 72, 37, 2, 561, 562, 7, 10, 2, 2, 562, 564, 5, 72, 37, 2, 563, 561, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 568, 570, 7, 10, 2, 2, 569, 568, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 572, 7, 5, 2, 2, 572, 611, 3, 2, 2, 2, 573, 582, 7, 13, 2, 2, 574, 579, 5, 46, 24, 2, 575, 576, 7, 10, 2, 2, 576, 578, 5, 46, 24, 2, 577, 575, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 582, 574, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 586, 7, 10, 2, 2, 585, 584, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 611, 7, 14, 2, 2, 588, 589, 7, 37, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 38, 2, 2, 594, 595, 5, 46, 24, 7, 595, 611, 3, 2, 2, 2, 596, 597, 5, 10, 6, 2, 597, 598, 5, 46, 24, 6, 598, 611, 3, 2, 2, 2, 599, 600, 5, 20, 11, 2, 600, 601, 5, 46, 24, 5, 601, 611, 3, 2, 2, 2, 602, 603, 7, 63, 2, 2, 603, 604, 5, 46, 24, 2, 604, 605, 7, 64, 2, 2, 605, 611, 3, 2, 2, 2, 606, 607, 7, 4, 2, 2, 607, 608, 5, 46, 24, 2, 608, 609, 7, 5, 2, 2, 609, 611, 3, 2, 2, 2, 610, 458, 3, 2, 2, 2, 610, 460, 3, 2, 2, 2, 610, 467, 3, 2, 2, 2, 610, 469, 3, 2, 2, 2, 610, 474, 3, 2, 2, 2, 610, 489, 3, 2, 2, 2, 610, 504, 3, 2, 2, 2, 610, 505, 3, 2, 2, 2, 610, 520, 3, 2, 2, 2, 610, 539, 3, 2, 2, 2, 610, 541, 3, 2, 2, 2, 610, 557, 3, 2, 2, 2, 610, 559, 3, 2, 2, 2, 610, 573, 3, 2, 2, 2, 610, 588, 3, 2, 2, 2, 610, 596, 3, 2, 2, 2, 610, 599, 3, 2, 2, 2, 610, 602, 3, 2, 2, 2, 610, 606, 3, 2, 2, 2, 611, 661, 3, 2, 2, 2, 612, 613, 12, 29, 2, 2, 613, 614, 7, 33, 2, 2, 614, 660, 5, 46, 24, 29, 615, 616, 12, 27, 2, 2, 616, 617, 9, 2, 2, 2, 617, 660, 5, 46, 24, 28, 618, 619, 12, 26, 2, 2, 619, 620, 9, 3, 2, 2, 620, 660, 5, 46, 24, 27, 621, 622, 12, 25, 2, 2, 622, 623, 9, 4, 2, 2, 623, 660, 5, 46, 24, 26, 624, 625, 12, 23, 2, 2, 625, 626, 7, 62, 2, 2, 626, 627, 5, 46, 24, 24, 627, 628, 8, 24, 1, 2, 628, 660, 3, 2, 2, 2, 629, 630, 12, 21, 2, 2, 630, 631, 7, 45, 2, 2, 631, 660, 5, 46, 24, 22, 632, 633, 12, 19, 2, 2, 633, 634, 7, 46, 2, 2, 634, 660, 5, 46, 24, 20, 635, 636, 12, 18, 2, 2, 636, 637, 7, 47, 2, 2, 637, 660, 5, 46, 24, 19, 638, 639, 12, 17, 2, 2, 639, 640, 7, 48, 2, 2, 640, 660, 5, 46, 24, 18, 641, 642, 12, 10, 2, 2, 642, 643, 7, 28, 2, 2, 643, 660, 5, 46, 24, 11, 644, 645, 12, 33, 2, 2, 645, 646, 7, 24, 2, 2, 646, 652, 5, 76, 39, 2, 647, 649, 7, 63, 2, 2, 648, 650, 5, 70, 36, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 7, 64, 2, 2, 652, 647, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 12, 30, 2, 2, 655, 656, 7, 13, 2, 2, 656, 657, 5, 46, 24, 2, 657, 658, 7, 14, 2, 2, 658, 660, 3, 2, 2, 2, 659, 612, 3, 2, 2, 2, 659, 615, 3, 2, 2, 2, 659, 618, 3, 2, 2, 2, 659, 621, 3, 2, 2, 2, 659, 624, 3, 2, 2, 2, 659, 629, 3, 2, 2, 2, 659, 632, 3, 2, 2, 2, 659, 635, 3, 2, 2, 2, 659, 638, 3, 2, 2, 2, 659, 641, 3, 2, 2, 2, 659, 644, 3, 2, 2, 2, 659, 654, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 47, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 50, 2, 2, 665, 666, 5, 46, 24, 2, 666, 668, 7, 4, 2, 2, 667, 669, 7, 15, 2, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 675, 5, 50, 26, 2, 671, 672, 7, 15, 2, 2, 672, 674, 5, 50, 26, 2, 673, 671, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 678, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 679, 7, 5, 2, 2, 679, 49, 3, 2, 2, 2, 680, 683, 5, 52, 27, 2, 681, 683, 7, 39, 2, 2, 682, 680, 3, 2, 2, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 7, 29, 2, 2, 685, 686, 5, 46, 24, 2, 686, 51, 3, 2, 2, 2, 687, 694, 5, 84, 43, 2, 688, 691, 7, 63, 2, 2, 689, 692, 5, 84, 43, 2, 690, 692, 7, 39, 2, 2, 691, 689, 3, 2, 2, 2, 691, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 7, 64, 2, 2, 694, 688, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 53, 3, 2, 2, 2, 696, 697, 5, 8, 5, 2, 697, 698, 7, 2, 2, 3, 698, 706, 3, 2, 2, 2, 699, 700, 5, 46, 24, 2, 700, 701, 7, 2, 2, 3, 701, 706, 3, 2, 2, 2, 702, 703, 7, 69, 2, 2, 703, 706, 7, 2, 2, 3, 704, 706, 7, 2, 2, 3, 705, 696, 3, 2, 2, 2, 705, 699, 3, 2, 2, 2, 705, 702, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 55, 3, 2, 2, 2, 707, 710, 5, 58, 30, 2, 708, 710, 5, 60, 31, 2, 709, 707, 3, 2, 2, 2, 709, 708, 3, 2, 2, 2, 710, 57, 3, 2, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 46, 24, 2, 714, 729, 3, 2, 2, 2, 715, 716, 7, 63, 2, 2, 716, 721, 5, 64, 33, 2, 717, 718, 7, 10, 2, 2, 718, 720, 5, 64, 33, 2, 719, 717, 3, 2, 2, 2, 720, 723, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 724, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 724, 725, 7, 64, 2, 2, 725, 726, 7, 29, 2, 2, 726, 727, 5, 46, 24, 2, 727, 729, 3, 2, 2, 2, 728, 711, 3, 2, 2, 2, 728, 715, 3, 2, 2, 2, 729, 59, 3, 2, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 63, 2, 2, 732, 735, 5, 64, 33, 2, 733, 734, 7, 10, 2, 2, 734, 736, 5, 64, 33, 2, 735, 733, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 735, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 64, 2, 2, 741, 742, 7, 29, 2, 2, 742, 743, 5, 46, 24, 2, 743, 61, 3, 2, 2, 2, 744, 747, 7, 39, 2, 2, 745, 747, 5, 82, 42, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 63, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 65, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 752, 7, 7, 2, 2, 752, 753, 5, 38, 20, 2, 753, 67, 3, 2, 2, 2, 754, 757, 7, 53, 2, 2, 755, 757, 5, 82, 42, 2, 756, 754, 3, 2, 2, 2, 756, 755, 3, 2, 2, 2, 757, 69, 3, 2, 2, 2, 758, 763, 5, 46, 24, 2, 759, 760, 7, 10, 2, 2, 760, 762, 5, 46, 24, 2, 761, 759, 3, 2, 2, 2, 762, 765, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 71, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 766, 767, 5, 84, 43, 2, 767, 768, 7, 7, 2, 2, 768, 769, 5, 46, 24, 2, 769, 773, 3, 2, 2, 2, 770, 771, 7, 40, 2, 2, 771, 773, 5, 46, 24, 2, 772, 766, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 73, 3, 2, 2, 2, 774, 777, 5, 82, 42, 2, 775, 777, 9, 5, 2, 2, 776, 774, 3, 2, 2, 2, 776, 775, 3, 2, 2, 2, 777, 75, 3, 2, 2, 2, 778, 781, 5, 82, 42, 2, 779, 781, 9, 6, 2, 2, 780, 778, 3, 2, 2, 2, 780, 779, 3, 2, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 7, 2, 2, 783, 79, 3, 2, 2, 2, 784, 785, 9, 8, 2, 2, 785, 81, 3, 2, 2, 2, 786, 791, 5, 86, 44, 2, 787, 788, 7, 41, 2, 2, 788, 790, 5, 86, 44, 2, 789, 787, 3, 2, 2, 2, 790, 793, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 83, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 794, 799, 5, 86, 44, 2, 795, 796, 5, 82, 42, 2, 796, 797, 8, 43, 1, 2, 797, 799, 3, 2, 2, 2, 798, 794, 3, 2, 2, 2, 798, 795, 3, 2, 2, 2, 799, 85, 3, 2, 2, 2, 800, 801, 9, 9, 2, 2, 801, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 565, 569, 579, 582, 585, 610, 649, 652, 659, 661, 668, 675, 682, 691, 694, 705, 709, 721, 728, 737, 746, 756, 763, 772, 776, 780, 791, 798] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 805, 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, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 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, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 385, 10, 20, 12, 20, 14, 20, 388, 11, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 397, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 414, 10, 20, 12, 20, 14, 20, 417, 11, 20, 3, 20, 3, 20, 5, 20, 421, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 429, 10, 20, 12, 20, 14, 20, 432, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 445, 10, 22, 12, 22, 14, 22, 448, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 453, 10, 22, 3, 22, 3, 22, 5, 22, 457, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 466, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 482, 10, 24, 12, 24, 14, 24, 485, 11, 24, 3, 24, 5, 24, 488, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 497, 10, 24, 12, 24, 14, 24, 500, 11, 24, 3, 24, 5, 24, 503, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 513, 10, 24, 12, 24, 14, 24, 516, 11, 24, 3, 24, 5, 24, 519, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 528, 10, 24, 12, 24, 14, 24, 531, 11, 24, 3, 24, 5, 24, 534, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 542, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 550, 10, 24, 12, 24, 14, 24, 553, 11, 24, 3, 24, 5, 24, 556, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 759, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 764, 10, 36, 12, 36, 14, 36, 767, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 5, 39, 783, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 792, 10, 42, 12, 42, 14, 42, 795, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 801, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 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, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 904, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 420, 3, 2, 2, 2, 40, 433, 3, 2, 2, 2, 42, 456, 3, 2, 2, 2, 44, 458, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 752, 3, 2, 2, 2, 68, 758, 3, 2, 2, 2, 70, 760, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 782, 3, 2, 2, 2, 78, 784, 3, 2, 2, 2, 80, 786, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 800, 3, 2, 2, 2, 86, 802, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 421, 5, 38, 20, 15, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 421, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 421, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 421, 7, 64, 2, 2, 378, 379, 7, 63, 2, 2, 379, 380, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 386, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 385, 5, 38, 20, 2, 384, 382, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 391, 7, 10, 2, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 421, 3, 2, 2, 2, 394, 396, 7, 4, 2, 2, 395, 397, 5, 42, 22, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 421, 7, 5, 2, 2, 399, 421, 7, 30, 2, 2, 400, 421, 7, 31, 2, 2, 401, 421, 7, 32, 2, 2, 402, 421, 5, 40, 21, 2, 403, 421, 5, 82, 42, 2, 404, 405, 7, 63, 2, 2, 405, 406, 5, 38, 20, 2, 406, 407, 7, 64, 2, 2, 407, 421, 3, 2, 2, 2, 408, 409, 5, 82, 42, 2, 409, 410, 7, 13, 2, 2, 410, 415, 5, 38, 20, 2, 411, 412, 7, 10, 2, 2, 412, 414, 5, 38, 20, 2, 413, 411, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 419, 7, 14, 2, 2, 419, 421, 3, 2, 2, 2, 420, 348, 3, 2, 2, 2, 420, 366, 3, 2, 2, 2, 420, 371, 3, 2, 2, 2, 420, 376, 3, 2, 2, 2, 420, 378, 3, 2, 2, 2, 420, 394, 3, 2, 2, 2, 420, 399, 3, 2, 2, 2, 420, 400, 3, 2, 2, 2, 420, 401, 3, 2, 2, 2, 420, 402, 3, 2, 2, 2, 420, 403, 3, 2, 2, 2, 420, 404, 3, 2, 2, 2, 420, 408, 3, 2, 2, 2, 421, 430, 3, 2, 2, 2, 422, 423, 12, 17, 2, 2, 423, 424, 7, 28, 2, 2, 424, 429, 5, 38, 20, 17, 425, 426, 12, 16, 2, 2, 426, 427, 7, 29, 2, 2, 427, 429, 5, 38, 20, 16, 428, 422, 3, 2, 2, 2, 428, 425, 3, 2, 2, 2, 429, 432, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 39, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 433, 434, 7, 67, 2, 2, 434, 41, 3, 2, 2, 2, 435, 436, 5, 44, 23, 2, 436, 437, 7, 7, 2, 2, 437, 438, 5, 38, 20, 2, 438, 446, 3, 2, 2, 2, 439, 440, 7, 10, 2, 2, 440, 441, 5, 44, 23, 2, 441, 442, 7, 7, 2, 2, 442, 443, 5, 38, 20, 2, 443, 445, 3, 2, 2, 2, 444, 439, 3, 2, 2, 2, 445, 448, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 452, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 449, 453, 7, 10, 2, 2, 450, 451, 7, 15, 2, 2, 451, 453, 5, 86, 44, 2, 452, 449, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 457, 3, 2, 2, 2, 454, 455, 7, 15, 2, 2, 455, 457, 5, 86, 44, 2, 456, 435, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 43, 3, 2, 2, 2, 458, 459, 5, 84, 43, 2, 459, 45, 3, 2, 2, 2, 460, 461, 8, 24, 1, 2, 461, 613, 5, 56, 29, 2, 462, 463, 5, 74, 38, 2, 463, 465, 7, 63, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 64, 2, 2, 468, 613, 3, 2, 2, 2, 469, 470, 7, 52, 2, 2, 470, 613, 5, 46, 24, 28, 471, 472, 5, 82, 42, 2, 472, 473, 7, 34, 2, 2, 473, 474, 7, 62, 2, 2, 474, 475, 5, 46, 24, 24, 475, 613, 3, 2, 2, 2, 476, 477, 7, 45, 2, 2, 477, 478, 7, 4, 2, 2, 478, 483, 5, 46, 24, 2, 479, 480, 7, 10, 2, 2, 480, 482, 5, 46, 24, 2, 481, 479, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 488, 7, 10, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 7, 5, 2, 2, 490, 613, 3, 2, 2, 2, 491, 492, 7, 46, 2, 2, 492, 493, 7, 4, 2, 2, 493, 498, 5, 46, 24, 2, 494, 495, 7, 10, 2, 2, 495, 497, 5, 46, 24, 2, 496, 494, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 501, 503, 7, 10, 2, 2, 502, 501, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 7, 5, 2, 2, 505, 613, 3, 2, 2, 2, 506, 613, 5, 48, 25, 2, 507, 508, 7, 35, 2, 2, 508, 509, 7, 4, 2, 2, 509, 514, 5, 46, 24, 2, 510, 511, 7, 10, 2, 2, 511, 513, 5, 46, 24, 2, 512, 510, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 517, 519, 7, 10, 2, 2, 518, 517, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 5, 2, 2, 521, 613, 3, 2, 2, 2, 522, 523, 7, 36, 2, 2, 523, 524, 7, 4, 2, 2, 524, 529, 5, 46, 24, 2, 525, 526, 7, 10, 2, 2, 526, 528, 5, 46, 24, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 534, 7, 10, 2, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 536, 7, 5, 2, 2, 536, 613, 3, 2, 2, 2, 537, 542, 5, 82, 42, 2, 538, 542, 7, 44, 2, 2, 539, 542, 7, 43, 2, 2, 540, 542, 7, 42, 2, 2, 541, 537, 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, 542, 613, 3, 2, 2, 2, 543, 544, 7, 63, 2, 2, 544, 545, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 551, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 550, 5, 46, 24, 2, 549, 547, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 554, 556, 7, 10, 2, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 64, 2, 2, 558, 613, 3, 2, 2, 2, 559, 560, 7, 63, 2, 2, 560, 613, 7, 64, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 72, 37, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 72, 37, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 460, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 469, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 476, 3, 2, 2, 2, 612, 491, 3, 2, 2, 2, 612, 506, 3, 2, 2, 2, 612, 507, 3, 2, 2, 2, 612, 522, 3, 2, 2, 2, 612, 541, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 559, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 29, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 29, 617, 618, 12, 27, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 28, 620, 621, 12, 26, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 27, 623, 624, 12, 25, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 26, 626, 627, 12, 23, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 24, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 21, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 22, 634, 635, 12, 19, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 20, 637, 638, 12, 18, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 19, 640, 641, 12, 17, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 18, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 33, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 76, 39, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 30, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 84, 43, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 84, 43, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 82, 42, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 753, 5, 62, 32, 2, 753, 754, 7, 7, 2, 2, 754, 755, 5, 38, 20, 2, 755, 67, 3, 2, 2, 2, 756, 759, 7, 53, 2, 2, 757, 759, 5, 82, 42, 2, 758, 756, 3, 2, 2, 2, 758, 757, 3, 2, 2, 2, 759, 69, 3, 2, 2, 2, 760, 765, 5, 46, 24, 2, 761, 762, 7, 10, 2, 2, 762, 764, 5, 46, 24, 2, 763, 761, 3, 2, 2, 2, 764, 767, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 71, 3, 2, 2, 2, 767, 765, 3, 2, 2, 2, 768, 769, 5, 84, 43, 2, 769, 770, 7, 7, 2, 2, 770, 771, 5, 46, 24, 2, 771, 775, 3, 2, 2, 2, 772, 773, 7, 40, 2, 2, 773, 775, 5, 46, 24, 2, 774, 768, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 5, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 783, 5, 82, 42, 2, 781, 783, 9, 6, 2, 2, 782, 780, 3, 2, 2, 2, 782, 781, 3, 2, 2, 2, 783, 77, 3, 2, 2, 2, 784, 785, 9, 7, 2, 2, 785, 79, 3, 2, 2, 2, 786, 787, 9, 8, 2, 2, 787, 81, 3, 2, 2, 2, 788, 793, 5, 86, 44, 2, 789, 790, 7, 41, 2, 2, 790, 792, 5, 86, 44, 2, 791, 789, 3, 2, 2, 2, 792, 795, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 83, 3, 2, 2, 2, 795, 793, 3, 2, 2, 2, 796, 801, 5, 86, 44, 2, 797, 798, 5, 82, 42, 2, 798, 799, 8, 43, 1, 2, 799, 801, 3, 2, 2, 2, 800, 796, 3, 2, 2, 2, 800, 797, 3, 2, 2, 2, 801, 85, 3, 2, 2, 2, 802, 803, 9, 9, 2, 2, 803, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 386, 390, 396, 415, 420, 428, 430, 446, 452, 456, 465, 483, 487, 498, 502, 514, 518, 529, 533, 541, 551, 555, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 758, 765, 774, 778, 782, 793, 800] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 0c24f2792..794ecca5c 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -13,6 +13,7 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; @@ -168,6 +169,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeList?: (ctx: TypeListContext) => void; + /** + * Enter a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeUnit?: (ctx: TypeUnitContext) => void; + /** + * Exit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeUnit?: (ctx: TypeUnitContext) => void; + /** * Enter a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 42faa5ee2..0d88c2494 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1389,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 416; + this.state = 418; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: @@ -1443,7 +1443,7 @@ export class QuintParser extends Parser { this.state = 362; this.match(QuintParser.T__26); this.state = 363; - this.type(12); + this.type(13); } break; @@ -1481,174 +1481,186 @@ export class QuintParser extends Parser { case 4: { - _localctx = new TypeTupleContext(_localctx); + _localctx = new TypeUnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; this.state = 374; this.match(QuintParser.LPAREN); this.state = 375; - this.type(0); + this.match(QuintParser.RPAREN); + } + break; + + case 5: + { + _localctx = new TypeTupleContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; this.state = 376; - this.match(QuintParser.T__7); + this.match(QuintParser.LPAREN); this.state = 377; this.type(0); - this.state = 382; + this.state = 378; + this.match(QuintParser.T__7); + this.state = 379; + this.type(0); + this.state = 384; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 378; + this.state = 380; this.match(QuintParser.T__7); - this.state = 379; + this.state = 381; this.type(0); } } } - this.state = 384; + this.state = 386; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 386; + this.state = 388; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 385; + this.state = 387; this.match(QuintParser.T__7); } } - this.state = 388; + this.state = 390; this.match(QuintParser.RPAREN); } break; - case 5: + case 6: { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 390; - this.match(QuintParser.T__1); this.state = 392; + this.match(QuintParser.T__1); + this.state = 394; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 391; + this.state = 393; this.row(); } } - this.state = 394; + this.state = 396; this.match(QuintParser.T__2); } break; - case 6: + case 7: { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 395; + this.state = 397; this.match(QuintParser.T__27); } break; - case 7: + case 8: { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 398; this.match(QuintParser.T__28); } break; - case 8: + case 9: { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 399; this.match(QuintParser.T__29); } break; - case 9: + case 10: { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 400; this.typeVar(); } break; - case 10: + case 11: { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 401; this.qualId(); } break; - case 11: + case 12: { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 402; this.match(QuintParser.LPAREN); - this.state = 401; + this.state = 403; this.type(0); - this.state = 402; + this.state = 404; this.match(QuintParser.RPAREN); } break; - case 12: + case 13: { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 404; + this.state = 406; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 405; + this.state = 407; this.match(QuintParser.T__10); - this.state = 406; + this.state = 408; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 411; + this.state = 413; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 407; + this.state = 409; this.match(QuintParser.T__7); - this.state = 408; + this.state = 410; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 413; + this.state = 415; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 414; + this.state = 416; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 426; + this.state = 428; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1658,21 +1670,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 424; + this.state = 426; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 418; - if (!(this.precpred(this._ctx, 14))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + this.state = 420; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 419; + this.state = 421; this.match(QuintParser.T__25); - this.state = 420; - this.type(14); + this.state = 422; + this.type(15); } break; @@ -1680,20 +1692,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 421; - if (!(this.precpred(this._ctx, 13))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); + this.state = 423; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 422; + this.state = 424; this.match(QuintParser.T__26); - this.state = 423; - this.type(13); + this.state = 425; + this.type(14); } break; } } } - this.state = 428; + this.state = 430; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1720,7 +1732,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 429; + this.state = 431; this.match(QuintParser.LOW_ID); } } @@ -1744,7 +1756,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 452; + this.state = 454; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1752,50 +1764,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 431; + this.state = 433; this.rowLabel(); - this.state = 432; + this.state = 434; this.match(QuintParser.T__4); - this.state = 433; + this.state = 435; this.type(0); } - this.state = 442; + this.state = 444; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 435; + this.state = 437; this.match(QuintParser.T__7); - this.state = 436; + this.state = 438; this.rowLabel(); - this.state = 437; + this.state = 439; this.match(QuintParser.T__4); - this.state = 438; + this.state = 440; this.type(0); } } } - this.state = 444; + this.state = 446; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 448; + this.state = 450; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 445; + this.state = 447; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 446; + this.state = 448; this.match(QuintParser.T__12); { - this.state = 447; + this.state = 449; _localctx._rowVar = this.identifier(); } } @@ -1810,10 +1822,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 450; + this.state = 452; this.match(QuintParser.T__12); { - this.state = 451; + this.state = 453; _localctx._rowVar = this.identifier(); } } @@ -1843,7 +1855,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 454; + this.state = 456; this.simpleId("record"); } } @@ -1881,7 +1893,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 608; + this.state = 610; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1890,7 +1902,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 457; + this.state = 459; this.lambda(); } break; @@ -1900,21 +1912,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 458; + this.state = 460; this.normalCallName(); - this.state = 459; - this.match(QuintParser.LPAREN); this.state = 461; + this.match(QuintParser.LPAREN); + this.state = 463; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 460; + this.state = 462; this.argList(); } } - this.state = 463; + this.state = 465; this.match(QuintParser.RPAREN); } break; @@ -1924,9 +1936,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 465; + this.state = 467; this.match(QuintParser.MINUS); - this.state = 466; + this.state = 468; this.expr(26); } break; @@ -1936,13 +1948,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 467; + this.state = 469; this.qualId(); - this.state = 468; + this.state = 470; this.match(QuintParser.T__31); - this.state = 469; + this.state = 471; this.match(QuintParser.ASGN); - this.state = 470; + this.state = 472; this.expr(22); } break; @@ -1952,41 +1964,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 472; + this.state = 474; this.match(QuintParser.AND); - this.state = 473; + this.state = 475; this.match(QuintParser.T__1); - this.state = 474; + this.state = 476; this.expr(0); - this.state = 479; + this.state = 481; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 475; + this.state = 477; this.match(QuintParser.T__7); - this.state = 476; + this.state = 478; this.expr(0); } } } - this.state = 481; + this.state = 483; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 483; + this.state = 485; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 482; + this.state = 484; this.match(QuintParser.T__7); } } - this.state = 485; + this.state = 487; this.match(QuintParser.T__2); } break; @@ -1996,41 +2008,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 487; + this.state = 489; this.match(QuintParser.OR); - this.state = 488; + this.state = 490; this.match(QuintParser.T__1); - this.state = 489; + this.state = 491; this.expr(0); - this.state = 494; + this.state = 496; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 490; + this.state = 492; this.match(QuintParser.T__7); - this.state = 491; + this.state = 493; this.expr(0); } } } - this.state = 496; + this.state = 498; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 498; + this.state = 500; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 497; + this.state = 499; this.match(QuintParser.T__7); } } - this.state = 500; + this.state = 502; this.match(QuintParser.T__2); } break; @@ -2040,7 +2052,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 502; + this.state = 504; this.matchSumExpr(); } break; @@ -2050,41 +2062,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 503; + this.state = 505; this.match(QuintParser.T__32); - this.state = 504; + this.state = 506; this.match(QuintParser.T__1); - this.state = 505; + this.state = 507; this.expr(0); - this.state = 510; + this.state = 512; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 506; + this.state = 508; this.match(QuintParser.T__7); - this.state = 507; + this.state = 509; this.expr(0); } } } - this.state = 512; + this.state = 514; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 514; + this.state = 516; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 513; + this.state = 515; this.match(QuintParser.T__7); } } - this.state = 516; + this.state = 518; this.match(QuintParser.T__2); } break; @@ -2094,41 +2106,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 518; + this.state = 520; this.match(QuintParser.T__33); - this.state = 519; + this.state = 521; this.match(QuintParser.T__1); - this.state = 520; + this.state = 522; this.expr(0); - this.state = 525; + this.state = 527; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 521; + this.state = 523; this.match(QuintParser.T__7); - this.state = 522; + this.state = 524; this.expr(0); } } } - this.state = 527; + this.state = 529; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 529; + this.state = 531; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 528; + this.state = 530; this.match(QuintParser.T__7); } } - this.state = 531; + this.state = 533; this.match(QuintParser.T__2); } break; @@ -2138,31 +2150,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 537; + this.state = 539; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 533; + this.state = 535; this.qualId(); } break; case QuintParser.INT: { - this.state = 534; + this.state = 536; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 535; + this.state = 537; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 536; + this.state = 538; this.match(QuintParser.STRING); } break; @@ -2177,43 +2189,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 539; + this.state = 541; this.match(QuintParser.LPAREN); - this.state = 540; + this.state = 542; this.expr(0); - this.state = 541; + this.state = 543; this.match(QuintParser.T__7); - this.state = 542; + this.state = 544; this.expr(0); - this.state = 547; + this.state = 549; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 543; + this.state = 545; this.match(QuintParser.T__7); - this.state = 544; + this.state = 546; this.expr(0); } } } - this.state = 549; + this.state = 551; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 551; + this.state = 553; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 550; + this.state = 552; this.match(QuintParser.T__7); } } - this.state = 553; + this.state = 555; this.match(QuintParser.RPAREN); } break; @@ -2223,9 +2235,9 @@ export class QuintParser extends Parser { _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 555; + this.state = 557; this.match(QuintParser.LPAREN); - this.state = 556; + this.state = 558; this.match(QuintParser.RPAREN); } break; @@ -2235,39 +2247,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 557; + this.state = 559; this.match(QuintParser.T__1); - this.state = 558; + this.state = 560; this.recElem(); - this.state = 563; + this.state = 565; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 559; + this.state = 561; this.match(QuintParser.T__7); - this.state = 560; + this.state = 562; this.recElem(); } } } - this.state = 565; + this.state = 567; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 567; + this.state = 569; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 566; + this.state = 568; this.match(QuintParser.T__7); } } - this.state = 569; + this.state = 571; this.match(QuintParser.T__2); } break; @@ -2277,47 +2289,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 571; + this.state = 573; this.match(QuintParser.T__10); - this.state = 580; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 572; + this.state = 574; this.expr(0); - this.state = 577; + this.state = 579; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 573; + this.state = 575; this.match(QuintParser.T__7); - this.state = 574; + this.state = 576; this.expr(0); } } } - this.state = 579; + this.state = 581; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 583; + this.state = 585; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 582; + this.state = 584; this.match(QuintParser.T__7); } } - this.state = 585; + this.state = 587; this.match(QuintParser.T__11); } break; @@ -2327,19 +2339,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 586; - this.match(QuintParser.T__34); - this.state = 587; - this.match(QuintParser.LPAREN); this.state = 588; - this.expr(0); + this.match(QuintParser.T__34); this.state = 589; - this.match(QuintParser.RPAREN); + this.match(QuintParser.LPAREN); this.state = 590; this.expr(0); this.state = 591; - this.match(QuintParser.T__35); + this.match(QuintParser.RPAREN); this.state = 592; + this.expr(0); + this.state = 593; + this.match(QuintParser.T__35); + this.state = 594; this.expr(5); } break; @@ -2349,9 +2361,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 594; + this.state = 596; this.operDef(); - this.state = 595; + this.state = 597; this.expr(4); } break; @@ -2361,9 +2373,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 597; + this.state = 599; this.nondetOperDef(); - this.state = 598; + this.state = 600; this.expr(3); } break; @@ -2373,11 +2385,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 600; + this.state = 602; this.match(QuintParser.LPAREN); - this.state = 601; + this.state = 603; this.expr(0); - this.state = 602; + this.state = 604; this.match(QuintParser.RPAREN); } break; @@ -2387,17 +2399,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 604; + this.state = 606; this.match(QuintParser.T__1); - this.state = 605; + this.state = 607; this.expr(0); - this.state = 606; + this.state = 608; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 659; + this.state = 661; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2407,20 +2419,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 657; + this.state = 659; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 610; + this.state = 612; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 611; + this.state = 613; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 612; + this.state = 614; this.expr(27); } break; @@ -2429,11 +2441,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 613; + this.state = 615; if (!(this.precpred(this._ctx, 25))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); } - this.state = 614; + this.state = 616; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2446,7 +2458,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 615; + this.state = 617; this.expr(26); } break; @@ -2455,11 +2467,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 616; + this.state = 618; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 617; + this.state = 619; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2472,7 +2484,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 618; + this.state = 620; this.expr(25); } break; @@ -2481,11 +2493,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 619; + this.state = 621; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 620; + this.state = 622; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2498,7 +2510,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 621; + this.state = 623; this.expr(24); } break; @@ -2507,13 +2519,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 622; + this.state = 624; if (!(this.precpred(this._ctx, 21))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); } - this.state = 623; + this.state = 625; this.match(QuintParser.ASGN); - this.state = 624; + this.state = 626; this.expr(22); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2526,13 +2538,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 627; + this.state = 629; if (!(this.precpred(this._ctx, 19))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 628; + this.state = 630; this.match(QuintParser.AND); - this.state = 629; + this.state = 631; this.expr(20); } break; @@ -2541,13 +2553,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 630; + this.state = 632; if (!(this.precpred(this._ctx, 17))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } - this.state = 631; + this.state = 633; this.match(QuintParser.OR); - this.state = 632; + this.state = 634; this.expr(18); } break; @@ -2556,13 +2568,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 633; + this.state = 635; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 634; + this.state = 636; this.match(QuintParser.IFF); - this.state = 635; + this.state = 637; this.expr(17); } break; @@ -2571,13 +2583,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 636; + this.state = 638; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 637; + this.state = 639; this.match(QuintParser.IMPLIES); - this.state = 638; + this.state = 640; this.expr(16); } break; @@ -2586,13 +2598,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 639; + this.state = 641; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 640; + this.state = 642; this.match(QuintParser.T__25); - this.state = 641; + this.state = 643; this.expr(9); } break; @@ -2601,32 +2613,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 642; + this.state = 644; if (!(this.precpred(this._ctx, 31))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); } - this.state = 643; + this.state = 645; this.match(QuintParser.T__21); - this.state = 644; + this.state = 646; this.nameAfterDot(); - this.state = 650; + this.state = 652; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 645; - this.match(QuintParser.LPAREN); this.state = 647; + this.match(QuintParser.LPAREN); + this.state = 649; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (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__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 646; + this.state = 648; this.argList(); } } - this.state = 649; + this.state = 651; this.match(QuintParser.RPAREN); } break; @@ -2638,22 +2650,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 652; + this.state = 654; if (!(this.precpred(this._ctx, 28))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); } - this.state = 653; + this.state = 655; this.match(QuintParser.T__10); - this.state = 654; + this.state = 656; this.expr(0); - this.state = 655; + this.state = 657; this.match(QuintParser.T__11); } break; } } } - this.state = 661; + this.state = 663; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2681,43 +2693,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 662; + this.state = 664; this.match(QuintParser.MATCH); - this.state = 663; + this.state = 665; this.expr(0); - this.state = 664; - this.match(QuintParser.T__1); this.state = 666; + this.match(QuintParser.T__1); + this.state = 668; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 665; + this.state = 667; this.match(QuintParser.T__12); } } - this.state = 668; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 673; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 669; + this.state = 671; this.match(QuintParser.T__12); - this.state = 670; + this.state = 672; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 675; + this.state = 677; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 676; + this.state = 678; this.match(QuintParser.T__2); } } @@ -2742,28 +2754,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 680; + this.state = 682; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 678; + this.state = 680; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 679; + this.state = 681; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 682; + this.state = 684; this.match(QuintParser.T__26); - this.state = 683; + this.state = 685; this.expr(0); } } @@ -2790,36 +2802,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 685; + this.state = 687; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 692; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 686; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 689; + this.state = 691; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 687; + this.state = 689; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 688; + this.state = 690; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 691; + this.state = 693; this.match(QuintParser.RPAREN); } } @@ -2845,15 +2857,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 703; + this.state = 705; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 694; + this.state = 696; this.declaration(); - this.state = 695; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2861,9 +2873,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 697; + this.state = 699; this.expr(0); - this.state = 698; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2871,9 +2883,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 700; + this.state = 702; this.match(QuintParser.DOCCOMMENT); - this.state = 701; + this.state = 703; this.match(QuintParser.EOF); } break; @@ -2881,7 +2893,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 702; + this.state = 704; this.match(QuintParser.EOF); } break; @@ -2906,13 +2918,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 707; + this.state = 709; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 707; this.lambdaUnsugared(); } break; @@ -2920,7 +2932,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 706; + this.state = 708; this.lambdaTupleSugar(); } break; @@ -2946,7 +2958,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 726; + this.state = 728; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2954,42 +2966,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 709; + this.state = 711; this.parameter(); - this.state = 710; + this.state = 712; this.match(QuintParser.T__26); - this.state = 711; + this.state = 713; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 713; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 714; + this.state = 716; this.parameter(); - this.state = 719; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 715; + this.state = 717; this.match(QuintParser.T__7); - this.state = 716; + this.state = 718; this.parameter(); } } - this.state = 721; + this.state = 723; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 722; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 723; + this.state = 725; this.match(QuintParser.T__26); - this.state = 724; + this.state = 726; this.expr(0); } break; @@ -3019,35 +3031,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 728; + this.state = 730; this.match(QuintParser.LPAREN); - this.state = 729; + this.state = 731; this.match(QuintParser.LPAREN); - this.state = 730; + this.state = 732; this.parameter(); - this.state = 733; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 731; + this.state = 733; this.match(QuintParser.T__7); - this.state = 732; + this.state = 734; this.parameter(); } } - this.state = 735; + this.state = 737; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 737; + this.state = 739; this.match(QuintParser.RPAREN); - this.state = 738; + this.state = 740; this.match(QuintParser.RPAREN); - this.state = 739; + this.state = 741; this.match(QuintParser.T__26); - this.state = 740; + this.state = 742; this.expr(0); } } @@ -3070,13 +3082,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 744; + this.state = 746; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 742; + this.state = 744; this.match(QuintParser.T__36); } break; @@ -3084,7 +3096,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 743; + this.state = 745; this.qualId(); } break; @@ -3113,7 +3125,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 748; _localctx._paramName = this.identOrHole(); } } @@ -3138,11 +3150,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 748; + this.state = 750; _localctx._paramName = this.identOrHole(); - this.state = 749; + this.state = 751; this.match(QuintParser.T__4); - this.state = 750; + this.state = 752; this.type(0); } } @@ -3165,13 +3177,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 754; + this.state = 756; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 752; + this.state = 754; this.match(QuintParser.MUL); } break; @@ -3179,7 +3191,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 753; + this.state = 755; this.qualId(); } break; @@ -3209,21 +3221,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 756; + this.state = 758; this.expr(0); - this.state = 761; + this.state = 763; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 757; + this.state = 759; this.match(QuintParser.T__7); - this.state = 758; + this.state = 760; this.expr(0); } } - this.state = 763; + this.state = 765; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3248,27 +3260,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 770; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 764; + this.state = 766; this.simpleId("record"); - this.state = 765; + this.state = 767; this.match(QuintParser.T__4); - this.state = 766; + this.state = 768; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 768; + this.state = 770; this.match(QuintParser.T__37); - this.state = 769; + this.state = 771; this.expr(0); } break; @@ -3296,14 +3308,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 774; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 772; + this.state = 774; this.qualId(); } break; @@ -3316,7 +3328,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 773; + this.state = 775; _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.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3355,14 +3367,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 778; + this.state = 780; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 776; + this.state = 778; this.qualId(); } break; @@ -3372,7 +3384,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 777; + this.state = 779; _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))) { @@ -3413,7 +3425,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 782; _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); @@ -3449,7 +3461,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 784; _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); @@ -3485,23 +3497,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 784; + this.state = 786; this.identifier(); - this.state = 789; + this.state = 791; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 785; + this.state = 787; this.match(QuintParser.T__38); - this.state = 786; + this.state = 788; this.identifier(); } } } - this.state = 791; + this.state = 793; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3526,13 +3538,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 796; + this.state = 798; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 792; + this.state = 794; this.identifier(); } break; @@ -3540,7 +3552,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 793; + this.state = 795; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3576,7 +3588,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 798; + this.state = 800; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3618,10 +3630,10 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 14); + return this.precpred(this._ctx, 15); case 1: - return this.precpred(this._ctx, 13); + return this.precpred(this._ctx, 14); } return true; } @@ -3668,7 +3680,7 @@ 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\x03H\u0323\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0325\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" + @@ -3708,389 +3720,390 @@ export class QuintParser extends Parser { "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x07\x14\u017F\n\x14\f\x14\x0E\x14\u0182\v\x14" + - "\x03\x14\x05\x14\u0185\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018B" + - "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u019C" + - "\n\x14\f\x14\x0E\x14\u019F\v\x14\x03\x14\x03\x14\x05\x14\u01A3\n\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AB\n\x14\f\x14" + - "\x0E\x14\u01AE\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BB\n\x16\f\x16\x0E\x16" + - "\u01BE\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03\x16\x03\x16" + - "\x05\x16\u01C7\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x05\x18\u01D0\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u01E0\n\x18\f\x18\x0E\x18\u01E3\v\x18\x03\x18\x05\x18\u01E6\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EF\n\x18" + - "\f\x18\x0E\x18\u01F2\v\x18\x03\x18\x05\x18\u01F5\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01FF\n\x18\f" + - "\x18\x0E\x18\u0202\v\x18\x03\x18\x05\x18\u0205\n\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020E\n\x18\f\x18\x0E\x18" + - "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + - "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x07\x18\u0234\n\x18\f\x18\x0E\x18\u0237\v\x18\x03\x18\x05\x18" + - "\u023A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0242" + - "\n\x18\f\x18\x0E\x18\u0245\v\x18\x05\x18\u0247\n\x18\x03\x18\x05\x18\u024A" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0263\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0181\n\x14\f\x14\x0E" + + "\x14\u0184\v\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x05\x14\u018D\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u019E\n\x14\f\x14\x0E\x14\u01A1\v\x14\x03\x14\x03\x14\x05\x14" + + "\u01A5\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AD" + + "\n\x14\f\x14\x0E\x14\u01B0\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BD\n\x16\f" + + "\x16\x0E\x16\u01C0\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C5\n\x16\x03" + + "\x16\x03\x16\x05\x16\u01C9\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u01D2\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x07\x18\u01E2\n\x18\f\x18\x0E\x18\u01E5\v\x18\x03\x18\x05\x18\u01E8" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u01F1\n\x18\f\x18\x0E\x18\u01F4\v\x18\x03\x18\x05\x18\u01F7\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0201" + + "\n\x18\f\x18\x0E\x18\u0204\v\x18\x03\x18\x05\x18\u0207\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0210\n\x18\f\x18" + + "\x0E\x18\u0213\v\x18\x03\x18\x05\x18\u0216\n\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x05\x18\u021E\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x07\x18\u0226\n\x18\f\x18\x0E\x18\u0229\v\x18\x03" + + "\x18\x05\x18\u022C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18\u0239\v\x18\x03\x18" + + "\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18\u0249\n\x18\x03\x18" + + "\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x05\x18\u028A\n\x18\x03\x18\x05\x18\u028D\n\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x07\x18\u0294\n\x18\f\x18\x0E\x18\u0297\v\x18\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029D\n\x19\x03\x19\x03\x19\x03\x19" + - "\x07\x19\u02A2\n\x19\f\x19\x0E\x19\u02A5\v\x19\x03\x19\x03\x19\x03\x1A" + - "\x03\x1A\x05\x1A\u02AB\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x05\x1B\u02B4\n\x1B\x03\x1B\x05\x1B\u02B7\n\x1B\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C2" + - "\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C6\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D0\n\x1E\f\x1E\x0E\x1E" + - "\u02D3\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D9\n\x1E\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E0\n\x1F\r\x1F\x0E\x1F\u02E1" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EB\n \x03!" + - "\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F5\n#\x03$\x03$\x03$\x07" + - "$\u02FA\n$\f$\x0E$\u02FD\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0305\n" + - "%\x03&\x03&\x05&\u0309\n&\x03\'\x03\'\x05\'\u030D\n\'\x03(\x03(\x03)\x03" + - ")\x03*\x03*\x03*\x07*\u0316\n*\f*\x0E*\u0319\v*\x03+\x03+\x03+\x03+\x05" + - "+\u031F\n+\x03,\x03,\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@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02" + - "R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02" + - "-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0385\x02Y\x03\x02\x02\x02\x04" + - "b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03" + - "\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03" + - "\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101" + - "\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C" + - "\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02" + - "\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02" + - "(\u01AF\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02" + - ".\u0262\x03\x02\x02\x020\u0298\x03\x02\x02\x022\u02AA\x03\x02\x02\x02" + - "4\u02AF\x03\x02\x02\x026\u02C1\x03\x02\x02\x028\u02C5\x03\x02\x02\x02" + - ":\u02D8\x03\x02\x02\x02<\u02DA\x03\x02\x02\x02>\u02EA\x03\x02\x02\x02" + - "@\u02EC\x03\x02\x02\x02B\u02EE\x03\x02\x02\x02D\u02F4\x03\x02\x02\x02" + - "F\u02F6\x03\x02\x02\x02H\u0304\x03\x02\x02\x02J\u0308\x03\x02\x02\x02" + - "L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02\x02\x02" + - "R\u0312\x03\x02\x02\x02T\u031E\x03\x02\x02\x02V\u0320\x03\x02\x02\x02" + - "XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02" + - "[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02" + - "\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02" + - "\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03" + - "\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02" + - "\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02" + - "\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02" + - "\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02" + - "\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02" + - "\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02" + - "|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02" + - "\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02" + - "\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03" + - "\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05" + - "\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02" + - "\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02" + - "\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02" + - "\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16" + - "\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93" + - "\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03" + - "\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03" + - "\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07" + - "\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18" + - "\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02" + - "\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02" + - "\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5" + - "\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05" + - "@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02" + - "\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02" + - "\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02" + - "\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02" + - "\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&" + - "\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02" + - "\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02" + - "\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02" + - "\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02" + - "\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02" + - "\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3" + - "\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03" + - "\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>" + - "\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02" + - "\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02" + - "\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02" + - "\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4" + - "\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6" + - "\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9" + - "\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB" + - "\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD" + - "\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0" + - "\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3" + - "\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5" + - "\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05" + - "&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02" + - "\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10" + - "\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02" + - "\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02" + - "\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5" + - "\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102" + - "\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB" + - "\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02" + - "\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16" + - "\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA" + - "\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101" + - "\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02" + - "\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106" + - "\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108" + - "\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02" + - "\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F" + - "\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F" + - "\u010D\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02" + - "\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111" + - "\x03\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02" + - "\u0115\u0103\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03" + - "\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119" + - "\u011A\x07\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02" + - "\u011C\u011D\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07" + - "\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120" + - "\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02" + - "\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125" + - "\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02" + - "\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18" + - "\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07" + - ">\x02\x02\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A" + - "\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02" + - "\u0131\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03" + - "\x02\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136" + - "\u0139\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02" + - "\u0139\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03" + - "\x02\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + - "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + - "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + - "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + - "\x02\x02\x02\u0146\u0141\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148" + - "\u0146\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02" + - "\x02\x02\u014A\u0148\x03\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D" + - "\x07\x1A\x02\x02\u014D\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02" + - "\u014F\u0151\x05$\x13\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03" + - "\x02\x02\x02\u0151\u0153\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152" + - "\u013B\x03\x02\x02\x02\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02" + - "\u0155\x1F\x03\x02\x02\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02" + - "\u0158\u0159\x05R*\x02\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02" + - "\u015B%\x03\x02\x02\x02\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02" + - "\x02\u015E\u0163\x05&\x14\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05" + - "&\x14\x02\u0161\u015F\x03\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163" + - "\u0161\x03\x02\x02\x02\u0163\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02" + - "\x02\x02\u0165\u0163\x03\x02\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166" + - "\u0167\x03\x02\x02\x02\u0167\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02" + - "\x02\u0169\u0168\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B" + - "\x03\x02\x02\x02\u016B\u016C\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02" + - "\u016D\u01A3\x05&\x14\x0E\u016E\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02" + - "\x02\u0170\u0171\x05&\x14\x02\u0171\u0172\x07\x0E\x02\x02\u0172\u01A3" + - "\x03\x02\x02\x02\u0173\u0174\x07B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175" + - "\u0176\x05&\x14\x02\u0176\u0177\x07\x0E\x02\x02\u0177\u01A3\x03\x02\x02" + - "\x02\u0178\u0179\x07?\x02\x02\u0179\u017A\x05&\x14\x02\u017A\u017B\x07" + - "\n\x02\x02\u017B\u0180\x05&\x14\x02\u017C\u017D\x07\n\x02\x02\u017D\u017F" + - "\x05&\x14\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0182\x03\x02\x02\x02" + - "\u0180\u017E\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03" + - "\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0185\x07\n\x02\x02\u0184" + - "\u0183\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02" + - "\x02\x02\u0186\u0187\x07@\x02\x02\u0187\u01A3\x03\x02\x02\x02\u0188\u018A" + - "\x07\x04\x02\x02\u0189\u018B\x05*\x16\x02\u018A\u0189\x03\x02\x02\x02" + - "\u018A\u018B\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u01A3\x07" + - "\x05\x02\x02\u018D\u01A3\x07\x1E\x02\x02\u018E\u01A3\x07\x1F\x02\x02\u018F" + - "\u01A3\x07 \x02\x02\u0190\u01A3\x05(\x15\x02\u0191\u01A3\x05R*\x02\u0192" + - "\u0193\x07?\x02\x02\u0193\u0194\x05&\x14\x02\u0194\u0195\x07@\x02\x02" + - "\u0195\u01A3\x03\x02\x02\x02\u0196\u0197\x05R*\x02\u0197\u0198\x07\r\x02" + - "\x02\u0198\u019D\x05&\x14\x02\u0199\u019A\x07\n\x02\x02\u019A\u019C\x05" + - "&\x14\x02\u019B\u0199\x03\x02\x02\x02\u019C\u019F\x03\x02\x02\x02\u019D" + - "\u019B\x03\x02\x02\x02\u019D\u019E\x03\x02\x02\x02\u019E\u01A0\x03\x02" + - "\x02\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A1\x07\x0E\x02\x02\u01A1" + - "\u01A3\x03\x02\x02\x02\u01A2\u015C\x03\x02\x02\x02\u01A2\u016E\x03\x02" + - "\x02\x02\u01A2\u0173\x03\x02\x02\x02\u01A2\u0178\x03\x02\x02\x02\u01A2" + - "\u0188\x03\x02\x02\x02\u01A2\u018D\x03\x02\x02\x02\u01A2\u018E\x03\x02" + - "\x02\x02\u01A2\u018F\x03\x02\x02\x02\u01A2\u0190\x03\x02\x02\x02\u01A2" + - "\u0191\x03\x02\x02\x02\u01A2\u0192\x03\x02\x02\x02\u01A2\u0196\x03\x02" + - "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A5\f\x10\x02\x02\u01A5\u01A6" + - "\x07\x1C\x02\x02\u01A6\u01AB\x05&\x14\x10\u01A7\u01A8\f\x0F\x02\x02\u01A8" + - "\u01A9\x07\x1D\x02\x02\u01A9\u01AB\x05&\x14\x0F\u01AA\u01A4\x03\x02\x02" + - "\x02\u01AA\u01A7\x03\x02\x02\x02\u01AB\u01AE\x03\x02\x02\x02\u01AC\u01AA" + - "\x03\x02\x02\x02\u01AC\u01AD\x03\x02\x02\x02\u01AD\'\x03\x02\x02\x02\u01AE" + - "\u01AC\x03\x02\x02\x02\u01AF\u01B0\x07C\x02\x02\u01B0)\x03\x02\x02\x02" + - "\u01B1\u01B2\x05,\x17\x02\u01B2\u01B3\x07\x07\x02\x02\u01B3\u01B4\x05" + - "&\x14\x02\u01B4\u01BC\x03\x02\x02\x02\u01B5\u01B6\x07\n\x02\x02\u01B6" + - "\u01B7\x05,\x17\x02\u01B7\u01B8\x07\x07\x02\x02\u01B8\u01B9\x05&\x14\x02" + - "\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01B5\x03\x02\x02\x02\u01BB\u01BE\x03" + - "\x02\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BC\u01BD\x03\x02\x02\x02\u01BD" + - "\u01C2\x03\x02\x02\x02\u01BE\u01BC\x03\x02\x02\x02\u01BF\u01C3\x07\n\x02" + - "\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05V,\x02\u01C2\u01BF\x03" + - "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3" + - "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + - "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + - "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + - "\x01\x02\u01CB\u0263\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + - "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + - "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + - "\u01D2\u0263\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0263\x05" + - ".\x18\x1C\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + - "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x18\u01D9\u0263\x03\x02\x02\x02\u01DA" + - "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + - "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + - "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + - "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + - "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + - "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + - "\u01E8\u0263\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + - "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + - "\u01EF\x05.\x18\x02"; + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0265" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18\u028F\n\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18\f\x18\x0E\x18\u0299" + + "\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F\n\x19\x03\x19\x03" + + "\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7\v\x19\x03\x19\x03" + + "\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + + "\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B\x05\x1B\u02B9\n\x1B" + + "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + + "\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8\n\x1D\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D2\n\x1E\f" + + "\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02DB" + + "\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E2\n\x1F\r\x1F" + + "\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 " + + "\u02ED\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F7\n#\x03" + + "$\x03$\x03$\x07$\u02FC\n$\f$\x0E$\u02FF\v$\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'\x03\'\x05\'\u030F\n\'\x03" + + "(\x03(\x03)\x03)\x03*\x03*\x03*\x07*\u0318\n*\f*\x0E*\u031B\v*\x03+\x03" + + "+\x03+\x03+\x05+\u0321\n+\x03,\x03,\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.\x02" + + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + + "L\x02N\x02P\x02R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04" + + "\x02-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0388\x02Y\x03" + + "\x02\x02\x02\x04b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02" + + "\x02\n\xBE\x03\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02" + + "\x10\xDC\x03\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02" + + "\x16\u0101\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02" + + "\x02\x02\x1C\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03" + + "\x02\x02\x02\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A4\x03" + + "\x02\x02\x02(\u01B1\x03\x02\x02\x02*\u01C8\x03\x02\x02\x02,\u01CA\x03" + + "\x02\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03" + + "\x02\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03" + + "\x02\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03" + + "\x02\x02\x02@\u02EE\x03\x02\x02\x02B\u02F0\x03\x02\x02\x02D\u02F6\x03" + + "\x02\x02\x02F\u02F8\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03" + + "\x02\x02\x02L\u030E\x03\x02\x02\x02N\u0310\x03\x02\x02\x02P\u0312\x03" + + "\x02\x02\x02R\u0314\x03\x02\x02\x02T\u0320\x03\x02\x02\x02V\u0322\x03" + + "\x02\x02\x02XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03" + + "\x02\x02\x02[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^" + + "\x03\x03\x02\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02" + + "b`\x03\x02\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02" + + "ef\x07\x03\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03" + + "\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03" + + "\x02\x02\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02" + + "pr\x07E\x02\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02" + + "st\x03\x02\x02\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02" + + "w\x07\x03\x02\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02" + + "{|\x05&\x14\x02|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F" + + "\x80\x07\x07\x02\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82" + + "\x83\x07\t\x02\x02\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05" + + ".\x18\x02\x86\x8D\x03\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05" + + "\n\x06\x02\x89\x8D\x05\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A" + + "\x0E\x02\x8Cx\x03\x02\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02" + + "\x02\x8C\x87\x03\x02\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02" + + "\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02" + + "\x02\x8E\x8F\x05\x16\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91" + + "\x96\x05B\"\x02\x92\x93\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02" + + "\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02" + + "\x02\x02\x97\x99\x03\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@" + + "\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02" + + "\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02" + + "\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02" + + "\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f" + + "\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8" + + "\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02" + + "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02" + + "\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02" + + "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02" + + "\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07" + + "\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02" + + "\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18" + + "\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02" + + "\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02" + + "\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02" + + "\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2" + + "\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6" + + "\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05" + + "\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02" + + "\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02" + + "\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02" + + "\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1" + + "\x03\x02\x02\x02\xD4\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6" + + "\x03\x02\x02\x02\xD6\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA" + + "\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F" + + "\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD" + + "\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0" + + "\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5" + + "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11" + + "\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07" + + "?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02" + + "\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02" + + "\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02" + + "\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02" + + "\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5" + + "\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7" + + "\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02" + + "\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02" + + "\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07" + + "\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101" + + "\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02" + + "\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02" + + "\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105" + + "\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107" + + "\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02" + + "\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C" + + "\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02" + + "\u010E\u0110\x05 \x11\x02\u010F\u010D\x03\x02\x02\x02\u010F\u0110\x03" + + "\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112" + + "\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02\x02\u0113\u0114\x03\x02\x02" + + "\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103\x03\x02\x02\x02\u0115\u010B" + + "\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02" + + "\u0118\u0119\x05 \x11\x02\u0119\u011A\x07\x18\x02\x02\u011A\u011B\x05" + + "D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D\x07\x1B\x02\x02\u011D\u0120" + + "\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120" + + "\u011E\x03\x02\x02\x02\u0120\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02" + + "\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123" + + "\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10" + + "\x02\u0126\u0127\x07?\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07" + + ">\x02\x02\u0129\u0131\x05.\x18\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C" + + "\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u012E\x05.\x18\x02\u012E" + + "\u0130\x03\x02\x02\x02\u012F\u012A\x03\x02\x02\x02\u0130\u0133\x03\x02" + + "\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132" + + "\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0134\u0135\x07@\x02" + + "\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139\x075\x02\x02\u0137\u0138" + + "\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139\u0137\x03\x02\x02\x02" + + "\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02\x02\x02\u013B\u013C\x07" + + "\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D\u013E\x07?\x02\x02\u013E" + + "\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02\u0140\u0148\x05.\x18\x02" + + "\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02" + + "\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03\x02\x02\x02\u0146\u0141" + + "\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148\u0146\x03\x02\x02\x02" + + "\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02\x02\x02\u014A\u0148\x03" + + "\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D\x07\x1A\x02\x02\u014D" + + "\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02\u014F\u0151\x05$\x13" + + "\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02\u0151\u0153" + + "\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152\u013B\x03\x02\x02\x02" + + "\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02\u0155\x1F\x03\x02\x02" + + "\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02\u0158\u0159\x05R*\x02" + + "\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02\u015B%\x03\x02\x02\x02" + + "\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02\x02\u015E\u0163\x05&\x14" + + "\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05&\x14\x02\u0161\u015F\x03" + + "\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163\u0161\x03\x02\x02\x02\u0163" + + "\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02\x02\x02\u0165\u0163\x03\x02" + + "\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167" + + "\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02\x02\u0169\u0168\x03\x02\x02" + + "\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C" + + "\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02\u016D\u01A5\x05&\x14\x0F\u016E" + + "\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02\x02\u0170\u0171\x05&\x14\x02" + + "\u0171\u0172\x07\x0E\x02\x02\u0172\u01A5\x03\x02\x02\x02\u0173\u0174\x07" + + "B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177" + + "\x07\x0E\x02\x02\u0177\u01A5\x03\x02\x02\x02\u0178\u0179\x07?\x02\x02" + + "\u0179\u01A5\x07@\x02\x02\u017A\u017B\x07?\x02\x02\u017B\u017C\x05&\x14" + + "\x02\u017C\u017D\x07\n\x02\x02\u017D\u0182\x05&\x14\x02\u017E\u017F\x07" + + "\n\x02\x02\u017F\u0181\x05&\x14\x02\u0180\u017E\x03\x02\x02\x02\u0181" + + "\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0182\u0183\x03\x02" + + "\x02\x02\u0183\u0186\x03\x02\x02\x02\u0184\u0182\x03\x02\x02\x02\u0185" + + "\u0187\x07\n\x02\x02\u0186\u0185\x03\x02\x02\x02\u0186\u0187\x03\x02\x02" + + "\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0189\x07@\x02\x02\u0189\u01A5" + + "\x03\x02\x02\x02\u018A\u018C\x07\x04\x02\x02\u018B\u018D\x05*\x16\x02" + + "\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u018E\x03" + + "\x02\x02\x02\u018E\u01A5\x07\x05\x02\x02\u018F\u01A5\x07\x1E\x02\x02\u0190" + + "\u01A5\x07\x1F\x02\x02\u0191\u01A5\x07 \x02\x02\u0192\u01A5\x05(\x15\x02" + + "\u0193\u01A5\x05R*\x02\u0194\u0195\x07?\x02\x02\u0195\u0196\x05&\x14\x02" + + "\u0196\u0197\x07@\x02\x02\u0197\u01A5\x03\x02\x02\x02\u0198\u0199\x05" + + "R*\x02\u0199\u019A\x07\r\x02\x02\u019A\u019F\x05&\x14\x02\u019B\u019C" + + "\x07\n\x02\x02\u019C\u019E\x05&\x14\x02\u019D\u019B\x03\x02\x02\x02\u019E" + + "\u01A1\x03\x02\x02\x02\u019F\u019D\x03\x02\x02\x02\u019F\u01A0\x03\x02" + + "\x02\x02\u01A0\u01A2\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A2" + + "\u01A3\x07\x0E\x02\x02\u01A3\u01A5\x03\x02\x02\x02\u01A4\u015C\x03\x02" + + "\x02\x02\u01A4\u016E\x03\x02\x02\x02\u01A4\u0173\x03\x02\x02\x02\u01A4" + + "\u0178\x03\x02\x02\x02\u01A4\u017A\x03\x02\x02\x02\u01A4\u018A\x03\x02" + + "\x02\x02\u01A4\u018F\x03\x02\x02\x02\u01A4\u0190\x03\x02\x02\x02\u01A4" + + "\u0191\x03\x02\x02\x02\u01A4\u0192\x03\x02\x02\x02\u01A4\u0193\x03\x02" + + "\x02\x02\u01A4\u0194\x03\x02\x02\x02\u01A4\u0198\x03\x02\x02\x02\u01A5" + + "\u01AE\x03\x02\x02\x02\u01A6\u01A7\f\x11\x02\x02\u01A7\u01A8\x07\x1C\x02" + + "\x02\u01A8\u01AD\x05&\x14\x11\u01A9\u01AA\f\x10\x02\x02\u01AA\u01AB\x07" + + "\x1D\x02\x02\u01AB\u01AD\x05&\x14\x10\u01AC\u01A6\x03\x02\x02\x02\u01AC" + + "\u01A9\x03\x02\x02\x02\u01AD\u01B0\x03\x02\x02\x02\u01AE\u01AC\x03\x02" + + "\x02\x02\u01AE\u01AF\x03\x02\x02\x02\u01AF\'\x03\x02\x02\x02\u01B0\u01AE" + + "\x03\x02\x02\x02\u01B1\u01B2\x07C\x02\x02\u01B2)\x03\x02\x02\x02\u01B3" + + "\u01B4\x05,\x17\x02\u01B4\u01B5\x07\x07\x02\x02\u01B5\u01B6\x05&\x14\x02" + + "\u01B6\u01BE\x03\x02\x02\x02\u01B7\u01B8\x07\n\x02\x02\u01B8\u01B9\x05" + + ",\x17\x02\u01B9\u01BA\x07\x07\x02\x02\u01BA\u01BB\x05&\x14\x02\u01BB\u01BD" + + "\x03\x02\x02\x02\u01BC\u01B7\x03\x02\x02\x02\u01BD\u01C0\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C4\x03" + + "\x02\x02\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C5\x07\n\x02\x02\u01C2" + + "\u01C3\x07\x0F\x02\x02\u01C3\u01C5\x05V,\x02\u01C4\u01C1\x03\x02\x02\x02" + + "\u01C4\u01C2\x03\x02\x02\x02\u01C4\u01C5\x03\x02\x02\x02\u01C5\u01C9\x03" + + "\x02\x02\x02\u01C6\u01C7\x07\x0F\x02\x02\u01C7\u01C9\x05V,\x02\u01C8\u01B3" + + "\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C9+\x03\x02\x02\x02\u01CA" + + "\u01CB\x05T+\x02\u01CB-\x03\x02\x02\x02\u01CC\u01CD\b\x18\x01\x02\u01CD" + + "\u0265\x058\x1D\x02\u01CE\u01CF\x05J&\x02\u01CF\u01D1\x07?\x02\x02\u01D0" + + "\u01D2\x05F$\x02\u01D1\u01D0\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02" + + "\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\x07@\x02\x02\u01D4\u0265\x03" + + "\x02\x02\x02\u01D5\u01D6\x074\x02\x02\u01D6\u0265\x05.\x18\x1C\u01D7\u01D8" + + "\x05R*\x02\u01D8\u01D9\x07\"\x02\x02\u01D9\u01DA\x07>\x02\x02\u01DA\u01DB" + + "\x05.\x18\x18\u01DB\u0265\x03\x02\x02\x02\u01DC\u01DD\x07-\x02\x02\u01DD" + + "\u01DE\x07\x04\x02\x02\u01DE\u01E3\x05.\x18\x02\u01DF\u01E0\x07\n\x02" + + "\x02\u01E0\u01E2\x05.\x18\x02\u01E1\u01DF\x03\x02\x02\x02\u01E2\u01E5" + + "\x03\x02\x02\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02" + + "\u01E4\u01E7\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E6\u01E8\x07" + + "\n\x02\x02\u01E7\u01E6\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8" + + "\u01E9\x03\x02\x02\x02\u01E9\u01EA\x07\x05\x02\x02\u01EA\u0265\x03\x02" + + "\x02\x02\u01EB\u01EC\x07.\x02\x02\u01EC\u01ED"; private static readonly _serializedATNSegment1: string = - "\u01EE\u01EC\x03\x02\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03" + - "\x02\x02\x02\u01F0\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2" + - "\u01F0\x03\x02\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02" + - "\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7" + - "\x07\x05\x02\x02\u01F7\u0263\x03\x02\x02\x02\u01F8\u0263\x050\x19\x02" + - "\u01F9\u01FA\x07#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05" + - ".\x18\x02\u01FC\u01FD\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC" + - "\x03\x02\x02\x02\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02" + - "\u0200\u0201\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03" + - "\x02\x02\x02\u0203\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204" + - "\u0205\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05" + - "\x02\x02\u0207\u0263\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A" + - "\x07\x04\x02\x02\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C" + - "\u020E\x05.\x18\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02" + - "\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213" + - "\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02" + - "\u0213\u0212\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03" + - "\x02\x02\x02\u0215\u0216\x07\x05\x02\x02\u0216\u0263\x03\x02\x02\x02\u0217" + - "\u021C\x05R*\x02\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A" + - "\u021C\x07*\x02\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02" + - "\x02\u021B\u0219\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0263" + - "\x03\x02\x02\x02\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F" + - "\u0220\x07\n\x02\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02" + - "\u0222\u0224\x05.\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03" + - "\x02\x02\x02\u0225\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226" + - "\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02" + - "\x02\u0229\u0228\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B" + - "\x03\x02\x02\x02\u022B\u022C\x07@\x02\x02\u022C\u0263\x03\x02\x02\x02" + - "\u022D\u022E\x07?\x02\x02\u022E\u0263\x07@\x02\x02\u022F\u0230\x07\x04" + - "\x02\x02\u0230\u0235\x05H%\x02\u0231\u0232\x07\n\x02\x02\u0232\u0234\x05" + - "H%\x02\u0233\u0231\x03\x02\x02\x02\u0234\u0237\x03\x02\x02\x02\u0235\u0233" + - "\x03\x02\x02\x02\u0235\u0236\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02" + - "\u0237\u0235\x03\x02\x02\x02\u0238\u023A\x07\n\x02\x02\u0239\u0238\x03" + - "\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x03\x02\x02\x02\u023B" + - "\u023C\x07\x05\x02\x02\u023C\u0263\x03\x02\x02\x02\u023D\u0246\x07\r\x02" + - "\x02\u023E\u0243\x05.\x18\x02\u023F\u0240\x07\n\x02\x02\u0240\u0242\x05" + - ".\x18\x02\u0241\u023F\x03\x02\x02\x02\u0242\u0245\x03\x02\x02\x02\u0243" + - "\u0241\x03\x02\x02\x02\u0243\u0244\x03\x02\x02\x02\u0244\u0247\x03\x02" + - "\x02\x02\u0245\u0243\x03\x02\x02\x02\u0246\u023E\x03\x02\x02\x02\u0246" + - "\u0247\x03\x02\x02\x02\u0247\u0249\x03\x02\x02\x02\u0248\u024A\x07\n\x02" + - "\x02\u0249\u0248\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B" + - "\x03\x02\x02\x02\u024B\u0263\x07\x0E\x02\x02\u024C\u024D\x07%\x02\x02" + - "\u024D\u024E\x07?\x02\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07@\x02" + - "\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07&\x02\x02\u0252\u0253\x05" + - ".\x18\x07\u0253\u0263\x03\x02\x02\x02\u0254\u0255\x05\n\x06\x02\u0255" + - "\u0256\x05.\x18\x06\u0256\u0263\x03\x02\x02\x02\u0257\u0258\x05\x14\v" + - "\x02\u0258\u0259\x05.\x18\x05\u0259\u0263\x03\x02\x02\x02\u025A\u025B" + - "\x07?\x02\x02\u025B\u025C\x05.\x18\x02\u025C\u025D\x07@\x02\x02\u025D" + - "\u0263\x03\x02\x02\x02\u025E\u025F\x07\x04\x02\x02\u025F\u0260\x05.\x18" + - "\x02\u0260\u0261\x07\x05\x02\x02\u0261\u0263\x03\x02\x02\x02\u0262\u01CA" + - "\x03\x02\x02\x02\u0262\u01CC\x03\x02\x02\x02\u0262\u01D3\x03\x02\x02\x02" + - "\u0262\u01D5\x03\x02\x02\x02\u0262\u01DA\x03\x02\x02\x02\u0262\u01E9\x03" + - "\x02\x02\x02\u0262\u01F8\x03\x02\x02\x02\u0262\u01F9\x03\x02\x02\x02\u0262" + - "\u0208\x03\x02\x02\x02\u0262\u021B\x03\x02\x02\x02\u0262\u021D\x03\x02" + - "\x02\x02\u0262\u022D\x03\x02\x02\x02\u0262\u022F\x03\x02\x02\x02\u0262" + - "\u023D\x03\x02\x02\x02\u0262\u024C\x03\x02\x02\x02\u0262\u0254\x03\x02" + - "\x02\x02\u0262\u0257\x03\x02\x02\x02\u0262\u025A\x03\x02\x02\x02\u0262" + - "\u025E\x03\x02\x02\x02\u0263\u0295\x03\x02\x02\x02\u0264\u0265\f\x1D\x02" + - "\x02\u0265\u0266\x07!\x02\x02\u0266\u0294\x05.\x18\x1D\u0267\u0268\f\x1B" + - "\x02\x02\u0268\u0269\t\x02\x02\x02\u0269\u0294\x05.\x18\x1C\u026A\u026B" + - "\f\x1A\x02\x02\u026B\u026C\t\x03\x02\x02\u026C\u0294\x05.\x18\x1B\u026D" + - "\u026E\f\x19\x02\x02\u026E\u026F\t\x04\x02\x02\u026F\u0294\x05.\x18\x1A" + - "\u0270\u0271\f\x17\x02\x02\u0271\u0272\x07>\x02\x02\u0272\u0273\x05.\x18" + - "\x18\u0273\u0274\b\x18\x01\x02\u0274\u0294\x03\x02\x02\x02\u0275\u0276" + - "\f\x15\x02\x02\u0276\u0277\x07-\x02\x02\u0277\u0294\x05.\x18\x16\u0278" + - "\u0279\f\x13\x02\x02\u0279\u027A\x07.\x02\x02\u027A\u0294\x05.\x18\x14" + - "\u027B\u027C\f\x12\x02\x02\u027C\u027D\x07/\x02\x02\u027D\u0294\x05.\x18" + - "\x13\u027E\u027F\f\x11\x02\x02\u027F\u0280\x070\x02\x02\u0280\u0294\x05" + - ".\x18\x12\u0281\u0282\f\n\x02\x02\u0282\u0283\x07\x1C\x02\x02\u0283\u0294" + - "\x05.\x18\v\u0284\u0285\f!\x02\x02\u0285\u0286\x07\x18\x02\x02\u0286\u028C" + - "\x05L\'\x02\u0287\u0289\x07?\x02\x02\u0288\u028A\x05F$\x02\u0289\u0288" + - "\x03\x02\x02\x02\u0289\u028A\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02" + - "\u028B\u028D\x07@\x02\x02\u028C\u0287\x03\x02\x02\x02\u028C\u028D\x03" + - "\x02\x02\x02\u028D\u0294\x03\x02\x02\x02\u028E\u028F\f\x1E\x02\x02\u028F" + - "\u0290\x07\r\x02\x02\u0290\u0291\x05.\x18\x02\u0291\u0292\x07\x0E\x02" + - "\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0264\x03\x02\x02\x02\u0293\u0267" + - "\x03\x02\x02\x02\u0293\u026A\x03\x02\x02\x02\u0293\u026D\x03\x02\x02\x02" + - "\u0293\u0270\x03\x02\x02\x02\u0293\u0275\x03\x02\x02\x02\u0293\u0278\x03" + - "\x02\x02\x02\u0293\u027B\x03\x02\x02\x02\u0293\u027E\x03\x02\x02\x02\u0293" + - "\u0281\x03\x02\x02\x02\u0293\u0284\x03\x02\x02\x02\u0293\u028E\x03\x02" + - "\x02\x02\u0294\u0297\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295" + - "\u0296\x03\x02\x02\x02\u0296/\x03\x02\x02\x02\u0297\u0295\x03\x02\x02" + - "\x02\u0298\u0299\x072\x02\x02\u0299\u029A\x05.\x18\x02\u029A\u029C\x07" + - "\x04\x02\x02\u029B\u029D\x07\x0F\x02\x02\u029C\u029B\x03\x02\x02\x02\u029C" + - "\u029D\x03\x02\x02\x02\u029D\u029E\x03\x02\x02\x02\u029E\u02A3\x052\x1A" + - "\x02\u029F\u02A0\x07\x0F\x02\x02\u02A0\u02A2\x052\x1A\x02\u02A1\u029F" + - "\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02" + - "\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02A6\x03\x02\x02\x02\u02A5\u02A3\x03" + - "\x02\x02\x02\u02A6\u02A7\x07\x05\x02\x02\u02A71\x03\x02\x02\x02\u02A8" + - "\u02AB\x054\x1B\x02\u02A9\u02AB\x07\'\x02\x02\u02AA\u02A8\x03\x02\x02" + - "\x02\u02AA\u02A9\x03\x02\x02\x02\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AD" + - "\x07\x1D\x02\x02\u02AD\u02AE\x05.\x18\x02\u02AE3\x03\x02\x02\x02\u02AF" + - "\u02B6\x05T+\x02\u02B0\u02B3\x07?\x02\x02\u02B1\u02B4\x05T+\x02\u02B2" + - "\u02B4\x07\'\x02\x02\u02B3\u02B1\x03\x02\x02\x02\u02B3\u02B2\x03\x02\x02" + - "\x02\u02B4\u02B5\x03\x02\x02\x02\u02B5\u02B7\x07@\x02\x02\u02B6\u02B0" + - "\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B75\x03\x02\x02\x02\u02B8" + - "\u02B9\x05\b\x05\x02\u02B9\u02BA\x07\x02\x02\x03\u02BA\u02C2\x03\x02\x02" + - "\x02\u02BB\u02BC\x05.\x18\x02\u02BC\u02BD\x07\x02\x02\x03\u02BD\u02C2" + - "\x03\x02\x02\x02\u02BE\u02BF\x07E\x02\x02\u02BF\u02C2\x07\x02\x02\x03" + - "\u02C0\u02C2\x07\x02\x02\x03\u02C1\u02B8\x03\x02\x02\x02\u02C1\u02BB\x03" + - "\x02\x02\x02\u02C1\u02BE\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2" + - "7\x03\x02\x02\x02\u02C3\u02C6\x05:\x1E\x02\u02C4\u02C6\x05<\x1F\x02\u02C5" + - "\u02C3\x03\x02\x02\x02\u02C5\u02C4\x03\x02\x02\x02\u02C69\x03\x02\x02" + - "\x02\u02C7\u02C8\x05@!\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05" + - ".\x18\x02\u02CA\u02D9\x03\x02\x02\x02\u02CB\u02CC\x07?\x02\x02\u02CC\u02D1" + - "\x05@!\x02\u02CD\u02CE\x07\n\x02\x02\u02CE\u02D0\x05@!\x02\u02CF\u02CD" + - "\x03\x02\x02\x02\u02D0\u02D3\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02" + - "\u02D1\u02D2\x03\x02\x02\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3\u02D1\x03" + - "\x02\x02\x02\u02D4\u02D5\x07@\x02\x02\u02D5\u02D6\x07\x1D\x02\x02\u02D6" + - "\u02D7\x05.\x18\x02\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02" + - "\x02\u02D8\u02CB\x03\x02\x02\x02\u02D9;\x03\x02\x02\x02\u02DA\u02DB\x07" + - "?\x02\x02\u02DB\u02DC\x07?\x02\x02\u02DC\u02DF\x05@!\x02\u02DD\u02DE\x07" + - "\n\x02\x02\u02DE\u02E0\x05@!\x02\u02DF\u02DD\x03\x02\x02\x02\u02E0\u02E1" + - "\x03\x02\x02\x02\u02E1\u02DF\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + - "\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07" + - "@\x02\x02\u02E5\u02E6\x07\x1D\x02\x02\u02E6\u02E7\x05.\x18\x02\u02E7=" + - "\x03\x02\x02\x02\u02E8\u02EB\x07\'\x02\x02\u02E9\u02EB\x05R*\x02\u02EA" + - "\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03\x02\x02\x02\u02EB?\x03\x02\x02" + - "\x02\u02EC\u02ED\x05> \x02\u02EDA\x03\x02\x02\x02\u02EE\u02EF\x05> \x02" + - "\u02EF\u02F0\x07\x07\x02\x02\u02F0\u02F1\x05&\x14\x02\u02F1C\x03\x02\x02" + - "\x02\u02F2\u02F5\x075\x02\x02\u02F3\u02F5\x05R*\x02\u02F4\u02F2\x03\x02" + - "\x02\x02\u02F4\u02F3\x03\x02\x02\x02\u02F5E\x03\x02\x02\x02\u02F6\u02FB" + - "\x05.\x18\x02\u02F7\u02F8\x07\n\x02\x02\u02F8\u02FA\x05.\x18\x02\u02F9" + - "\u02F7\x03\x02\x02\x02\u02FA\u02FD\x03\x02\x02\x02\u02FB\u02F9\x03\x02" + - "\x02\x02\u02FB\u02FC\x03\x02\x02\x02\u02FCG\x03\x02\x02\x02\u02FD\u02FB" + - "\x03\x02\x02\x02\u02FE\u02FF\x05T+\x02\u02FF\u0300\x07\x07\x02\x02\u0300" + - "\u0301\x05.\x18\x02\u0301\u0305\x03\x02\x02\x02\u0302\u0303\x07(\x02\x02" + - "\u0303\u0305\x05.\x18\x02\u0304\u02FE\x03\x02\x02\x02\u0304\u0302\x03" + - "\x02\x02\x02\u0305I\x03\x02\x02\x02\u0306\u0309\x05R*\x02\u0307\u0309" + - "\t\x05\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0307\x03\x02\x02\x02" + - "\u0309K\x03\x02\x02\x02\u030A\u030D\x05R*\x02\u030B\u030D\t\x06\x02\x02" + - "\u030C\u030A\x03\x02\x02\x02\u030C\u030B\x03\x02\x02\x02\u030DM\x03\x02" + - "\x02\x02\u030E\u030F\t\x07\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0311" + - "\t\b\x02\x02\u0311Q\x03\x02\x02\x02\u0312\u0317\x05V,\x02\u0313\u0314" + - "\x07)\x02\x02\u0314\u0316\x05V,\x02\u0315\u0313\x03\x02\x02\x02\u0316" + - "\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317\u0318\x03\x02" + - "\x02\x02\u0318S\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u031A\u031F" + - "\x05V,\x02\u031B\u031C\x05R*\x02\u031C\u031D\b+\x01\x02\u031D\u031F\x03" + - "\x02\x02\x02\u031E\u031A\x03\x02\x02\x02\u031E\u031B\x03\x02\x02\x02\u031F" + - "U\x03\x02\x02\x02\u0320\u0321\t\t\x02\x02\u0321W\x03\x02\x02\x02Z[bks" + - "\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1" + - "\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150" + - "\u0152\u0163\u0166\u0169\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC" + - "\u01C2\u01C6\u01CF\u01E1\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B" + - "\u0225\u0229\u0235\u0239\u0243\u0246\u0249\u0262\u0289\u028C\u0293\u0295" + - "\u029C\u02A3\u02AA\u02B3\u02B6\u02C1\u02C5\u02D1\u02D8\u02E1\u02EA\u02F4" + - "\u02FB\u0304\u0308\u030C\u0317\u031E"; + "\x07\x04\x02\x02\u01ED\u01F2\x05.\x18\x02\u01EE\u01EF\x07\n\x02\x02\u01EF" + + "\u01F1\x05.\x18\x02\u01F0\u01EE\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02" + + "\x02\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F6" + + "\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5\u01F7\x07\n\x02\x02" + + "\u01F6\u01F5\x03\x02\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01F8\x03" + + "\x02\x02\x02\u01F8\u01F9\x07\x05\x02\x02\u01F9\u0265\x03\x02\x02\x02\u01FA" + + "\u0265\x050\x19\x02\u01FB\u01FC\x07#\x02\x02\u01FC\u01FD\x07\x04\x02\x02" + + "\u01FD\u0202\x05.\x18\x02\u01FE\u01FF\x07\n\x02\x02\u01FF\u0201\x05.\x18" + + "\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200" + + "\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203\u0206\x03\x02\x02\x02" + + "\u0204\u0202\x03\x02\x02\x02\u0205\u0207\x07\n\x02\x02\u0206\u0205\x03" + + "\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207\u0208\x03\x02\x02\x02\u0208" + + "\u0209\x07\x05\x02\x02\u0209\u0265\x03\x02\x02\x02\u020A\u020B\x07$\x02" + + "\x02\u020B\u020C\x07\x04\x02\x02\u020C\u0211\x05.\x18\x02\u020D\u020E" + + "\x07\n\x02\x02\u020E\u0210\x05.\x18\x02\u020F\u020D\x03\x02\x02\x02\u0210" + + "\u0213\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0211\u0212\x03\x02" + + "\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0214" + + "\u0216\x07\n\x02\x02\u0215\u0214\x03\x02\x02\x02\u0215\u0216\x03\x02\x02" + + "\x02\u0216\u0217\x03\x02\x02\x02\u0217\u0218\x07\x05\x02\x02\u0218\u0265" + + "\x03\x02\x02\x02\u0219\u021E\x05R*\x02\u021A\u021E\x07,\x02\x02\u021B" + + "\u021E\x07+\x02\x02\u021C\u021E\x07*\x02\x02\u021D\u0219\x03\x02\x02\x02" + + "\u021D\u021A\x03\x02\x02\x02\u021D\u021B\x03\x02\x02\x02\u021D\u021C\x03" + + "\x02\x02\x02\u021E\u0265\x03\x02\x02\x02\u021F\u0220\x07?\x02\x02\u0220" + + "\u0221\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0227\x05.\x18\x02" + + "\u0223\u0224\x07\n\x02\x02\u0224\u0226\x05.\x18\x02\u0225\u0223\x03\x02" + + "\x02\x02\u0226\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0227" + + "\u0228\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227\x03\x02" + + "\x02\x02\u022A\u022C\x07\n\x02\x02\u022B\u022A\x03\x02\x02\x02\u022B\u022C" + + "\x03\x02\x02\x02\u022C\u022D\x03\x02\x02\x02\u022D\u022E\x07@\x02\x02" + + "\u022E\u0265\x03\x02\x02\x02\u022F\u0230\x07?\x02\x02\u0230\u0265\x07" + + "@\x02\x02\u0231\u0232\x07\x04\x02\x02\u0232\u0237\x05H%\x02\u0233\u0234" + + "\x07\n\x02\x02\u0234\u0236\x05H%\x02\u0235\u0233\x03\x02\x02\x02\u0236" + + "\u0239\x03\x02\x02\x02\u0237\u0235\x03\x02\x02\x02\u0237\u0238\x03\x02" + + "\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u023A" + + "\u023C\x07\n\x02\x02\u023B\u023A\x03\x02\x02\x02\u023B\u023C\x03\x02\x02" + + "\x02\u023C\u023D\x03\x02\x02\x02\u023D\u023E\x07\x05\x02\x02\u023E\u0265" + + "\x03\x02\x02\x02\u023F\u0248\x07\r\x02\x02\u0240\u0245\x05.\x18\x02\u0241" + + "\u0242\x07\n\x02\x02\u0242\u0244\x05.\x18\x02\u0243\u0241\x03\x02\x02" + + "\x02\u0244\u0247\x03\x02\x02\x02\u0245\u0243\x03\x02\x02\x02\u0245\u0246" + + "\x03\x02\x02\x02\u0246\u0249\x03\x02\x02\x02\u0247\u0245\x03\x02\x02\x02" + + "\u0248\u0240\x03\x02\x02\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024B\x03" + + "\x02\x02\x02\u024A\u024C\x07\n\x02\x02\u024B\u024A\x03\x02\x02\x02\u024B" + + "\u024C\x03\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u0265\x07\x0E" + + "\x02\x02\u024E\u024F\x07%\x02\x02\u024F\u0250\x07?\x02\x02\u0250\u0251" + + "\x05.\x18\x02\u0251\u0252\x07@\x02\x02\u0252\u0253\x05.\x18\x02\u0253" + + "\u0254\x07&\x02\x02\u0254\u0255\x05.\x18\x07\u0255\u0265\x03\x02\x02\x02" + + "\u0256\u0257\x05\n\x06\x02\u0257\u0258\x05.\x18\x06\u0258\u0265\x03\x02" + + "\x02\x02\u0259\u025A\x05\x14\v\x02\u025A\u025B\x05.\x18\x05\u025B\u0265" + + "\x03\x02\x02\x02\u025C\u025D\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E" + + "\u025F\x07@\x02\x02\u025F\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02" + + "\x02\u0261\u0262\x05.\x18\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265" + + "\x03\x02\x02\x02\u0264\u01CC\x03\x02\x02\x02\u0264\u01CE\x03\x02\x02\x02" + + "\u0264\u01D5\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02\u0264\u01DC\x03" + + "\x02\x02\x02\u0264\u01EB\x03\x02\x02\x02\u0264\u01FA\x03\x02\x02\x02\u0264" + + "\u01FB\x03\x02\x02\x02\u0264\u020A\x03\x02\x02\x02\u0264\u021D\x03\x02" + + "\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u022F\x03\x02\x02\x02\u0264" + + "\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264\u024E\x03\x02" + + "\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02\x02\x02\u0264" + + "\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265\u0297\x03\x02" + + "\x02\x02\u0266\u0267\f\x1D\x02\x02\u0267\u0268\x07!\x02\x02\u0268\u0296" + + "\x05.\x18\x1D\u0269\u026A\f\x1B\x02\x02\u026A\u026B\t\x02\x02\x02\u026B" + + "\u0296\x05.\x18\x1C\u026C\u026D\f\x1A\x02\x02\u026D\u026E\t\x03\x02\x02" + + "\u026E\u0296\x05.\x18\x1B\u026F\u0270\f\x19\x02\x02\u0270\u0271\t\x04" + + "\x02\x02\u0271\u0296\x05.\x18\x1A\u0272\u0273\f\x17\x02\x02\u0273\u0274" + + "\x07>\x02\x02\u0274\u0275\x05.\x18\x18\u0275\u0276\b\x18\x01\x02\u0276" + + "\u0296\x03\x02\x02\x02\u0277\u0278\f\x15\x02\x02\u0278\u0279\x07-\x02" + + "\x02\u0279\u0296\x05.\x18\x16\u027A\u027B\f\x13\x02\x02\u027B\u027C\x07" + + ".\x02\x02\u027C\u0296\x05.\x18\x14\u027D\u027E\f\x12\x02\x02\u027E\u027F" + + "\x07/\x02\x02\u027F\u0296\x05.\x18\x13\u0280\u0281\f\x11\x02\x02\u0281" + + "\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x12\u0283\u0284\f\n\x02\x02\u0284" + + "\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286\u0287\f!\x02\x02\u0287" + + "\u0288\x07\x18\x02\x02\u0288\u028E\x05L\'\x02\u0289\u028B\x07?\x02\x02" + + "\u028A\u028C\x05F$\x02\u028B\u028A\x03\x02\x02\x02\u028B\u028C\x03\x02" + + "\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07@\x02\x02\u028E\u0289" + + "\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F\u0296\x03\x02\x02\x02" + + "\u0290\u0291\f\x1E\x02\x02\u0291\u0292\x07\r\x02\x02\u0292\u0293\x05." + + "\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296\x03\x02\x02\x02\u0295" + + "\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02\u0295\u026C\x03\x02" + + "\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03\x02\x02\x02\u0295" + + "\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295\u027D\x03\x02" + + "\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02\x02\x02\u0295" + + "\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296\u0299\x03\x02" + + "\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298" + + "/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B\x072\x02\x02" + + "\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D\u029F\x07" + + "\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F" + + "\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2\x07\x0F\x02" + + "\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4\u02A7" + + "\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02" + + "\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\x07" + + "\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02\u02AB\u02AD" + + "\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03\x02\x02\x02" + + "\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF\u02B0\x05" + + ".\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05T+\x02\u02B2\u02B5\x07" + + "?\x02\x02\u02B3\u02B6\x05T+\x02\u02B4\u02B6\x07\'\x02\x02\u02B5\u02B3" + + "\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02" + + "\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9\x03" + + "\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB\u02BC" + + "\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18\x02" + + "\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1\x07" + + "E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03\u02C3" + + "\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03\x02" + + "\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5\u02C8" + + "\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7" + + "\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!\x02\u02CA" + + "\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB\x03\x02\x02" + + "\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF\u02D0\x07\n" + + "\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2\u02D5" + + "\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02" + + "\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6\u02D7\x07" + + "@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02\u02D9\u02DB" + + "\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03\x02\x02\x02" + + "\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE\x07?\x02" + + "\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2\x05@" + + "!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E1" + + "\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02\x02\x02" + + "\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8\x07\x1D" + + "\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA\u02ED\x07" + + "\'\x02\x02\u02EB\u02ED\x05R*\x02\u02EC\u02EA\x03\x02\x02\x02\u02EC\u02EB" + + "\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> \x02\u02EFA\x03" + + "\x02\x02\x02\u02F0\u02F1\x05> \x02\u02F1\u02F2\x07\x07\x02\x02\u02F2\u02F3" + + "\x05&\x14\x02\u02F3C\x03\x02\x02\x02\u02F4\u02F7\x075\x02\x02\u02F5\u02F7" + + "\x05R*\x02\u02F6\u02F4\x03\x02\x02\x02\u02F6\u02F5\x03\x02\x02\x02\u02F7" + + "E\x03\x02\x02\x02\u02F8\u02FD\x05.\x18\x02\u02F9\u02FA\x07\n\x02\x02\u02FA" + + "\u02FC\x05.\x18\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FF\x03\x02\x02" + + "\x02\u02FD\u02FB\x03\x02\x02\x02\u02FD\u02FE\x03\x02\x02\x02\u02FEG\x03" + + "\x02\x02\x02\u02FF\u02FD\x03\x02\x02\x02\u0300\u0301\x05T+\x02\u0301\u0302" + + "\x07\x07\x02\x02\u0302\u0303\x05.\x18\x02\u0303\u0307\x03\x02\x02\x02" + + "\u0304\u0305\x07(\x02\x02\u0305\u0307\x05.\x18\x02\u0306\u0300\x03\x02" + + "\x02\x02\u0306\u0304\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B" + + "\x05R*\x02\u0309\u030B\t\x05\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A" + + "\u0309\x03\x02\x02\x02\u030BK\x03\x02\x02\x02\u030C\u030F\x05R*\x02\u030D" + + "\u030F\t\x06\x02\x02\u030E\u030C\x03\x02\x02\x02\u030E\u030D\x03\x02\x02" + + "\x02\u030FM\x03\x02\x02\x02\u0310\u0311\t\x07\x02\x02\u0311O\x03\x02\x02" + + "\x02\u0312\u0313\t\b\x02\x02\u0313Q\x03\x02\x02\x02\u0314\u0319\x05V," + + "\x02\u0315\u0316\x07)\x02\x02\u0316\u0318\x05V,\x02\u0317\u0315\x03\x02" + + "\x02\x02\u0318\u031B\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u0319" + + "\u031A\x03\x02\x02\x02\u031AS\x03\x02\x02\x02\u031B\u0319\x03\x02\x02" + + "\x02\u031C\u0321\x05V,\x02\u031D\u031E\x05R*\x02\u031E\u031F\b+\x01\x02" + + "\u031F\u0321\x03\x02\x02\x02\u0320\u031C\x03\x02\x02\x02\u0320\u031D\x03" + + "\x02\x02\x02\u0321U\x03\x02\x02\x02\u0322\u0323\t\t\x02\x02\u0323W\x03" + + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + + "\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131" + + "\u0139\u0148\u0150\u0152\u0163\u0166\u0169\u0182\u0186\u018C\u019F\u01A4" + + "\u01AC\u01AE\u01BE\u01C4\u01C8\u01D1\u01E3\u01E7\u01F2\u01F6\u0202\u0206" + + "\u0211\u0215\u021D\u0227\u022B\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + + "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + + "\u02E3\u02EC\u02F6\u02FD\u0306\u030A\u030E\u0319\u0320"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -5327,6 +5340,34 @@ export class TypeListContext extends TypeContext { } } } +export class TypeUnitContext extends TypeContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeUnit) { + listener.enterTypeUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeUnit) { + listener.exitTypeUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeUnit) { + return visitor.visitTypeUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class TypeTupleContext extends TypeContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public type(): TypeContext[]; diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index cca740a52..cd053a7a2 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -13,6 +13,7 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; @@ -151,6 +152,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeList?: (ctx: TypeListContext) => Result; + /** + * Visit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeUnit?: (ctx: TypeUnitContext) => Result; + /** * Visit a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index ce9b07be2..1f6901487 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1123,6 +1123,17 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'fun', arg, res }) } + // The unit type + exitTypeUnit(ctx: p.TypeUnitContext) { + const id = this.getId(ctx) + + this.typeStack.push({ + id: id, + kind: 'tup', + fields: { kind: 'empty' }, + }) + } + // A tuple type, e.g., (int, bool) // the type stack contains the types of the elements exitTypeTuple(ctx: p.TypeTupleContext) { diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 951bdacda..38644197e 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index d374b67c1..5e565a6e4 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":6,"col":19,"index":145},{"line":6,"col":20,"index":146}],"30":[0,{"line":6,"col":23,"index":149},{"line":6,"col":25,"index":151}],"31":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"32":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"33":[0,{"line":6,"col":34,"index":160},{"line":6,"col":43,"index":169}],"34":[0,{"line":6,"col":30,"index":156},{"line":6,"col":44,"index":170}],"35":[0,{"line":6,"col":2,"index":128},{"line":6,"col":44,"index":170}],"36":[0,{"line":0,"col":0,"index":0},{"line":7,"col":172,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt index 423c76fe0..205d0e4b0 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.qnt +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -4,4 +4,5 @@ module m { type Result[ok, err] = | Ok(ok) | Err(err) + val test: Result[(), str] = Err("my error") } From 6e0e8fe010b02008eacc5e211d94e0b6b3b30d4a Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:54:19 -0300 Subject: [PATCH 327/428] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34d5305a..66f38e3ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fix a problem where empty tuples were not parsed as valid types, only as + values (#1421). + ### Security ## v0.19.1 -- 2024-04-01 From 1c5d42e5810de8946ba7b558a63f26b53812e2ab Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:56:12 -0300 Subject: [PATCH 328/428] Add explanatory comment --- quint/src/generated/Quint.g4 | 1 + 1 file changed, 1 insertion(+) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 3c2ecaeb7..7c79ae84d 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -119,6 +119,7 @@ type | SET '[' type ']' # typeSet // TODO: replace List with general type application | LIST '[' type ']' # typeList + // Parse tuples of size 0 or 2+, but not 1. (int) should be parsed as int. | '(' ')' # typeUnit | '(' type ',' type (',' type)* ','? ')' # typeTuple | '{' row? '}' # typeRec From b05c6b3c369e3c56d3a38783e91f8fb8cbe3a838 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:14:58 -0300 Subject: [PATCH 329/428] Add links to the Telegram group --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99ae97722..a20673bcd 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,11 @@ src="https://img.shields.io/npm/v/@informalsystems/quint" alt="npm (scoped)"> + + telegram group +

Installation • - Documentation • + DocumentationCommunity