diff --git a/.github/scripts/wakeup.sh b/.github/scripts/wakeup.sh new file mode 100755 index 00000000..e8302270 --- /dev/null +++ b/.github/scripts/wakeup.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +runner="i-0e04845bff4576909" + +while true; do + runner_status=$(aws ec2 describe-instances --instance-ids $runner --query "Reservations[*].Instances[*].State.[Name]" --output text) + if [ $runner_status = "stopped" ]; then + aws ec2 start-instances --instance-ids $runner + break + elif [ $runner_status = "running" ]; then + break + else + sleep 5 + fi +done + +exit 0 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 33a8b1b6..16e92c7f 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -6,16 +6,43 @@ on: pull_request: branches: ["*"] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: CARGO_TERM_COLOR: always jobs: - build: + wakeup: runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + + steps: + - uses: actions/checkout@v3 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::490752553772:role/summa-solvency-ec2-slc + role-duration-seconds: 900 + aws-region: us-west-2 + + - name: Wakeup runner + run: .github/scripts/wakeup.sh + + build: + runs-on: [summa-solvency-runner] + needs: [wakeup] steps: - uses: actions/checkout@v3 + - name: Set Environment + run: echo "PATH=/home/ubuntu/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> "$GITHUB_ENV" + - name: Install solc run: (hash svm 2>/dev/null || cargo install --version 0.2.23 svm-rs) && svm install 0.8.20 && solc --version @@ -24,23 +51,24 @@ jobs: cd zk_prover cargo test --release --features dev-graph -- --nocapture - - name: Test Nova Prover + - name: Test Zk Prover examples run: | cd zk_prover + cargo run --release --example gen_inclusion_verifier + cargo run --release --example gen_commitment + cargo run --release --example gen_inclusion_proof cargo run --release --example nova_incremental_verifier - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - name: Test backend - env: - SIGNATURE_VERIFICATION_MESSAGE: "Summa proof of solvency for CryptoExchange" run: | cd backend cargo test --release -- --nocapture - - name: Test example + - name: Test backend example run: | cd backend cargo run --release --example summa_solvency_flow - \ No newline at end of file + diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 67b7408b..a3cdd3ca 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -3766,6 +3766,7 @@ dependencies = [ "futures", "halo2_proofs", "num-bigint 0.4.3", + "num-traits", "reqwest", "serde", "serde_json", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index eec1ddec..6afe132b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -13,12 +13,13 @@ futures = "0.3.28" num-bigint = "0.4.3" serde = { version = "1.0.166", features = ["derive"] } snark-verifier-sdk = { git = "https://github.com/privacy-scaling-explorations/snark-verifier", version = "0.1.1" } -ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } reqwest = { version = "0.11", features = ["json"] } serde_json = "1.0.64" tokio = { version = "1.7.1", features = ["full"] } base64 = "0.13" bincode = "1.3.3" +num-traits = "0.2.14" [build-dependencies] -ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } diff --git a/backend/README.md b/backend/README.md index 3f04ef51..19b6aaa6 100644 --- a/backend/README.md +++ b/backend/README.md @@ -6,13 +6,14 @@ This directory contains the backend implementation for the Summa Proof of Solven ### Round -The `Round` component represents a specific period or cycle in the Summa Proof of Solvency protocol. It encapsulates the state of the system at a given time, including the snapshot of assets and liabilities, as well as the associated proofs. - The `Round` struct integrates with the `Snapshot` and `SummaSigner` to facilitate the generation and submission of proofs to the contract. +The `Round` component represents a specific period or cycle in the Summa Proof of Solvency protocol. It encapsulates the state of the system at a given time, including the snapshot of assets and liabilities, as well as the associated proofs. +The `Round` struct integrates with the `Snapshot` and `SummaSigner` to facilitate the generation and submission of proofs to the contract. Key Features: + - Initialization of a new round with specific parameters. - Building a snapshot of the current state. -- Dispatching solvency proofs to the contract. +- Submitting commitment to the contract. - Retrieving proofs of inclusion for specific users. ### AddressOwnership @@ -20,6 +21,7 @@ Key Features: The `AddressOwnership` component is responsible for managing and verifying the ownership of addresses. It ensures that addresses used in the protocol owned by the respective participants. This component interacts with the `SummaSigner` to submit proofs of address ownership to on-chain. Key Features: + - Initialization with specific signer details. - Dispatching proofs of address ownership to the contract. @@ -41,26 +43,26 @@ To build the binary executable and test it ``` cargo build -SIGNATURE_VERIFICATION_MESSAGE="Summa proof of solvency for CryptoExchange" cargo test --release -- --nocapture +cargo test --release -- --nocapture ``` ## Important Notices -### Generating and updating verifier contracts for Backend +### Generating and updating verifier contract for Backend + +The verifier contract in the backend were generated using a predefined set of parameters: `N_CURRENCIES = 2` and `N_BYTES=14`, as indicated [here](https://github.com/summa-dev/summa-solvency/blob/master/zk_prover/examples/gen_inclusion_verifier.rs#L21-L22). +If you intend to work with different parameters, you'll need to adjust these hard-coded values and then generate new verifier contract. -The verifier contracts in the backend were generated using a predefined set of parameters: `N_ASSETS = 2` and `N_BYTES=14`, as indicated [here](https://github.com/summa-dev/summa-solvency/blob/master/zk_prover/examples/gen_solvency_verifier.rs#L21-L22). -If you intend to work with different parameters, you'll need to adjust these hard-coded values and then generate new verifier contracts. - -The process described below assists in both generating the verifiers and updating the Summa contract, which integrates the new verifiers as constructors. +The process described below assists in both generating the verifier and updating the Summa contract, which integrates the new verifier as constructors. #### Using the Bash Script -We have provided a bash script to automate the process of updating the verifier contracts and the Summa contract. To use the script: +We have provided a bash script to automate the process of updating the verifier contract and the Summa contract. To use the script: Ensure you have the necessary permissions to execute the script. ``` -backend $ chmod +x scripts/update_verifier_contracts.sh +backend $ scripts/update_verifier_contract.sh ``` ## Summa solvency flow example @@ -91,26 +93,19 @@ If executed successfully, you'll see: 1. Ownership proofs are submitted successfully! ``` +### 2. Submit Commitment -### 2. Submit Proof of Solvency +The CEX must submit a commitment to the Summa contract for each round. This commitment consists of a `timestamp`, the root hash of the Merkle Sum Tree (`mst_root`), and `balances`. -This step is also crucial for two primary reasons: - - first, to validate the root hash of the Merkle Sum Tree (`mst_root`); and second, to ensure that the assets held by the CEX exceed their liabilities, as confirmed through the proof verification on the Summa contract. -The CEX must submit this proof of solvency to the Summa contract. +Without publishing the commitment, users cannot verify their inclusion proof on the Summa contract. This is because the inclusion verifier function internally requires the `mst_root`, but users only know the `timestamp` associated with the round and the verifier functions does not requre `mst_root` directly. - Currently, it's a mandatory requirement to provide this proof before generating the inclusion proof for each user in the current round. - -Without this verification, It seems the user may not trust to the inclusion proof for the round. becuase the `mst_root` is not published on contract. More specifically, it means that the `mst_root` is not correctly verified on the Summa contract. - -In here, we'll introduce you through the process of submitting a solvency proof using the `Round` to the Summa contract. +In here, we'll introduce you through the process of submitting a commitment using the `Round` to the Summa contract. The Round serves as the core of the backend in Summa, and we have briefly described it in the Components section. -To initialize the `Round` instance, you'll need paths to specific CSV files (`assets.csv` and `entry_16.csv`) and the `ptau/hermez-raw-11` file. Here's what each file does: +To initialize the `Round` instance, you'll need paths to the liabilities CSV file (`entry_16.csv`) and the `ptau/hermez-raw-11` file. The files serve the following purpose: -- `assets.csv`: Calculates the total balance of assets for the solvency proof. Only the CEX can generate this file. -- `entry_16.csv`: Used to build the Merkle sum tree, with each leaf element derived from sixteen entries in the CSV. -- `ptau/hermez-raw-11`: Contains parameters for constructing the zk circuits. +- `entry_16.csv`: contains the username and liabilities entries for each CEX user (necessary to build the commitment). Liabilities column names have the following format: `balance__`, where and are the names of the cryptocurrencies and their corresponding blockchains. values are the same as in the Address Ownership Proof step; +- `ptau/hermez-raw-11`: contains parameters for constructing the zk circuits. Using the `Round` instance, the solvency proof is dispatched to the Summa contract with the `dispatch_solvency_proof` method. @@ -138,27 +133,20 @@ This is the final step in the Summa process and the only part that occurs on the Users receive the proof for a specific round and use methods available on the deployed Summa contract. Importantly, the Summa contract verifier function is a view function, meaning it doesn't consume gas or change the blockchain's state. -In this step, you'll see: +In this step, the user has to: -- Retrieve the `mst_root` from the Summa contract and match it with the `root_hash` in the proof. -- Ensure the `leaf_hash` aligns with the hash based on the `username` and `balances` provided by the CEX. -- Use the `verify_inclusion_proof` method on the Summa contract to validate the proof. +- Ensure the `leaf_hash` (public input of the proof) aligns with the Poseidon hash of the `username` and `balances` provided by the CEX. +- Submit the proof to the `verify_inclusion_proof` method on the Summa contract Which will: + - Retrieve the `mstRoot` from the Summa contract and match it with the `root_hash` in the proof. + - Retrieve the `rootBalances` from the Summa contract and match it with the `root_balances` in the proof + - Verify the zk Proof The result will display as: + ``` 4. Verifying the proof on contract verifier for User #0: true ``` -### 4. Verify Proof of Inclusion - -This is the final step in the Summa process and the only part that occurs on the user side. Users receive the proof for a specific round and use methods available on the deployed Summa contract. Importantly, the Summa contract verifier function is a view function, meaning it doesn't consume gas or change the blockchain's state. - -In this step, you'll see: -- Retrieve the `mst_root` from the Summa contract and match it with the `root_hash` in the proof. -- Ensure the `leaf_hash` aligns with the hash based on the `username` and `balances` provided by the CEX. -- Use the `verify_inclusion_proof` method on the Summa contract to validate the proof. -The result will display as: - **Note:** In a production environment, users can independently verify their proof using public interfaces, such as Etherscan, as shown below: ![Summa contract interface on Etherscan](summa_verifier_interface.png) This offers an added layer of transparency and trust. diff --git a/backend/build.rs b/backend/build.rs index 6d3cc39d..0cc6e4a4 100644 --- a/backend/build.rs +++ b/backend/build.rs @@ -8,11 +8,6 @@ fn main() { "Summa", "Summa", ), - ( - "src/contracts/generated/solvency_verifier.rs", - "SolvencyVerifier", - "SolvencyVerifier", - ), ( "src/contracts/generated/inclusion_verifier.rs", "InclusionVerifier", diff --git a/backend/examples/summa_solvency_flow.rs b/backend/examples/summa_solvency_flow.rs index be26bb2b..6093f41d 100644 --- a/backend/examples/summa_solvency_flow.rs +++ b/backend/examples/summa_solvency_flow.rs @@ -7,14 +7,15 @@ use serde_json::{from_reader, to_string_pretty}; use summa_backend::{ apis::{ address_ownership::AddressOwnership, + leaf_hash_from_inputs, round::{MstInclusionProof, Round}, }, contracts::signer::{AddressInput, SummaSigner}, tests::initialize_test_env, }; -use summa_solvency::merkle_sum_tree::utils::generate_leaf_hash; +use summa_solvency::merkle_sum_tree::MerkleSumTree; -const N_ASSETS: usize = 2; +const N_CURRENCIES: usize = 2; const USER_INDEX: usize = 0; #[tokio::main] @@ -24,14 +25,16 @@ async fn main() -> Result<(), Box> { // 1. Submit ownership proof // - // Each CEX prepares its own `signature` CSV file. - let signature_csv_path = "src/apis/csv/signatures.csv"; - // The signer instance would be shared with `address_ownership` and `round` instances // - // Using AddressInput::Address to directly provide the summa_contract's address. - // For deployed contracts, if the address is stored in a config file, - // you can alternatively use AddressInput::Path to specify the file's path. + // Using `AddressInput::Address`` to directly provide the summa_contract's address. + // + // If the address of a deployed contract is stored in a configuration file, + // you can use `AddressInput::Path` to provide the path to that file. + // + // For example, if the contract address is in "backend/src/contracts/deployments.json" located + // you would use `AddressInput::Path` as follows:`AddressInput::Path("backend/src/contracts/deployments.json".to_string())`. + // let signer = SummaSigner::new( "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", anvil.endpoint().as_str(), @@ -39,6 +42,8 @@ async fn main() -> Result<(), Box> { ) .await?; + // Each CEX prepares its own `signature` CSV file. + let signature_csv_path = "../csv/signatures.csv"; let mut address_ownership_client = AddressOwnership::new(&signer, signature_csv_path).unwrap(); // Dispatch the proof of address ownership. @@ -49,22 +54,21 @@ async fn main() -> Result<(), Box> { println!("1. Ownership proofs are submitted successfully!"); - // 2. Submit solvency proof + // 2. Submit Commitment // - // Initialize the `Round` instance to submit the proof of solvency. - let asset_csv = "src/apis/csv/assets.csv"; - let entry_csv = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; + // Initialize the `Round` instance to submit the liability commitment. let params_path = "ptau/hermez-raw-11"; + let entry_csv = "../csv/entry_16.csv"; + let mst = MerkleSumTree::from_csv(entry_csv).unwrap(); - // Using the `round` instance, the solvency proof is dispatched to the Summa contract with the `dispatch_solvency_proof` method. + // Using the `round` instance, the commitment is dispatched to the Summa contract with the `dispatch_commitment` method. let timestamp = 1u64; - let mut round = - Round::<4, 2, 14>::new(&signer, entry_csv, asset_csv, params_path, timestamp).unwrap(); + let mut round = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, timestamp).unwrap(); - // Sends the solvency proof, which should ideally complete without errors. - round.dispatch_solvency_proof().await?; + // Sends the commitment, which should ideally complete without errors. + round.dispatch_commitment().await?; - println!("2. Solvency proof is submitted successfully!"); + println!("2. Commitment is submitted successfully!"); // 3. Generate Inclusion Proof // @@ -100,19 +104,19 @@ async fn main() -> Result<(), Box> { // It's assumed that both `user_name` and `balances` are provided by the CEX. // The `balances` represent the user's balances on the CEX at `snapshot_time`. let user_name = "dxGaEAii".to_string(); - let balances = vec![11888, 41163]; + let balances = vec!["11888".to_string(), "41163".to_string()]; let leaf_hash = public_inputs[0]; assert_eq!( leaf_hash, - generate_leaf_hash::(user_name.clone(), balances.clone()) + leaf_hash_from_inputs::(user_name.clone(), balances.clone()) ); // Get `mst_root` from contract. the `mst_root` is disptached by CEX with specific time `snapshot_time`. - let mst_root = summa_contract.mst_roots(snapshot_time).call().await?; + let commitment = summa_contract.commitments(snapshot_time).call().await?; // Match the `mst_root` with the `root_hash` derived from the proof. - assert_eq!(mst_root, public_inputs[1]); + assert_eq!(commitment, public_inputs[1]); // Validate the inclusion proof using the contract verifier. let proof = inclusion_proof.get_proof(); diff --git a/backend/scripts/update_verifier_contracts.sh b/backend/scripts/update_verifier_contract.sh old mode 100644 new mode 100755 similarity index 63% rename from backend/scripts/update_verifier_contracts.sh rename to backend/scripts/update_verifier_contract.sh index 4e5c8eec..ec0af6bd --- a/backend/scripts/update_verifier_contracts.sh +++ b/backend/scripts/update_verifier_contract.sh @@ -5,10 +5,14 @@ set -e echo "1. Building verifier contracts" cd ../zk_prover cargo run --release --example gen_inclusion_verifier -cargo run --release --example gen_solvency_verifier + +# Generate Commitment for Merkle Sum Tree +echo "2. Generate Commitment for Merkle Sum Tree" +cd ../zk_prover +cargo run --release --example gen_commitment # Deploy contracts to local environment -echo "2. Deploying contracts to local environment" +echo "3. Deploying contracts to local environment" cd ../contracts npm install npx hardhat node & @@ -17,7 +21,7 @@ sleep 5 npx hardhat run scripts/deploy.ts --network localhost # Generate interface files for Backend -echo "3. Generating interface files for Backend" +echo "4. Generating interface files for Backend" cd ../backend cargo build diff --git a/backend/src/apis/csv/assets.csv b/backend/src/apis/csv/assets.csv deleted file mode 100644 index bb2e38f0..00000000 --- a/backend/src/apis/csv/assets.csv +++ /dev/null @@ -1,3 +0,0 @@ -chain;asset_name;amount -ETH;ETH;556863 -ETH;USDT;556863 diff --git a/backend/src/apis/csv_parser.rs b/backend/src/apis/csv_parser.rs index 3bde75e1..672fd14d 100644 --- a/backend/src/apis/csv_parser.rs +++ b/backend/src/apis/csv_parser.rs @@ -1,12 +1,9 @@ use std::{error::Error, fs::File, path::Path}; -use ethers::{ - abi::AbiEncode, - types::{Bytes, U256}, -}; +use ethers::{abi::AbiEncode, types::Bytes}; use serde::{Deserialize, Serialize}; -use crate::contracts::generated::summa_contract::{AddressOwnershipProof, Asset}; +use crate::contracts::generated::summa_contract::AddressOwnershipProof; #[derive(Debug, Deserialize, Serialize)] pub struct SignatureRecord { @@ -49,48 +46,13 @@ pub fn parse_signature_csv>( Ok(address_ownership_proofs) } -#[derive(Debug, Deserialize)] -struct AssetRecord { - chain: String, - asset_name: String, - amount: String, -} - -pub fn parse_asset_csv, const N_ASSETS: usize>( - path: P, -) -> Result<[Asset; N_ASSETS], Box> { - let file = File::open(path)?; - let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_reader(file); - - let mut assets_vec = Vec::with_capacity(N_ASSETS); - - for result in rdr.deserialize() { - let record: AssetRecord = result?; - - assets_vec.push(Asset { - asset_name: record.asset_name, - chain: record.chain, - amount: U256::from_dec_str(&record.amount)?, - }); - } - - let assets_array: [Asset; N_ASSETS] = assets_vec.try_into().map_err(|v: Vec| { - format!( - "The number of assets in CSV file does not match the expected count {:?}", - v - ) - })?; - - Ok(assets_array) -} - #[cfg(test)] mod tests { use super::*; #[test] fn test_parse_csv_to_signature() { - let path = "src/apis/csv/signatures.csv"; + let path = "../csv/signatures.csv"; let address_ownership = parse_signature_csv(path).unwrap(); let first_address_ownership = AddressOwnershipProof { @@ -103,27 +65,4 @@ mod tests { assert_eq!(address_ownership[0], first_address_ownership); } - - #[test] - fn test_parse_csv_to_assets() { - let path = "src/apis/csv/assets.csv"; - let assets = parse_asset_csv::<&str, 2>(path).unwrap(); - - assert_eq!( - assets[0], - Asset { - chain: "ETH".to_string(), - asset_name: "ETH".to_string(), - amount: U256::from(556863), - } - ); - assert_eq!( - assets[1], - Asset { - chain: "ETH".to_string(), - asset_name: "USDT".to_string(), - amount: U256::from(556863), - } - ); - } } diff --git a/backend/src/apis/mod.rs b/backend/src/apis/mod.rs index 82fca001..8cdc087b 100644 --- a/backend/src/apis/mod.rs +++ b/backend/src/apis/mod.rs @@ -1,3 +1,28 @@ pub mod address_ownership; pub mod csv_parser; pub mod round; + +use ethers::types::U256; +use num_bigint::BigUint; +use num_traits::Num; +use summa_solvency::merkle_sum_tree::Entry; + +pub fn leaf_hash_from_inputs( + username: String, + balances: Vec, +) -> U256 +where + [usize; N_CURRENCIES + 1]: Sized, +{ + // Convert balances to BigUint + let balances: Vec = balances + .iter() + .map(|balance| BigUint::from_str_radix(balance, 10).unwrap()) + .collect(); + + let entry: Entry = Entry::new(username, balances.try_into().unwrap()).unwrap(); + + // Convert Fp to U256 + let hash_str = format!("{:?}", entry.compute_leaf().hash); + U256::from_str_radix(&hash_str, 16).unwrap() +} diff --git a/backend/src/apis/round.rs b/backend/src/apis/round.rs index d986bb9c..865006ad 100644 --- a/backend/src/apis/round.rs +++ b/backend/src/apis/round.rs @@ -1,21 +1,19 @@ use ethers::types::{Bytes, U256}; use halo2_proofs::{ - halo2curves::bn256::{Bn256, Fr as Fp, G1Affine}, + halo2curves::bn256::{Bn256, G1Affine}, plonk::{ProvingKey, VerifyingKey}, poly::kzg::commitment::ParamsKZG, }; use serde::{Deserialize, Serialize}; use std::error::Error; -use super::csv_parser::parse_asset_csv; -use crate::contracts::{generated::summa_contract::summa::Asset, signer::SummaSigner}; +use crate::contracts::{generated::summa_contract::summa::Cryptocurrency, signer::SummaSigner}; use summa_solvency::{ circuits::{ merkle_sum_tree::MstInclusionCircuit, - solvency::SolvencyCircuit, utils::{gen_proof_solidity_calldata, generate_setup_artifacts}, }, - merkle_sum_tree::MerkleSumTree, + merkle_sum_tree::Tree, }; pub(crate) type SetupArtifacts = ( @@ -24,22 +22,6 @@ pub(crate) type SetupArtifacts = ( VerifyingKey, ); -#[derive(Debug, Clone)] -pub struct SolvencyProof { - public_inputs: Vec, - proof_calldata: Bytes, -} - -impl SolvencyProof { - pub fn get_public_inputs(&self) -> &Vec { - &self.public_inputs - } - - pub fn get_proof_calldata(&self) -> &Bytes { - &self.proof_calldata - } -} - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MstInclusionProof { public_inputs: Vec, @@ -56,39 +38,35 @@ impl MstInclusionProof { } } -pub struct Snapshot { - mst: MerkleSumTree, - assets_state: [Asset; N_ASSETS], - trusted_setup: [SetupArtifacts; 2], +pub struct Snapshot { + pub mst: Box>, + trusted_setup: SetupArtifacts, } -pub struct Round<'a, const LEVELS: usize, const N_ASSETS: usize, const N_BYTES: usize> { +pub struct Round<'a, const LEVELS: usize, const N_CURRENCIES: usize, const N_BYTES: usize> { timestamp: u64, - snapshot: Snapshot, + snapshot: Snapshot, signer: &'a SummaSigner, } -impl - Round<'_, LEVELS, N_ASSETS, N_BYTES> +impl + Round<'_, LEVELS, N_CURRENCIES, N_BYTES> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { pub fn new<'a>( signer: &'a SummaSigner, - entry_csv_path: &str, - asset_csv_path: &str, + mst: Box>, params_path: &str, timestamp: u64, - ) -> Result, Box> { + ) -> Result, Box> + where + [(); N_CURRENCIES + 2]: Sized, + { Ok(Round { timestamp, - snapshot: Snapshot::::new( - asset_csv_path, - entry_csv_path, - params_path, - ) - .unwrap(), + snapshot: Snapshot::::new(mst, params_path).unwrap(), signer: &signer, }) } @@ -97,17 +75,33 @@ where self.timestamp } - pub async fn dispatch_solvency_proof(&mut self) -> Result<(), Box> { - let proof: SolvencyProof = match self.snapshot.generate_proof_of_solvency() { - Ok(p) => p, - Err(e) => return Err(format!("Failed to generate proof of solvency: {}", e).into()), - }; + pub async fn dispatch_commitment(&mut self) -> Result<(), Box> { + let root_str = format!("{:?}", self.snapshot.mst.root().hash); + let mst_root = U256::from_str_radix(&root_str, 16).unwrap(); + + let mut root_sums = Vec::::new(); + + for balance in self.snapshot.mst.root().balances.iter() { + let fp_str = format!("{:?}", balance); + root_sums.push(U256::from_str_radix(&fp_str, 16).unwrap()); + } self.signer - .submit_proof_of_solvency( - proof.public_inputs[0], - self.snapshot.assets_state.to_vec(), - proof.proof_calldata, + .submit_commitment( + mst_root, + root_sums, + self.snapshot + .mst + .cryptocurrencies() + .iter() + .map(|cryptocurrency| Cryptocurrency { + name: cryptocurrency.name.clone(), + chain: cryptocurrency.chain.clone(), + }) + .collect::>() + .as_slice() + .try_into() + .unwrap(), U256::from(self.get_timestamp()), ) .await?; @@ -118,7 +112,10 @@ where pub fn get_proof_of_inclusion( &self, user_index: usize, - ) -> Result { + ) -> Result + where + [(); N_CURRENCIES + 2]: Sized, + { Ok(self .snapshot .generate_proof_of_inclusion(user_index) @@ -126,22 +123,18 @@ where } } -impl - Snapshot +impl + Snapshot where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { pub fn new( - asset_csv_path: &str, - entry_csv_path: &str, + mst: Box>, params_path: &str, - ) -> Result, Box> { - let assets_state = parse_asset_csv::<&str, N_ASSETS>(asset_csv_path).unwrap(); - let mst = MerkleSumTree::::new(entry_csv_path).unwrap(); - - let mst_inclusion_circuit = MstInclusionCircuit::::init_empty(); - let solvency_circuit = SolvencyCircuit::::init_empty(); + ) -> Result, Box> { + let mst_inclusion_circuit = + MstInclusionCircuit::::init_empty(); // get k from ptau file name let parts: Vec<&str> = params_path.split("-").collect(); @@ -151,54 +144,26 @@ where let mst_inclusion_setup_artifacts: SetupArtifacts = generate_setup_artifacts(k, Some(params_path), mst_inclusion_circuit).unwrap(); - let solvency_setup_artifacts_artifacts = - generate_setup_artifacts(10, Some(params_path), solvency_circuit).unwrap(); - - let trusted_setup = [ - mst_inclusion_setup_artifacts, - solvency_setup_artifacts_artifacts, - ]; - Ok(Snapshot { mst, - assets_state, - trusted_setup, - }) - } - - pub fn generate_proof_of_solvency(&self) -> Result { - let asset_sums = self - .assets_state - .iter() - .map(|asset| Fp::from_raw(asset.amount.0) as Fp) - .collect::>() - .try_into() - .unwrap(); - let circuit = SolvencyCircuit::::init(self.mst.clone(), asset_sums); - - let calldata = gen_proof_solidity_calldata( - &self.trusted_setup[1].0, - &self.trusted_setup[1].1, - circuit, - ); - - Ok(SolvencyProof { - proof_calldata: calldata.0, - public_inputs: calldata.1, + trusted_setup: mst_inclusion_setup_artifacts, }) } pub fn generate_proof_of_inclusion( &self, user_index: usize, - ) -> Result { - let circuit = - MstInclusionCircuit::::init(self.mst.clone(), user_index); + ) -> Result + where + [(); N_CURRENCIES + 2]: Sized, + { + let merkle_proof = self.mst.generate_proof(user_index).unwrap(); + let circuit = MstInclusionCircuit::::init(merkle_proof); // Currently, default manner of generating a inclusion proof for solidity-verifier. let calldata = gen_proof_solidity_calldata( - &self.trusted_setup[0].0, - &self.trusted_setup[0].1, + &self.trusted_setup.0, + &self.trusted_setup.1, circuit.clone(), ); diff --git a/backend/src/contracts/abi/InclusionVerifier.json b/backend/src/contracts/abi/InclusionVerifier.json index e752b6e8..3ac0da95 100644 --- a/backend/src/contracts/abi/InclusionVerifier.json +++ b/backend/src/contracts/abi/InclusionVerifier.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615467806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f2df16218a82d39831071e46956c233ee9aa79bb065b265871080d8643f2f52ab600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906156008301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6156e08301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596157c08301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea836157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6158a08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c436158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa46159808301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c06159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615a608301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615b408301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615c208301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615d008301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615de08301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701615ec08301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d615fa08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e6160808301527f2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf44076160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6161608301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746162408301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6163208301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d6164008301527f13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6170608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6170808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456170a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212208f0f08c113d71e9affd04a930a0ccffff41cc79e358932cfa7ac1395c242440564736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f2df16218a82d39831071e46956c233ee9aa79bb065b265871080d8643f2f52ab600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906156008301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6156e08301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596157c08301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea836157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6158a08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c436158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa46159808301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c06159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615a608301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615b408301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615c208301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615d008301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615de08301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701615ec08301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d615fa08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e6160808301527f2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf44076160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6161608301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746162408301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6163208301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d6164008301527f13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6170608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6170808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456170a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212208f0f08c113d71e9affd04a930a0ccffff41cc79e358932cfa7ac1395c242440564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061563680620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154f8565b610057565b604051901515815260200160405180910390f35b60006001610063615421565b6000805160206155e18339815191526100d9565b6000805160206155c183398151915280831081831016908380096000805160206155c18339815191528384096000805160206155c183398151915284820990506000805160206155c18339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f101e32209fbc2afdda2eab08eed3e3e9323ecd92e5c6b9508204b948de1ae5f3600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155e18339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610600830151820361062084015108611fa083015280611fa083015161068084015109611fc08301819052610600830151829108611fe0830152806106408301518203611fe0840151086120008301819052611ee083015182910961202083015280612020830151611f808401510861204083015280612040830151610420840151096120608301528061062083015182036106008401510861208083015280612080830151610680840151096120a083018190526106208301518291086120c08301528061066083015182036120c0840151086120e08301819052611ee08301518291096121008301528061210083015161206084015108612120830152806121208301516104208401510961214083015280611a00830151611da08401510961216083015280612160830151611a608401510961218083015280610620830151610600840151086121a08301528061068083015182036121a0840151086121c083018190526121808301518291096121e0830152806121e083015161214084015108612200830152806122008301516104208401510961222083018190526121e0830151829108612240830152806122408301516104208401510961226083015280610920830151820360010861228083018190526113008301518291096122a0830152806122a0830151612260840151086122c0830152806122c0830151610420840151096122e083015261098082015181908009612300830152806109808301518203612300840151086123208301819052611240830151829109612340830152806123408301516122e0840151086123608301528061236083015161042084015109612380830152806109608301518203610980840151086123a083018190526113008301518291096123c0830152806123c0830151612380840151086123e0830152806123e083015161042084015109612400830152806112408301518203600108612420830152806112808301516112608401510861244083018190526112a083015182910861246083018190526112c083015182910861248083018190526112e08301518291086124a0830152806124a08301518203612420840151086124c083015280610260830151610860840151096124e0830152806124e08301516106e08401510861250083018190526102c08301518291086125208301528061026083015161088084015109612540830152806125408301516106008401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108a0840151096125c0830152806125c0830151610620840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830152806102608301516108c084015109612640830152806126408301516107008401510861266083018190526102c083015182910861268083018190526126208301518291096126a083018190526109408301518291096126c0830152806102608301516001096126e0830152806126e08301516105c084015109612700830152806127008301516106e08401510861272083018190526102c0830151829108612740830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612760830152806127608301516105c08401510961278083015280612780830151610600840151086127a083018190526102c08301518291086127c083018190526127408301518291096127e0830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612800830152806128008301516105c084015109612820830152806128208301516106208401510861284083018190526102c083015182910861286083018190526127e0830151829109612880830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096128a0830152806128a08301516105c0840151096128c0830152806128c0830151610700840151086128e083018190526102c0830151829108612900830181905261288083015182910961292083018190526109208301518291096129408301528061294083015182036126c08401510861296083018190526124c083015182910961298083015280612980830151612400840151086129a0830152806129a0830151610420840151096129c0830152806102608301516108e0840151096129e0830152806129e083015161068084015108612a0083018190526102c0830151829108612a208301528061026083015161090084015109612a4083015280612a4083015161138084015108612a6083018190526102c0830151829108612a808301819052612a20830151829109612aa083018190526109a0830151829109612ac0830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612ae083015280612ae08301516105c084015109612b0083015280612b0083015161068084015108612b2083018190526102c0830151829108612b40830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612b6083015280612b608301516105c084015109612b8083015280612b8083015161138084015108612ba083018190526102c0830151829108612bc08301819052612b40830151829109612be08301819052610980830151829109612c0083015280612c008301518203612ac084015108612c2083018190526124c0830151829109612c4083015280612c408301516129c084015108612c6083015280612c6083015161042084015109612c80830152806109c08301518203600108612ca08301819052611300830151829109612cc083015280612cc0830151612c8084015108612ce083015280612ce083015161042084015109612d008301526109c082015181908009612d20830152806109c08301518203612d2084015108612d408301819052611240830151829109612d6083015280612d60830151612d0084015108612d8083015280612d8083015161042084015109612da083015280610260830151610a0084015108612dc083018190526109e0830151829109612de0830152806102c0830151610a4084015108612e008301819052612de0830151829109612e208301528061064083015161010009612e4083015280612e40830151820361060084015108612e608301819052610780830151829109612e808301819052610260830151829108612ea083018190526109c0830151829109612ec0830152806102c083015161076084015108612ee08301819052612ec0830151829109612f0083015280612f008301518203612e2084015108612f2083018190526124c0830151829109612f4083015280612f40830151612da084015108612f6083015280612f6083015161042084015109612f8083015280610a408301518203610a0084015108612fa08301819052611300830151829109612fc083015280612fc0830151612f8084015108612fe083015280612fe083015161042084015109613000830152806124c0830151612fa08401510961302083015280610a208301518203610a008401510861304083018190526130208301518291096130608301528061306083015161300084015108613080830152610d40820151819080096130a08301819052610d408301518291096130c08301819052610d408301518291096130e08301819052610d4083015182910961310083015280610d40830151600109613120830152806130a0830151600109613140830152806130c0830151600109613160830152806130e083015160010961318083015280610d60830151613080840151096131a0830152806105c0830151610c00840151096131c08301528060016105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c084015109613220830152806132208301518203610b8084015108613240830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c084015109613260830152806132608301518203610b8084015108613280830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c0840151096132a0830152806132a08301518203610b80840151086132c083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132e08401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806133008401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c08701510908613320840152506132008201518190600109613340830181905261324083015182910961336083018190526132c0830151829109613380830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133a08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133c08401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133e08401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613400840152506132808201516133608301518291900961342083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806134408401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806134608401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134808401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c087015109086134a0840152506132c0820151613340830151829190096134c08301526132e08201518181613300850151099050806134e084015281816133208501510990508061350084015281816133a08501510990508061352084015281816133408501510990508061354084015281816133c08501510990508061356084015281816133e0850151099050806135808401528181613400850151099050806135a08401528181613420850151099050806135c08401528181613440850151099050806135e084015281816134608501510990508061360084015281816133608501510990508061362084015281816134808501510990508061364084015281816134a08501510990508061366084015281816134c0850151099050806136808401525060206136c083015260206136e083015260206137008301526136808201516137208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6137408301526000805160206155e183398151915261376083015282600160206136a0850160c06136c0870160055afa141692506136a082015160006134c084015190508282613660860151096134c08501528282820991506134a084015190508282613640860151096134a085015282828209915061348084015190508282613620860151096134808501528282820991506133608401519050828261360086015109613360850152828282099150613460840151905082826135e086015109613460850152828282099150613440840151905082826135c086015109613440850152828282099150613420840151905082826135a08601510961342085015282828209915061340084015190508282613580860151096134008501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c085015282828209915061334084015190508282613520860151096133408501528282820991506133a084015190508282613500860151096133a0850152828282099150613320840151905082826134e086015109613320850152828282099150613300840151905082826132e086015109613300850152828282096132e08501819052613300850151909250839150829008905081816133208501510861378084015250613340820151613380830151829190096137a08301526133a0820151806137c08401525080613420830151613380840151096137e08301526133c082015181816133e08501510890508181613400850151086138008401525061336082015161338083015182919009613820830152613440820151818161346085015108613840840152506134c08201516133808301518291900961386083015261348082015181816134a085015108613880840152506137808201516137c083015182908290099050806138a08401528181613800850151099050806138c08401528181613840850151099050806138e0840152818161388085015109905080613900840152506020613940830152602061396083015260206139808301526139008201516139a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6139c08301526000805160206155e18339815191526139e08301528260016020613920850160c0613940870160055afa141692506139208201516000613880840151905082826138e086015109613880850152828282099150613840840151905082826138c086015109613840850152828282099150613800840151905082826138a0860151096138008501528282820991506137c084015190508282613780860151096137c08501528282820961378085015250506137c08201516137a083015182919009613a00830152806138008301516137e084015109613a208301528061384083015161382084015109613a408301528061388083015161386084015109613a60830152610a8082015181908009613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c608301819052610a80830151829109613c808301819052610a80830151829109613ca08301819052610a80830151829109613cc08301819052610a80830151829109613ce0830152610ae082015181908009613d008301819052610ae0830151829109613d208301819052610ae0830151829109613d408301819052610ae0830151829109613d60830152806132e083015161060084015109818183613300860151610640870151090890508181836133208601516106c08701510908613d8084018190526137808401518392509009613da0830152806001613da0840151830309613dc0830152806132e083015161062084015109818183613300860151610660870151090890508181836133208601516106a08701510908613de084018190526137808401518392509009613e008301819052610a808301518291820309613e2083015280610a80830151600109613e4083015280613e20830151613dc084015108613e60830152806001613e6084015109613e80830152806001613e4084015109613ea0830152806137a0830151600109613ec0830152806133a083015161068084015109613ee08301819052613a00830151829109613f00830152806001613f00840151830309613f20830152806001613ec084015109613f40830152806133a0830151610a4084015109613f608301819052613a00830151829109613f808301819052610a808301518291820309613fa083015280610a80830151613ec084015109613fc083015280613fa0830151613f2084015108613fe0830152806133a08301516106e0840151096140008301819052613a008301518291096140208301819052613a80830151829182030961404083015280613a80830151613ec08401510961406083015280614040830151613fe084015108614080830152806133a0830151610700840151096140a08301819052613a008301518291096140c08301819052613aa083015182918203096140e083015280613aa0830151613ec084015109614100830152806140e083015161408084015108614120830152806133a0830151610720840151096141408301819052613a008301518291096141608301819052613ac0830151829182030961418083015280613ac0830151613ec0840151096141a083015280614180830151614120840151086141c0830152806133a0830151610740840151096141e08301819052613a008301518291096142008301819052613ae0830151829182030961422083015280613ae0830151613ec084015109614240830152806142208301516141c084015108614260830152806133a0830151610760840151096142808301819052613a008301518291096142a08301819052613b0083015182918203096142c083015280613b00830151613ec0840151096142e0830152806142c083015161426084015108614300830152806133a0830151610780840151096143208301819052613a008301518291096143408301819052613b20830151829182030961436083015280613b20830151613ec08401510961438083015280614360830151614300840151086143a0830152806133a08301516107a0840151096143c08301819052613a008301518291096143e08301819052613b40830151829182030961440083015280613b40830151613ec084015109614420830152806144008301516143a084015108614440830152806133a08301516107c0840151096144608301819052613a008301518291096144808301819052613b6083015182918203096144a083015280613b60830151613ec0840151096144c0830152806144a0830151614440840151086144e0830152806133a08301516107e0840151096145008301819052613a008301518291096145208301819052613b80830151829182030961454083015280613b80830151613ec084015109614560830152806145408301516144e084015108614580830152806133a0830151610800840151096145a08301819052613a008301518291096145c08301819052613ba083015182918203096145e083015280613ba0830151613ec084015109614600830152806145e083015161458084015108614620830152806133a0830151610820840151096146408301819052613a008301518291096146608301819052613bc0830151829182030961468083015280613bc0830151613ec0840151096146a083015280614680830151614620840151086146c0830152806133a0830151610860840151096146e08301819052613a008301518291096147008301819052613be0830151829182030961472083015280613be0830151613ec084015109614740830152806147208301516146c084015108614760830152806133a0830151610880840151096147808301819052613a008301518291096147a08301819052613c0083015182918203096147c083015280613c00830151613ec0840151096147e0830152806147c083015161476084015108614800830152806133a08301516108a0840151096148208301819052613a008301518291096148408301819052613c20830151829182030961486083015280613c20830151613ec08401510961488083015280614860830151614800840151086148a0830152806133a08301516108c0840151096148c08301819052613a008301518291096148e08301819052613c40830151829182030961490083015280613c40830151613ec084015109614920830152806149008301516148a084015108614940830152806133a08301516108e0840151096149608301819052613a008301518291096149808301819052613c6083015182918203096149a083015280613c60830151613ec0840151096149c0830152806149a0830151614940840151086149e0830152806133a083015161090084015109614a008301819052613a00830151829109614a208301819052613c808301518291820309614a4083015280613c80830151613ec084015109614a6083015280614a408301516149e084015108614a80830152806137a083015161312084015109614aa0830152806137a083015161314084015109614ac0830152806137a083015161316084015109614ae0830152806137a083015161318084015109614b00830152806133a08301516131a084015109614b208301819052613a00830151829109614b408301819052613ca08301518291820309614b6083015280613ca0830151613ec084015109614b8083015280613ca0830151614aa084015109614ba083015280613ca0830151614ac084015109614bc083015280613ca0830151614ae084015109614be083015280613ca0830151614b0084015109614c0083015280614b60830151614a8084015108614c20830152806133a083015161084084015109614c408301819052613a00830151829109614c608301819052613cc08301518291820309614c8083015280613cc0830151613ec084015109614ca083015280614c80830151614c2084015108614cc08301819052610ae0830151829109614ce083015280610ae0830151613f4084015109614d0083015280610ae0830151613fc084015109614d2083015280610ae083015161406084015109614d4083015280610ae083015161410084015109614d6083015280610ae08301516141a084015109614d8083015280610ae083015161424084015109614da083015280610ae08301516142e084015109614dc083015280610ae083015161438084015109614de083015280610ae083015161442084015109614e0083015280610ae08301516144c084015109614e2083015280610ae083015161456084015109614e4083015280610ae083015161460084015109614e6083015280610ae08301516146a084015109614e8083015280610ae083015161474084015109614ea083015280610ae08301516147e084015109614ec083015280610ae083015161488084015109614ee083015280610ae083015161492084015109614f0083015280610ae08301516149c084015109614f2083015280610ae0830151614a6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614ba084015109614f8083015280610ae0830151614bc084015109614fa083015280610ae0830151614be084015109614fc083015280610ae0830151614c0084015109614fe083015280610ae0830151614ca08401510961500083015280614ce0830151613e8084015108615020830152806137e0830151600109615040830152806133c0830151610920840151098181836133e08601516109408701510908905081818361340086015161096087015109086150608401819052613a2084015183925090096150808301528060016150808401518303096150a0830152806001615040840151096150c083015280613d008301516150a0840151096150e083015280613d008301516150c084015109615100830152806150e0830151615020840151086151208301528061382083015160010961514083015280613440830151610980840151098181836134608601516109a087015109086151608401819052613a4084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c0830152806134408301516109c0840151098181836134608601516109e087015109086151e08401819052613a4084015183925090096152008301819052610a80830151829182030961522083015280610a8083015161514084015109615240830152806152208301516151a0840151086152608301819052613d2083015182910961528083015280613d208301516151c0840151096152a083015280613d20830151615240840151096152c083015280615280830151615120840151086152e08301528061386083015160010961530083015280613480830151610a00840151098181836134a0860151610a2087015109086153208401819052613a6084015183925090096153408301528060016153408401518303096153608301528060016153008401510961538083015280613d40830151615360840151096153a083015280613d40830151615380840151096153c0830152806153a08301516152e0840151086153e08301528061338083015160010961540083015280610b808301516001096154208301526001615440830181815260026154608501526153e084015161548085015284919060409060608160075afa141692506154408201516154a08301526154608201516154c083015260a08201516154e083015260c082015161550083015282600160406154a0850160806154a0870160065afa1416925060e0820151615520830152610100820151615540830152613ea0820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa14169250610120820151615600830152610140820151615620830152614d00820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692506102008201516156e0830152610220820151615700830152614d2082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f299b12e65399dcea3f1e0ce046cf5f93ce7ba9f779bfa39e7f0c6d4c19628a906157c08301527f21c577122a3d1f4d019b93e724d981b0653ed94f492eafec50945231935f9a956157e0830152614d4082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f19d9220141bef25921d474c6e634d06dfb7d7904e59a4ec486a148b00bfd38a36158a08301527f2f38511e53688056b693c84ef69a7ae2b9ab482906dc46ae9d9522fd3ce098b66158c0830152614d608201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f17e7cb6a30c4ce9a3d8de604dbaf517b1f23e440acb9e7345938ff5b245a403e6159808301527f1c31a42d7da360cce8262e21fb9a5ef26a23ebbcf6995ccab89aee400c2e994b6159a0830152614d808201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f05591c7faa2c9eaf1c9573a84bddec303219abf496af0899ed438853227dd056615a608301527f2cfa24fde576750b4036dffe40105e6b7244f63843ec74d9d0aad48ba413287c615a80830152614da0820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615b408301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615b60830152614dc0820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f19206bebc5cc4a5b692c58bc61e7aec6d3fbb8344e39a133699f74e6f40ec2a8615c208301527f0678c7bdd141bd26cbe9336f5dcf1c5a8cf21a5927afd1b2f393152ee02a6a78615c40830152614de0820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6e2343333783b4f48ae7d2681afb3cdf6a4dfbc83a500cb06db3265ad3e5d5615d008301527f1a3d836d4325ff30144c1e2038a4d4025fd0f01af24cfd8dfd54018e64f3b098615d20830152614e00820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b615de08301527f04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097615e00830152614e20820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91615ec08301527f2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd615ee0830152614e40820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f09e3303245e3b00aca894e9fba3d5184ff3739c664e363f205d42feee327b6aa615fa08301527f13ce92283cc6f648bdda86182d91852aab5c6088ab008d9cdb5522fcbf5c6289615fc0830152614e60820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f08a503e7a16684a81991dbfc5ec84c9f4b0f7a506ddf26b67d305ebfc0f817436160808301527f08a2d8e1760ffb16f70147f8b44e781ced65a1e677a786cdd8bc9f947b36131c6160a0830152614e808201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f25632bc8012c6cbc6ddda661a9729f544c54620700c3840c01ca5b57e61a1ffe6161608301527f2ba5764c663a4b2892343c303da0f5664e3f620dd6b851a711781704292fd11a616180830152614ea08201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f07cfe4f3152b1996e8eafd718451356c2044e4c239fcc29eb3a81d392e1b44ad6162408301527f255673e224a594e53fd5b1b4dcd46329e72a04e16056dea3d5a17e31291a9960616260830152614ec0820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f136cb14b351f3b43b5e618c5c49022588edd48550f4e7d69309442e8b83d0d226163208301527f0ee9bbdfce93815e79aabfc5ec92a52346c46a45e17bc5bc9ad8155e982c9cac616340830152614ee0820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746164008301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616420830152614f00820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692507f1f5d69f8adc7def353cac5301331f66a6aa12c3bdc46ba8509d81c1922944c1e6164e08301527f050a358c8ee74901afd6bebdda35a25be99ba631232abec0bb7df23428e219eb616500830152614f2082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692507f1ddbf91ceeed88a8c66e9bf8d089b3098dc083f15790870796a7267f25cf9bf06165c08301527f0ab4e80b0091cd40070294f754e54b127e2000572c0344c2838aeeaf251eb3916165e0830152614f4082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104608201516166a08301526104808201516166c0830152614f608201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104a08201516167808301526104c08201516167a0830152614f808201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa141692506104e0820151616860830152610500820151616880830152614fa08201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa14169250610520820151616940830152610540820151616960830152614fc0820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa14169250610560820151616a20830152610580820151616a40830152614fe0820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa141692506103c0820151616b008301526103e0820151616b20830152615000820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610300820151616be0830152610320820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610340820151616cc0830152610360820151616ce08301526152a0820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610380820151616da08301526103a0820151616dc08301526152c0820151616de08301528260016040616da085016060616da0870160075afa14169250616d20820151616e00830152616d40820151616e20830152616da0820151616e40830152616dc0820151616e608301528260016040616e0085016080616e00870160065afa141692506101c0820151616e808301526101e0820151616ea08301526153c0820151616ec08301528260016040616e8085016060616e80870160075afa14169250616e00820151616ee0830152616e20820151616f00830152616e80820151616f20830152616ea0820151616f408301528260016040616ee085016080616ee0870160065afa14169250610b20820151616f60830152610b40820151616f808301526154008201518103616fa0830152508160016040616f6084016060616f60860160075afa14169150616ee0810151616fc0820152616f00810151616fe0820152616f60810151617000820152616f808101516170208201528160016040616fc084016080616fc0860160065afa14169150610bc0810151617040820152610be0810151617060820152615420810151617080820152816001604061704084016060617040860160075afa14169150616fc08101516170a0820152616fe08101516170c08201526170408101516170e082015261706081015161710082015281600160406170a0840160806170a0860160065afa141691506170a08101516171208201526170c08101516171408201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26171608201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171808201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171a08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6171c0820152610bc08101516171e0820152610be08101516172008201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6172208201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6172408201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456172608201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61728082015281600160206171208401610180617120860160085afa61712093909301516001149214161691505092915050565b604051806172800160405280610394906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561548057615480615441565b604052919050565b600082601f83011261549957600080fd5b813567ffffffffffffffff8111156154b3576154b3615441565b6154c6601f8201601f1916602001615457565b8181528460208386010111156154db57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561550b57600080fd5b823567ffffffffffffffff8082111561552357600080fd5b818501915085601f83011261553757600080fd5b813560208282111561554b5761554b615441565b8160051b61555a828201615457565b928352848101820192828101908a85111561557457600080fd5b958301955b8487101561559257863582529583019590830190615579565b97505050860135925050808211156155a957600080fd5b506155b685828601615488565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220433d439b616c9b0984aa273d65d03bbc910a575c3fc62a9c5097577b1baffcd564736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154f8565b610057565b604051901515815260200160405180910390f35b60006001610063615421565b6000805160206155e18339815191526100d9565b6000805160206155c183398151915280831081831016908380096000805160206155c18339815191528384096000805160206155c183398151915284820990506000805160206155c18339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f101e32209fbc2afdda2eab08eed3e3e9323ecd92e5c6b9508204b948de1ae5f3600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155e18339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610600830151820361062084015108611fa083015280611fa083015161068084015109611fc08301819052610600830151829108611fe0830152806106408301518203611fe0840151086120008301819052611ee083015182910961202083015280612020830151611f808401510861204083015280612040830151610420840151096120608301528061062083015182036106008401510861208083015280612080830151610680840151096120a083018190526106208301518291086120c08301528061066083015182036120c0840151086120e08301819052611ee08301518291096121008301528061210083015161206084015108612120830152806121208301516104208401510961214083015280611a00830151611da08401510961216083015280612160830151611a608401510961218083015280610620830151610600840151086121a08301528061068083015182036121a0840151086121c083018190526121808301518291096121e0830152806121e083015161214084015108612200830152806122008301516104208401510961222083018190526121e0830151829108612240830152806122408301516104208401510961226083015280610920830151820360010861228083018190526113008301518291096122a0830152806122a0830151612260840151086122c0830152806122c0830151610420840151096122e083015261098082015181908009612300830152806109808301518203612300840151086123208301819052611240830151829109612340830152806123408301516122e0840151086123608301528061236083015161042084015109612380830152806109608301518203610980840151086123a083018190526113008301518291096123c0830152806123c0830151612380840151086123e0830152806123e083015161042084015109612400830152806112408301518203600108612420830152806112808301516112608401510861244083018190526112a083015182910861246083018190526112c083015182910861248083018190526112e08301518291086124a0830152806124a08301518203612420840151086124c083015280610260830151610860840151096124e0830152806124e08301516106e08401510861250083018190526102c08301518291086125208301528061026083015161088084015109612540830152806125408301516106008401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108a0840151096125c0830152806125c0830151610620840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830152806102608301516108c084015109612640830152806126408301516107008401510861266083018190526102c083015182910861268083018190526126208301518291096126a083018190526109408301518291096126c0830152806102608301516001096126e0830152806126e08301516105c084015109612700830152806127008301516106e08401510861272083018190526102c0830151829108612740830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612760830152806127608301516105c08401510961278083015280612780830151610600840151086127a083018190526102c08301518291086127c083018190526127408301518291096127e0830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612800830152806128008301516105c084015109612820830152806128208301516106208401510861284083018190526102c083015182910861286083018190526127e0830151829109612880830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096128a0830152806128a08301516105c0840151096128c0830152806128c0830151610700840151086128e083018190526102c0830151829108612900830181905261288083015182910961292083018190526109208301518291096129408301528061294083015182036126c08401510861296083018190526124c083015182910961298083015280612980830151612400840151086129a0830152806129a0830151610420840151096129c0830152806102608301516108e0840151096129e0830152806129e083015161068084015108612a0083018190526102c0830151829108612a208301528061026083015161090084015109612a4083015280612a4083015161138084015108612a6083018190526102c0830151829108612a808301819052612a20830151829109612aa083018190526109a0830151829109612ac0830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612ae083015280612ae08301516105c084015109612b0083015280612b0083015161068084015108612b2083018190526102c0830151829108612b40830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612b6083015280612b608301516105c084015109612b8083015280612b8083015161138084015108612ba083018190526102c0830151829108612bc08301819052612b40830151829109612be08301819052610980830151829109612c0083015280612c008301518203612ac084015108612c2083018190526124c0830151829109612c4083015280612c408301516129c084015108612c6083015280612c6083015161042084015109612c80830152806109c08301518203600108612ca08301819052611300830151829109612cc083015280612cc0830151612c8084015108612ce083015280612ce083015161042084015109612d008301526109c082015181908009612d20830152806109c08301518203612d2084015108612d408301819052611240830151829109612d6083015280612d60830151612d0084015108612d8083015280612d8083015161042084015109612da083015280610260830151610a0084015108612dc083018190526109e0830151829109612de0830152806102c0830151610a4084015108612e008301819052612de0830151829109612e208301528061064083015161010009612e4083015280612e40830151820361060084015108612e608301819052610780830151829109612e808301819052610260830151829108612ea083018190526109c0830151829109612ec0830152806102c083015161076084015108612ee08301819052612ec0830151829109612f0083015280612f008301518203612e2084015108612f2083018190526124c0830151829109612f4083015280612f40830151612da084015108612f6083015280612f6083015161042084015109612f8083015280610a408301518203610a0084015108612fa08301819052611300830151829109612fc083015280612fc0830151612f8084015108612fe083015280612fe083015161042084015109613000830152806124c0830151612fa08401510961302083015280610a208301518203610a008401510861304083018190526130208301518291096130608301528061306083015161300084015108613080830152610d40820151819080096130a08301819052610d408301518291096130c08301819052610d408301518291096130e08301819052610d4083015182910961310083015280610d40830151600109613120830152806130a0830151600109613140830152806130c0830151600109613160830152806130e083015160010961318083015280610d60830151613080840151096131a0830152806105c0830151610c00840151096131c08301528060016105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c084015109613220830152806132208301518203610b8084015108613240830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c084015109613260830152806132608301518203610b8084015108613280830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c0840151096132a0830152806132a08301518203610b80840151086132c083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132e08401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806133008401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c08701510908613320840152506132008201518190600109613340830181905261324083015182910961336083018190526132c0830151829109613380830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133a08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133c08401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133e08401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613400840152506132808201516133608301518291900961342083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806134408401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806134608401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134808401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c087015109086134a0840152506132c0820151613340830151829190096134c08301526132e08201518181613300850151099050806134e084015281816133208501510990508061350084015281816133a08501510990508061352084015281816133408501510990508061354084015281816133c08501510990508061356084015281816133e0850151099050806135808401528181613400850151099050806135a08401528181613420850151099050806135c08401528181613440850151099050806135e084015281816134608501510990508061360084015281816133608501510990508061362084015281816134808501510990508061364084015281816134a08501510990508061366084015281816134c0850151099050806136808401525060206136c083015260206136e083015260206137008301526136808201516137208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6137408301526000805160206155e183398151915261376083015282600160206136a0850160c06136c0870160055afa141692506136a082015160006134c084015190508282613660860151096134c08501528282820991506134a084015190508282613640860151096134a085015282828209915061348084015190508282613620860151096134808501528282820991506133608401519050828261360086015109613360850152828282099150613460840151905082826135e086015109613460850152828282099150613440840151905082826135c086015109613440850152828282099150613420840151905082826135a08601510961342085015282828209915061340084015190508282613580860151096134008501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c085015282828209915061334084015190508282613520860151096133408501528282820991506133a084015190508282613500860151096133a0850152828282099150613320840151905082826134e086015109613320850152828282099150613300840151905082826132e086015109613300850152828282096132e08501819052613300850151909250839150829008905081816133208501510861378084015250613340820151613380830151829190096137a08301526133a0820151806137c08401525080613420830151613380840151096137e08301526133c082015181816133e08501510890508181613400850151086138008401525061336082015161338083015182919009613820830152613440820151818161346085015108613840840152506134c08201516133808301518291900961386083015261348082015181816134a085015108613880840152506137808201516137c083015182908290099050806138a08401528181613800850151099050806138c08401528181613840850151099050806138e0840152818161388085015109905080613900840152506020613940830152602061396083015260206139808301526139008201516139a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6139c08301526000805160206155e18339815191526139e08301528260016020613920850160c0613940870160055afa141692506139208201516000613880840151905082826138e086015109613880850152828282099150613840840151905082826138c086015109613840850152828282099150613800840151905082826138a0860151096138008501528282820991506137c084015190508282613780860151096137c08501528282820961378085015250506137c08201516137a083015182919009613a00830152806138008301516137e084015109613a208301528061384083015161382084015109613a408301528061388083015161386084015109613a60830152610a8082015181908009613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c608301819052610a80830151829109613c808301819052610a80830151829109613ca08301819052610a80830151829109613cc08301819052610a80830151829109613ce0830152610ae082015181908009613d008301819052610ae0830151829109613d208301819052610ae0830151829109613d408301819052610ae0830151829109613d60830152806132e083015161060084015109818183613300860151610640870151090890508181836133208601516106c08701510908613d8084018190526137808401518392509009613da0830152806001613da0840151830309613dc0830152806132e083015161062084015109818183613300860151610660870151090890508181836133208601516106a08701510908613de084018190526137808401518392509009613e008301819052610a808301518291820309613e2083015280610a80830151600109613e4083015280613e20830151613dc084015108613e60830152806001613e6084015109613e80830152806001613e4084015109613ea0830152806137a0830151600109613ec0830152806133a083015161068084015109613ee08301819052613a00830151829109613f00830152806001613f00840151830309613f20830152806001613ec084015109613f40830152806133a0830151610a4084015109613f608301819052613a00830151829109613f808301819052610a808301518291820309613fa083015280610a80830151613ec084015109613fc083015280613fa0830151613f2084015108613fe0830152806133a08301516106e0840151096140008301819052613a008301518291096140208301819052613a80830151829182030961404083015280613a80830151613ec08401510961406083015280614040830151613fe084015108614080830152806133a0830151610700840151096140a08301819052613a008301518291096140c08301819052613aa083015182918203096140e083015280613aa0830151613ec084015109614100830152806140e083015161408084015108614120830152806133a0830151610720840151096141408301819052613a008301518291096141608301819052613ac0830151829182030961418083015280613ac0830151613ec0840151096141a083015280614180830151614120840151086141c0830152806133a0830151610740840151096141e08301819052613a008301518291096142008301819052613ae0830151829182030961422083015280613ae0830151613ec084015109614240830152806142208301516141c084015108614260830152806133a0830151610760840151096142808301819052613a008301518291096142a08301819052613b0083015182918203096142c083015280613b00830151613ec0840151096142e0830152806142c083015161426084015108614300830152806133a0830151610780840151096143208301819052613a008301518291096143408301819052613b20830151829182030961436083015280613b20830151613ec08401510961438083015280614360830151614300840151086143a0830152806133a08301516107a0840151096143c08301819052613a008301518291096143e08301819052613b40830151829182030961440083015280613b40830151613ec084015109614420830152806144008301516143a084015108614440830152806133a08301516107c0840151096144608301819052613a008301518291096144808301819052613b6083015182918203096144a083015280613b60830151613ec0840151096144c0830152806144a0830151614440840151086144e0830152806133a08301516107e0840151096145008301819052613a008301518291096145208301819052613b80830151829182030961454083015280613b80830151613ec084015109614560830152806145408301516144e084015108614580830152806133a0830151610800840151096145a08301819052613a008301518291096145c08301819052613ba083015182918203096145e083015280613ba0830151613ec084015109614600830152806145e083015161458084015108614620830152806133a0830151610820840151096146408301819052613a008301518291096146608301819052613bc0830151829182030961468083015280613bc0830151613ec0840151096146a083015280614680830151614620840151086146c0830152806133a0830151610860840151096146e08301819052613a008301518291096147008301819052613be0830151829182030961472083015280613be0830151613ec084015109614740830152806147208301516146c084015108614760830152806133a0830151610880840151096147808301819052613a008301518291096147a08301819052613c0083015182918203096147c083015280613c00830151613ec0840151096147e0830152806147c083015161476084015108614800830152806133a08301516108a0840151096148208301819052613a008301518291096148408301819052613c20830151829182030961486083015280613c20830151613ec08401510961488083015280614860830151614800840151086148a0830152806133a08301516108c0840151096148c08301819052613a008301518291096148e08301819052613c40830151829182030961490083015280613c40830151613ec084015109614920830152806149008301516148a084015108614940830152806133a08301516108e0840151096149608301819052613a008301518291096149808301819052613c6083015182918203096149a083015280613c60830151613ec0840151096149c0830152806149a0830151614940840151086149e0830152806133a083015161090084015109614a008301819052613a00830151829109614a208301819052613c808301518291820309614a4083015280613c80830151613ec084015109614a6083015280614a408301516149e084015108614a80830152806137a083015161312084015109614aa0830152806137a083015161314084015109614ac0830152806137a083015161316084015109614ae0830152806137a083015161318084015109614b00830152806133a08301516131a084015109614b208301819052613a00830151829109614b408301819052613ca08301518291820309614b6083015280613ca0830151613ec084015109614b8083015280613ca0830151614aa084015109614ba083015280613ca0830151614ac084015109614bc083015280613ca0830151614ae084015109614be083015280613ca0830151614b0084015109614c0083015280614b60830151614a8084015108614c20830152806133a083015161084084015109614c408301819052613a00830151829109614c608301819052613cc08301518291820309614c8083015280613cc0830151613ec084015109614ca083015280614c80830151614c2084015108614cc08301819052610ae0830151829109614ce083015280610ae0830151613f4084015109614d0083015280610ae0830151613fc084015109614d2083015280610ae083015161406084015109614d4083015280610ae083015161410084015109614d6083015280610ae08301516141a084015109614d8083015280610ae083015161424084015109614da083015280610ae08301516142e084015109614dc083015280610ae083015161438084015109614de083015280610ae083015161442084015109614e0083015280610ae08301516144c084015109614e2083015280610ae083015161456084015109614e4083015280610ae083015161460084015109614e6083015280610ae08301516146a084015109614e8083015280610ae083015161474084015109614ea083015280610ae08301516147e084015109614ec083015280610ae083015161488084015109614ee083015280610ae083015161492084015109614f0083015280610ae08301516149c084015109614f2083015280610ae0830151614a6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614ba084015109614f8083015280610ae0830151614bc084015109614fa083015280610ae0830151614be084015109614fc083015280610ae0830151614c0084015109614fe083015280610ae0830151614ca08401510961500083015280614ce0830151613e8084015108615020830152806137e0830151600109615040830152806133c0830151610920840151098181836133e08601516109408701510908905081818361340086015161096087015109086150608401819052613a2084015183925090096150808301528060016150808401518303096150a0830152806001615040840151096150c083015280613d008301516150a0840151096150e083015280613d008301516150c084015109615100830152806150e0830151615020840151086151208301528061382083015160010961514083015280613440830151610980840151098181836134608601516109a087015109086151608401819052613a4084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c0830152806134408301516109c0840151098181836134608601516109e087015109086151e08401819052613a4084015183925090096152008301819052610a80830151829182030961522083015280610a8083015161514084015109615240830152806152208301516151a0840151086152608301819052613d2083015182910961528083015280613d208301516151c0840151096152a083015280613d20830151615240840151096152c083015280615280830151615120840151086152e08301528061386083015160010961530083015280613480830151610a00840151098181836134a0860151610a2087015109086153208401819052613a6084015183925090096153408301528060016153408401518303096153608301528060016153008401510961538083015280613d40830151615360840151096153a083015280613d40830151615380840151096153c0830152806153a08301516152e0840151086153e08301528061338083015160010961540083015280610b808301516001096154208301526001615440830181815260026154608501526153e084015161548085015284919060409060608160075afa141692506154408201516154a08301526154608201516154c083015260a08201516154e083015260c082015161550083015282600160406154a0850160806154a0870160065afa1416925060e0820151615520830152610100820151615540830152613ea0820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa14169250610120820151615600830152610140820151615620830152614d00820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692506102008201516156e0830152610220820151615700830152614d2082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f299b12e65399dcea3f1e0ce046cf5f93ce7ba9f779bfa39e7f0c6d4c19628a906157c08301527f21c577122a3d1f4d019b93e724d981b0653ed94f492eafec50945231935f9a956157e0830152614d4082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f19d9220141bef25921d474c6e634d06dfb7d7904e59a4ec486a148b00bfd38a36158a08301527f2f38511e53688056b693c84ef69a7ae2b9ab482906dc46ae9d9522fd3ce098b66158c0830152614d608201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f17e7cb6a30c4ce9a3d8de604dbaf517b1f23e440acb9e7345938ff5b245a403e6159808301527f1c31a42d7da360cce8262e21fb9a5ef26a23ebbcf6995ccab89aee400c2e994b6159a0830152614d808201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f05591c7faa2c9eaf1c9573a84bddec303219abf496af0899ed438853227dd056615a608301527f2cfa24fde576750b4036dffe40105e6b7244f63843ec74d9d0aad48ba413287c615a80830152614da0820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615b408301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615b60830152614dc0820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f19206bebc5cc4a5b692c58bc61e7aec6d3fbb8344e39a133699f74e6f40ec2a8615c208301527f0678c7bdd141bd26cbe9336f5dcf1c5a8cf21a5927afd1b2f393152ee02a6a78615c40830152614de0820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6e2343333783b4f48ae7d2681afb3cdf6a4dfbc83a500cb06db3265ad3e5d5615d008301527f1a3d836d4325ff30144c1e2038a4d4025fd0f01af24cfd8dfd54018e64f3b098615d20830152614e00820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b615de08301527f04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097615e00830152614e20820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91615ec08301527f2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd615ee0830152614e40820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f09e3303245e3b00aca894e9fba3d5184ff3739c664e363f205d42feee327b6aa615fa08301527f13ce92283cc6f648bdda86182d91852aab5c6088ab008d9cdb5522fcbf5c6289615fc0830152614e60820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f08a503e7a16684a81991dbfc5ec84c9f4b0f7a506ddf26b67d305ebfc0f817436160808301527f08a2d8e1760ffb16f70147f8b44e781ced65a1e677a786cdd8bc9f947b36131c6160a0830152614e808201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f25632bc8012c6cbc6ddda661a9729f544c54620700c3840c01ca5b57e61a1ffe6161608301527f2ba5764c663a4b2892343c303da0f5664e3f620dd6b851a711781704292fd11a616180830152614ea08201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f07cfe4f3152b1996e8eafd718451356c2044e4c239fcc29eb3a81d392e1b44ad6162408301527f255673e224a594e53fd5b1b4dcd46329e72a04e16056dea3d5a17e31291a9960616260830152614ec0820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f136cb14b351f3b43b5e618c5c49022588edd48550f4e7d69309442e8b83d0d226163208301527f0ee9bbdfce93815e79aabfc5ec92a52346c46a45e17bc5bc9ad8155e982c9cac616340830152614ee0820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746164008301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616420830152614f00820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692507f1f5d69f8adc7def353cac5301331f66a6aa12c3bdc46ba8509d81c1922944c1e6164e08301527f050a358c8ee74901afd6bebdda35a25be99ba631232abec0bb7df23428e219eb616500830152614f2082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692507f1ddbf91ceeed88a8c66e9bf8d089b3098dc083f15790870796a7267f25cf9bf06165c08301527f0ab4e80b0091cd40070294f754e54b127e2000572c0344c2838aeeaf251eb3916165e0830152614f4082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104608201516166a08301526104808201516166c0830152614f608201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104a08201516167808301526104c08201516167a0830152614f808201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa141692506104e0820151616860830152610500820151616880830152614fa08201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa14169250610520820151616940830152610540820151616960830152614fc0820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa14169250610560820151616a20830152610580820151616a40830152614fe0820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa141692506103c0820151616b008301526103e0820151616b20830152615000820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610300820151616be0830152610320820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610340820151616cc0830152610360820151616ce08301526152a0820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610380820151616da08301526103a0820151616dc08301526152c0820151616de08301528260016040616da085016060616da0870160075afa14169250616d20820151616e00830152616d40820151616e20830152616da0820151616e40830152616dc0820151616e608301528260016040616e0085016080616e00870160065afa141692506101c0820151616e808301526101e0820151616ea08301526153c0820151616ec08301528260016040616e8085016060616e80870160075afa14169250616e00820151616ee0830152616e20820151616f00830152616e80820151616f20830152616ea0820151616f408301528260016040616ee085016080616ee0870160065afa14169250610b20820151616f60830152610b40820151616f808301526154008201518103616fa0830152508160016040616f6084016060616f60860160075afa14169150616ee0810151616fc0820152616f00810151616fe0820152616f60810151617000820152616f808101516170208201528160016040616fc084016080616fc0860160065afa14169150610bc0810151617040820152610be0810151617060820152615420810151617080820152816001604061704084016060617040860160075afa14169150616fc08101516170a0820152616fe08101516170c08201526170408101516170e082015261706081015161710082015281600160406170a0840160806170a0860160065afa141691506170a08101516171208201526170c08101516171408201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26171608201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171808201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171a08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6171c0820152610bc08101516171e0820152610be08101516172008201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6172208201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6172408201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456172608201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61728082015281600160206171208401610180617120860160085afa61712093909301516001149214161691505092915050565b604051806172800160405280610394906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561548057615480615441565b604052919050565b600082601f83011261549957600080fd5b813567ffffffffffffffff8111156154b3576154b3615441565b6154c6601f8201601f1916602001615457565b8181528460208386010111156154db57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561550b57600080fd5b823567ffffffffffffffff8082111561552357600080fd5b818501915085601f83011261553757600080fd5b813560208282111561554b5761554b615441565b8160051b61555a828201615457565b928352848101820192828101908a85111561557457600080fd5b958301955b8487101561559257863582529583019590830190615579565b97505050860135925050808211156155a957600080fd5b506155b685828601615488565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220433d439b616c9b0984aa273d65d03bbc910a575c3fc62a9c5097577b1baffcd564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/SolvencyVerifier.json b/backend/src/contracts/abi/SolvencyVerifier.json deleted file mode 100644 index 8d5d66bf..00000000 --- a/backend/src/contracts/abi/SolvencyVerifier.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SolvencyVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615012806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed4565b610057565b604051901515815260200160405180910390f35b60006001610063614dfd565b600080516020614fbd8339815191526100d9565b600080516020614f9d8339815191528083108183101690838009600080516020614f9d833981519152838409600080516020614f9d8339815191528482099050600080516020614f9d8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527eae99b137916ff4220b0da7179a4601301c82346fc665cd3369a54e1f02d4ea6000830152602085015180608084015260408601518060a0850152846101438284610077565b169450505060608501518060c084015260808601518060e0850152846101698284610077565b169450505060a08501518061010084015260c086015180610120850152846101918284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101df8284610077565b1694505050610120850151806101e084015261014086015180610200850152846102098284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027c8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a68284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d08284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fa8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034a8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103748284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039e8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c88284610077565b16945050506103608501518061054084015261038086015180610560850152846103f28284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae084018190528461065f8284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106ae8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbd8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbd8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbd83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a6696155208301527f019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f6156008301527f18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b86156e08301527f05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d86157c08301527f03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef6157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f24026158a08301527f13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f66158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba56159808301527f03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf615a608301527f28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3615b408301527f0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e615c208301527f09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58615d008301527f0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9615de08301527f13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974615ec08301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103615fa08301527f23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af76160808301527f060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b7306160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6169608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6169808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456169a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5c57614e5c614e1d565b604052919050565b600082601f830112614e7557600080fd5b813567ffffffffffffffff811115614e8f57614e8f614e1d565b614ea2601f8201601f1916602001614e33565b818152846020838601011115614eb757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee757600080fd5b823567ffffffffffffffff80821115614eff57600080fd5b818501915085601f830112614f1357600080fd5b8135602082821115614f2757614f27614e1d565b8160051b614f36828201614e33565b928352848101820192828101908a851115614f5057600080fd5b958301955b84871015614f6e57863582529583019590830190614f55565b9750505086013592505080821115614f8557600080fd5b50614f9285828601614e64565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220d4b2dc8798bab17b65a2e72c3cd13b07b4a58aae366a77784852333c75aa78b964736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed4565b610057565b604051901515815260200160405180910390f35b60006001610063614dfd565b600080516020614fbd8339815191526100d9565b600080516020614f9d8339815191528083108183101690838009600080516020614f9d833981519152838409600080516020614f9d8339815191528482099050600080516020614f9d8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527eae99b137916ff4220b0da7179a4601301c82346fc665cd3369a54e1f02d4ea6000830152602085015180608084015260408601518060a0850152846101438284610077565b169450505060608501518060c084015260808601518060e0850152846101698284610077565b169450505060a08501518061010084015260c086015180610120850152846101918284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101df8284610077565b1694505050610120850151806101e084015261014086015180610200850152846102098284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027c8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a68284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d08284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fa8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034a8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103748284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039e8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c88284610077565b16945050506103608501518061054084015261038086015180610560850152846103f28284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae084018190528461065f8284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106ae8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbd8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbd8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbd83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a6696155208301527f019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f6156008301527f18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b86156e08301527f05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d86157c08301527f03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef6157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f24026158a08301527f13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f66158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba56159808301527f03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf615a608301527f28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3615b408301527f0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e615c208301527f09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58615d008301527f0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9615de08301527f13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974615ec08301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103615fa08301527f23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af76160808301527f060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b7306160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6169608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6169808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456169a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5c57614e5c614e1d565b604052919050565b600082601f830112614e7557600080fd5b813567ffffffffffffffff811115614e8f57614e8f614e1d565b614ea2601f8201601f1916602001614e33565b818152846020838601011115614eb757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee757600080fd5b823567ffffffffffffffff80821115614eff57600080fd5b818501915085601f830112614f1357600080fd5b8135602082821115614f2757614f27614e1d565b8160051b614f36828201614e33565b928352848101820192828101908a851115614f5057600080fd5b958301955b84871015614f6e57863582529583019590830190614f55565b9750505086013592505080821115614f8557600080fd5b50614f9285828601614e64565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220d4b2dc8798bab17b65a2e72c3cd13b07b4a58aae366a77784852333c75aa78b964736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} diff --git a/backend/src/contracts/abi/Summa.json b/backend/src/contracts/abi/Summa.json index fd7e3ec0..224b5e3f 100644 --- a/backend/src/contracts/abi/Summa.json +++ b/backend/src/contracts/abi/Summa.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"contract IVerifier","name":"_solvencyVerifier","type":"address"},{"internalType":"contract IVerifier","name":"_inclusionVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"}],"name":"SolvencyProofSubmitted","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mstRoots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ownershipProofByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitProofOfSolvency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"}],"name":"verifySolvencyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60c06040523480156200001157600080fd5b50604051620016f3380380620016f38339810160408190526200003491620000c4565b6200003f3362000057565b6001600160a01b039182166080521660a052620000fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000bf57600080fd5b919050565b60008060408385031215620000d857600080fd5b620000e383620000a7565b9150620000f360208401620000a7565b90509250929050565b60805160a0516115d1620001226000396000610a850152600061045e01526115d16000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610136578063a3c4bcf814610151578063c7ddca0e14610174578063c8e5814714610187578063f2fde38b1461019a57600080fd5b806323eb94a0146100a3578063413a9f2d146100d65780636c7684fe146100eb578063715018a61461010e5780637f3bfb2e14610116575b600080fd5b6100c36100b1366004610c28565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100e96100e4366004610d68565b6101ad565b005b6100fe6100f9366004610f22565b610444565b60405190151581526020016100cd565b6100e96104df565b6100c3610124366004610c28565b60036020526000908152604090205481565b6000546040516001600160a01b0390911681526020016100cd565b61016461015f366004610c28565b6104f3565b6040516100cd9493929190610fcc565b6100e9610182366004611024565b610753565b6100fe61019536600461117e565b6109fd565b6100e96101a83660046111eb565b610b05565b6101b5610b7e565b60015460000361022b5760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b60008351600161023b9190611231565b67ffffffffffffffff81111561025357610253610c41565b60405190808252806020026020018201604052801561027c578160200160208202803683370190505b509050848160008151811061029357610293611244565b60200260200101818152505060005b845181101561038e578481815181106102bd576102bd611244565b602002602001015160200151516000141580156102f957508481815181106102e7576102e7611244565b60200260200101516000015151600014155b6103355760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b6044820152606401610222565b84818151811061034757610347611244565b602002602001015160400151828260016103619190611231565b8151811061037157610371611244565b6020908102919091010152806103868161125a565b9150506102a2565b506103998382610444565b6103d85760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b6044820152606401610222565b6000828152600360205260408120869055815183917f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff59184919061041e5761041e611244565b602002602001015186604051610435929190611273565b60405180910390a25050505050565b604051630bd205a960e41b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610495908590879060040161130a565b602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611361565b90505b92915050565b6104e7610b7e565b6104f16000610bd8565b565b6001818154811061050357600080fd5b906000526020600020906004020160009150905080600001805461052690611383565b80601f016020809104026020016040519081016040528092919081815260200182805461055290611383565b801561059f5780601f106105745761010080835404028352916020019161059f565b820191906000526020600020905b81548152906001019060200180831161058257829003601f168201915b5050505050908060010180546105b490611383565b80601f01602080910402602001604051908101604052809291908181526020018280546105e090611383565b801561062d5780601f106106025761010080835404028352916020019161062d565b820191906000526020600020905b81548152906001019060200180831161061057829003601f168201915b50505050509080600201805461064290611383565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90611383565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050908060030180546106d090611383565b80601f01602080910402602001604051908101604052809291908181526020018280546106fc90611383565b80156107495780601f1061071e57610100808354040283529160200191610749565b820191906000526020600020905b81548152906001019060200180831161072c57829003601f168201915b5050505050905084565b61075b610b7e565b60005b81518110156109c257600082828151811061077b5761077b611244565b60200260200101516000015160405160200161079791906113bd565b60408051601f19818403018152918152815160209283012060008181526002909352912054909150801561080d5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610222565b610818836001611231565b600083815260026020526040902055835160019085908590811061083e5761083e611244565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610870908261141f565b5060208201516001820190610885908261141f565b506040820151600282019061089a908261141f565b50606082015160038201906108af908261141f565b5050508383815181106108c4576108c4611244565b6020026020010151600001515160001415801561090057508383815181106108ee576108ee611244565b60200260200101516020015151600014155b801561092b575083838151811061091957610919611244565b60200260200101516040015151600014155b8015610956575083838151811061094457610944611244565b60200260200101516060015151600014155b6109ad5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610222565b505080806109ba9061125a565b91505061075e565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516109f291906114df565b60405180910390a150565b600082600181518110610a1257610a12611244565b6020026020010151600360008481526020019081526020016000205414610a6e5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610222565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610abc908690889060040161130a565b602060405180830381865afa158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd9190611361565b949350505050565b610b0d610b7e565b6001600160a01b038116610b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610222565b610b7b81610bd8565b50565b6000546001600160a01b031633146104f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c3a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b604051601f8201601f1916810167ffffffffffffffff81118282101715610ccc57610ccc610c41565b604052919050565b600067ffffffffffffffff821115610cee57610cee610c41565b5060051b60200190565b600082601f830112610d0957600080fd5b813567ffffffffffffffff811115610d2357610d23610c41565b610d36601f8201601f1916602001610ca3565b818152846020838601011115610d4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610d7e57600080fd5b84359350602085013567ffffffffffffffff80821115610d9d57600080fd5b818701915087601f830112610db157600080fd5b610dc3610dbe8335610cd4565b610ca3565b82358082526020808301929160051b8501018a811115610de257600080fd5b602085015b81811015610e84578481351115610dfd57600080fd5b803586016060818e03601f19011215610e1557600080fd5b610e1d610c57565b602082013587811115610e2f57600080fd5b610e3e8f602083860101610cf8565b825250604082013587811115610e5357600080fd5b610e628f602083860101610cf8565b6020838101919091526060939093013560408301525085529384019301610de7565b5090965050506040870135915080821115610e9e57600080fd5b50610eab87828801610cf8565b949793965093946060013593505050565b600082601f830112610ecd57600080fd5b81356020610edd610dbe83610cd4565b82815260059290921b84018101918181019086841115610efc57600080fd5b8286015b84811015610f175780358352918301918301610f00565b509695505050505050565b60008060408385031215610f3557600080fd5b823567ffffffffffffffff80821115610f4d57600080fd5b610f5986838701610cf8565b93506020850135915080821115610f6f57600080fd5b50610f7c85828601610ebc565b9150509250929050565b6000815180845260005b81811015610fac57602081850181015186830182015201610f90565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610fdf6080830187610f86565b8281036020840152610ff18187610f86565b905082810360408401526110058186610f86565b905082810360608401526110198185610f86565b979650505050505050565b6000602080838503121561103757600080fd5b823567ffffffffffffffff8082111561104f57600080fd5b818501915085601f83011261106357600080fd5b8135611071610dbe82610cd4565b81815260059190911b8301840190848101908883111561109057600080fd5b8585015b83811015611171578035858111156110ab57600080fd5b86016080818c03601f190112156110c25760008081fd5b6110ca610c80565b88820135878111156110dc5760008081fd5b6110ea8d8b83860101610cf8565b825250604080830135888111156111015760008081fd5b61110f8e8c83870101610cf8565b8b84015250606080840135898111156111285760008081fd5b6111368f8d83880101610cf8565b838501525060808401359150888211156111505760008081fd5b61115e8e8c84870101610cf8565b9083015250845250918601918601611094565b5098975050505050505050565b60008060006060848603121561119357600080fd5b833567ffffffffffffffff808211156111ab57600080fd5b6111b787838801610cf8565b945060208601359150808211156111cd57600080fd5b506111da86828701610ebc565b925050604084013590509250925092565b6000602082840312156111fd57600080fd5b81356001600160a01b038116811461121457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104d9576104d961121b565b634e487b7160e01b600052603260045260246000fd5b60006001820161126c5761126c61121b565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b838110156112fa57898303605f19018552815180518885526112c589860182610f86565b905087820151858203898701526112dc8282610f86565b928b0151958b019590955250948601949250908501906001016112a1565b50909a9950505050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561134357815184529284019290840190600101611327565b505050838103828501526113578186610f86565b9695505050505050565b60006020828403121561137357600080fd5b8151801515811461121457600080fd5b600181811c9082168061139757607f821691505b6020821081036113b757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006104d66020830184610f86565b601f82111561141a57600081815260208120601f850160051c810160208610156113f75750805b601f850160051c820191505b8181101561141657828155600101611403565b5050505b505050565b815167ffffffffffffffff81111561143957611439610c41565b61144d816114478454611383565b846113d0565b602080601f831160018114611482576000841561146a5750858301515b600019600386901b1c1916600185901b178555611416565b600085815260208120601f198616915b828110156114b157888601518255948401946001909101908401611492565b50858210156114cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561158d57603f1989840301855281516080815181865261152c82870182610f86565b915050888201518582038a8701526115448282610f86565b915050878201518582038987015261155c8282610f86565b915050606080830151925085820381870152506115798183610f86565b968901969450505090860190600101611506565b50909897505050505050505056fea2646970667358221220f32f840eddc80cec82eb8f05c34e311f2c0922da70b900e8971882d940e5044964736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610136578063a3c4bcf814610151578063c7ddca0e14610174578063c8e5814714610187578063f2fde38b1461019a57600080fd5b806323eb94a0146100a3578063413a9f2d146100d65780636c7684fe146100eb578063715018a61461010e5780637f3bfb2e14610116575b600080fd5b6100c36100b1366004610c28565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100e96100e4366004610d68565b6101ad565b005b6100fe6100f9366004610f22565b610444565b60405190151581526020016100cd565b6100e96104df565b6100c3610124366004610c28565b60036020526000908152604090205481565b6000546040516001600160a01b0390911681526020016100cd565b61016461015f366004610c28565b6104f3565b6040516100cd9493929190610fcc565b6100e9610182366004611024565b610753565b6100fe61019536600461117e565b6109fd565b6100e96101a83660046111eb565b610b05565b6101b5610b7e565b60015460000361022b5760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b60008351600161023b9190611231565b67ffffffffffffffff81111561025357610253610c41565b60405190808252806020026020018201604052801561027c578160200160208202803683370190505b509050848160008151811061029357610293611244565b60200260200101818152505060005b845181101561038e578481815181106102bd576102bd611244565b602002602001015160200151516000141580156102f957508481815181106102e7576102e7611244565b60200260200101516000015151600014155b6103355760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b6044820152606401610222565b84818151811061034757610347611244565b602002602001015160400151828260016103619190611231565b8151811061037157610371611244565b6020908102919091010152806103868161125a565b9150506102a2565b506103998382610444565b6103d85760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b6044820152606401610222565b6000828152600360205260408120869055815183917f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff59184919061041e5761041e611244565b602002602001015186604051610435929190611273565b60405180910390a25050505050565b604051630bd205a960e41b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610495908590879060040161130a565b602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611361565b90505b92915050565b6104e7610b7e565b6104f16000610bd8565b565b6001818154811061050357600080fd5b906000526020600020906004020160009150905080600001805461052690611383565b80601f016020809104026020016040519081016040528092919081815260200182805461055290611383565b801561059f5780601f106105745761010080835404028352916020019161059f565b820191906000526020600020905b81548152906001019060200180831161058257829003601f168201915b5050505050908060010180546105b490611383565b80601f01602080910402602001604051908101604052809291908181526020018280546105e090611383565b801561062d5780601f106106025761010080835404028352916020019161062d565b820191906000526020600020905b81548152906001019060200180831161061057829003601f168201915b50505050509080600201805461064290611383565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90611383565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050908060030180546106d090611383565b80601f01602080910402602001604051908101604052809291908181526020018280546106fc90611383565b80156107495780601f1061071e57610100808354040283529160200191610749565b820191906000526020600020905b81548152906001019060200180831161072c57829003601f168201915b5050505050905084565b61075b610b7e565b60005b81518110156109c257600082828151811061077b5761077b611244565b60200260200101516000015160405160200161079791906113bd565b60408051601f19818403018152918152815160209283012060008181526002909352912054909150801561080d5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610222565b610818836001611231565b600083815260026020526040902055835160019085908590811061083e5761083e611244565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610870908261141f565b5060208201516001820190610885908261141f565b506040820151600282019061089a908261141f565b50606082015160038201906108af908261141f565b5050508383815181106108c4576108c4611244565b6020026020010151600001515160001415801561090057508383815181106108ee576108ee611244565b60200260200101516020015151600014155b801561092b575083838151811061091957610919611244565b60200260200101516040015151600014155b8015610956575083838151811061094457610944611244565b60200260200101516060015151600014155b6109ad5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610222565b505080806109ba9061125a565b91505061075e565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516109f291906114df565b60405180910390a150565b600082600181518110610a1257610a12611244565b6020026020010151600360008481526020019081526020016000205414610a6e5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610222565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610abc908690889060040161130a565b602060405180830381865afa158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd9190611361565b949350505050565b610b0d610b7e565b6001600160a01b038116610b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610222565b610b7b81610bd8565b50565b6000546001600160a01b031633146104f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c3a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b604051601f8201601f1916810167ffffffffffffffff81118282101715610ccc57610ccc610c41565b604052919050565b600067ffffffffffffffff821115610cee57610cee610c41565b5060051b60200190565b600082601f830112610d0957600080fd5b813567ffffffffffffffff811115610d2357610d23610c41565b610d36601f8201601f1916602001610ca3565b818152846020838601011115610d4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610d7e57600080fd5b84359350602085013567ffffffffffffffff80821115610d9d57600080fd5b818701915087601f830112610db157600080fd5b610dc3610dbe8335610cd4565b610ca3565b82358082526020808301929160051b8501018a811115610de257600080fd5b602085015b81811015610e84578481351115610dfd57600080fd5b803586016060818e03601f19011215610e1557600080fd5b610e1d610c57565b602082013587811115610e2f57600080fd5b610e3e8f602083860101610cf8565b825250604082013587811115610e5357600080fd5b610e628f602083860101610cf8565b6020838101919091526060939093013560408301525085529384019301610de7565b5090965050506040870135915080821115610e9e57600080fd5b50610eab87828801610cf8565b949793965093946060013593505050565b600082601f830112610ecd57600080fd5b81356020610edd610dbe83610cd4565b82815260059290921b84018101918181019086841115610efc57600080fd5b8286015b84811015610f175780358352918301918301610f00565b509695505050505050565b60008060408385031215610f3557600080fd5b823567ffffffffffffffff80821115610f4d57600080fd5b610f5986838701610cf8565b93506020850135915080821115610f6f57600080fd5b50610f7c85828601610ebc565b9150509250929050565b6000815180845260005b81811015610fac57602081850181015186830182015201610f90565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610fdf6080830187610f86565b8281036020840152610ff18187610f86565b905082810360408401526110058186610f86565b905082810360608401526110198185610f86565b979650505050505050565b6000602080838503121561103757600080fd5b823567ffffffffffffffff8082111561104f57600080fd5b818501915085601f83011261106357600080fd5b8135611071610dbe82610cd4565b81815260059190911b8301840190848101908883111561109057600080fd5b8585015b83811015611171578035858111156110ab57600080fd5b86016080818c03601f190112156110c25760008081fd5b6110ca610c80565b88820135878111156110dc5760008081fd5b6110ea8d8b83860101610cf8565b825250604080830135888111156111015760008081fd5b61110f8e8c83870101610cf8565b8b84015250606080840135898111156111285760008081fd5b6111368f8d83880101610cf8565b838501525060808401359150888211156111505760008081fd5b61115e8e8c84870101610cf8565b9083015250845250918601918601611094565b5098975050505050505050565b60008060006060848603121561119357600080fd5b833567ffffffffffffffff808211156111ab57600080fd5b6111b787838801610cf8565b945060208601359150808211156111cd57600080fd5b506111da86828701610ebc565b925050604084013590509250925092565b6000602082840312156111fd57600080fd5b81356001600160a01b038116811461121457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104d9576104d961121b565b634e487b7160e01b600052603260045260246000fd5b60006001820161126c5761126c61121b565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b838110156112fa57898303605f19018552815180518885526112c589860182610f86565b905087820151858203898701526112dc8282610f86565b928b0151958b019590955250948601949250908501906001016112a1565b50909a9950505050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561134357815184529284019290840190600101611327565b505050838103828501526113578186610f86565b9695505050505050565b60006020828403121561137357600080fd5b8151801515811461121457600080fd5b600181811c9082168061139757607f821691505b6020821081036113b757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006104d66020830184610f86565b601f82111561141a57600081815260208120601f850160051c810160208610156113f75750805b601f850160051c820191505b8181101561141657828155600101611403565b5050505b505050565b815167ffffffffffffffff81111561143957611439610c41565b61144d816114478454611383565b846113d0565b602080601f831160018114611482576000841561146a5750858301515b600019600386901b1c1916600185901b178555611416565b600085815260208120601f198616915b828110156114b157888601518255948401946001909101908401611492565b50858210156114cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561158d57603f1989840301855281516080815181865261152c82870182610f86565b915050888201518582038a8701526115448282610f86565b915050878201518582038987015261155c8282610f86565b915050606080830151925085820381870152506115798183610f86565b968901969450505090860190600101611506565b50909897505050505050505056fea2646970667358221220f32f840eddc80cec82eb8f05c34e311f2c0922da70b900e8971882d940e5044964736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"contract IVerifier","name":"_inclusionVerifier","type":"address"},{"internalType":"uint16","name":"mstLevels","type":"uint16"},{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mstRoot","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"rootBalances","type":"uint256[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"indexed":false,"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint16","name":"mstLevels","type":"uint16"},{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"},{"internalType":"uint256[]","name":"rootBalances","type":"uint256[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60a06040523480156200001157600080fd5b5060405162001cf938038062001cf9833981016040819052620000349162000110565b6200003f33620000a8565b6001600160a01b03939093166080526040805160608101825261ffff938416808252929093166020840181905260ff90941692018290526001805463ffffffff1916909117620100009093029290921760ff60201b191664010000000090910217905562000181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805161ffff811681146200010b57600080fd5b919050565b600080600080608085870312156200012757600080fd5b84516001600160a01b03811681146200013f57600080fd5b93506200014f60208601620000f8565b92506200015f60408601620000f8565b9150606085015160ff811681146200017657600080fd5b939692955090935050565b608051611b5c6200019d6000396000610b5b0152611b5c6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a3c4bcf811610066578063a3c4bcf814610169578063c7ddca0e1461018c578063c8e581471461019f578063da64a750146101c2578063f2fde38b146101d557600080fd5b806319b33968146100a357806349ce8997146100cc578063715018a6146100fa57806379502c55146101045780638da5cb5b1461014e575b600080fd5b6100b66100b13660046111d3565b6101e8565b6040516100c391906112a7565b60405180910390f35b6100ec6100da3660046111d3565b60046020526000908152604090205481565b6040519081526020016100c3565b610102610500565b005b60015461012a9061ffff8082169162010000810490911690640100000000900460ff1683565b6040805161ffff948516815293909216602084015260ff16908201526060016100c3565b6000546040516001600160a01b0390911681526020016100c3565b61017c6101773660046111d3565b610514565b6040516100c394939291906112c1565b61010261019a366004611440565b610774565b6101b26101ad366004611605565b610a15565b60405190151581526020016100c3565b6101026101d0366004611672565b610bdb565b6101026101e33660046117b9565b610fa7565b6102136040518060800160405280606081526020016060815260200160608152602001606081525090565b60008281526003602052604090205461026a5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b600082815260036020526040902054600290610288906001906117f8565b8154811061029857610298611811565b90600052602060002090600402016040518060800160405290816000820180546102c190611827565b80601f01602080910402602001604051908101604052809291908181526020018280546102ed90611827565b801561033a5780601f1061030f5761010080835404028352916020019161033a565b820191906000526020600020905b81548152906001019060200180831161031d57829003601f168201915b5050505050815260200160018201805461035390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611827565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b505050505081526020016002820180546103e590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611827565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b5050505050815260200160038201805461047790611827565b80601f01602080910402602001604051908101604052809291908181526020018280546104a390611827565b80156104f05780601f106104c5576101008083540402835291602001916104f0565b820191906000526020600020905b8154815290600101906020018083116104d357829003601f168201915b5050505050815250509050919050565b610508611020565b610512600061107a565b565b6002818154811061052457600080fd5b906000526020600020906004020160009150905080600001805461054790611827565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611827565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050908060010180546105d590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461060190611827565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050509080600201805461066390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90611827565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050908060030180546106f190611827565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90611827565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905084565b61077c611020565b60005b81518110156109da57600082828151811061079c5761079c611811565b6020026020010151600001516040516020016107b89190611861565b60408051601f19818403018152918152815160209283012060008181526003909352912054909150801561082e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610261565b600284848151811061084257610842611811565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061087490826118cc565b506020820151600182019061088990826118cc565b506040820151600282019061089e90826118cc565b50606082015160038201906108b390826118cc565b50506002546000848152600360205260409020555083518490849081106108dc576108dc611811565b60200260200101516000015151600014158015610918575083838151811061090657610906611811565b60200260200101516020015151600014155b8015610943575083838151811061093157610931611811565b60200260200101516040015151600014155b801561096e575083838151811061095c5761095c611811565b60200260200101516060015151600014155b6109c55760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610261565b505080806109d29061198c565b91505061077f565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610a0a91906119a5565b60405180910390a150565b600082600181518110610a2a57610a2a611811565b6020026020010151600460008481526020019081526020016000206000015414610a895760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b60025b8351811015610b4357838181518110610aa757610aa7611811565b602002602001015160046000858152602001908152602001600020600101600283610ad291906117f8565b81548110610ae257610ae2611811565b906000526020600020015414610b315760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420726f6f742062616c616e636560601b6044820152606401610261565b80610b3b8161198c565b915050610a8c565b50604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610b929086908890600401611a42565b602060405180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190611a67565b949350505050565b610be3611020565b83600003610c265760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b8151835114610c955760405162461bcd60e51b815260206004820152603560248201527f526f6f74206c696162696c69746965732073756d7320616e64206c696162696c6044820152740d2e8d2cae640dceadac4cae440dad2e6dac2e8c6d605b1b6064820152608401610261565b6000825167ffffffffffffffff811115610cb157610cb1611319565b604051908082528060200260200182016040528015610ce457816020015b6060815260200190600190039081610ccf5790505b5090506000835167ffffffffffffffff811115610d0357610d03611319565b604051908082528060200260200182016040528015610d3657816020015b6060815260200190600190039081610d215790505b50905060005b8451811015610edc57848181518110610d5757610d57611811565b60200260200101516020015151600014158015610d935750848181518110610d8157610d81611811565b60200260200101516000015151600014155b610dd85760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b6044820152606401610261565b858181518110610dea57610dea611811565b6020026020010151600003610e535760405162461bcd60e51b815260206004820152602960248201527f416c6c20726f6f742073756d732073686f756c642062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610261565b848181518110610e6557610e65611811565b602002602001015160000151838281518110610e8357610e83611811565b6020026020010181905250848181518110610ea057610ea0611811565b602002602001015160200151828281518110610ebe57610ebe611811565b60200260200101819052508080610ed49061198c565b915050610d3c565b5060408051608081018252878152602080820188815282840186905260608301859052600087815260048352939093208251815592518051929392610f2792600185019201906110ca565b5060408201518051610f43916002840191602090910190611115565b5060608201518051610f5f916003840191602090910190611115565b50905050827f88bfc7389cb831ea0208ff106da6f5c9f88036ba084f1eb008d2788d3d45998d878787604051610f9793929190611a89565b60405180910390a2505050505050565b610faf611020565b6001600160a01b0381166110145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610261565b61101d8161107a565b50565b6000546001600160a01b031633146105125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610261565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215611105579160200282015b828111156111055782518255916020019190600101906110ea565b50611111929150611167565b5090565b82805482825590600052602060002090810192821561115b579160200282015b8281111561115b578251829061114b90826118cc565b5091602001919060010190611135565b5061111192915061117c565b5b808211156111115760008155600101611168565b808211156111115760006111908282611199565b5060010161117c565b5080546111a590611827565b6000825580601f106111b5575050565b601f01602090049060005260206000209081019061101d9190611167565b6000602082840312156111e557600080fd5b5035919050565b60005b838110156112075781810151838201526020016111ef565b50506000910152565b600081518084526112288160208601602086016111ec565b601f01601f19169290920160200192915050565b60008151608084526112516080850182611210565b90506020830151848203602086015261126a8282611210565b915050604083015184820360408601526112848282611210565b9150506060830151848203606086015261129e8282611210565b95945050505050565b6020815260006112ba602083018461123c565b9392505050565b6080815260006112d46080830187611210565b82810360208401526112e68187611210565b905082810360408401526112fa8186611210565b9050828103606084015261130e8185611210565b979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561135257611352611319565b60405290565b6040805190810167ffffffffffffffff8111828210171561135257611352611319565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a4576113a4611319565b604052919050565b600067ffffffffffffffff8211156113c6576113c6611319565b5060051b60200190565b600082601f8301126113e157600080fd5b813567ffffffffffffffff8111156113fb576113fb611319565b61140e601f8201601f191660200161137b565b81815284602083860101111561142357600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561145357600080fd5b823567ffffffffffffffff8082111561146b57600080fd5b818501915085601f83011261147f57600080fd5b813561149261148d826113ac565b61137b565b81815260059190911b830184019084810190888311156114b157600080fd5b8585015b83811015611592578035858111156114cc57600080fd5b86016080818c03601f190112156114e35760008081fd5b6114eb61132f565b88820135878111156114fd5760008081fd5b61150b8d8b838601016113d0565b825250604080830135888111156115225760008081fd5b6115308e8c838701016113d0565b8b84015250606080840135898111156115495760008081fd5b6115578f8d838801016113d0565b838501525060808401359150888211156115715760008081fd5b61157f8e8c848701016113d0565b90830152508452509186019186016114b5565b5098975050505050505050565b600082601f8301126115b057600080fd5b813560206115c061148d836113ac565b82815260059290921b840181019181810190868411156115df57600080fd5b8286015b848110156115fa57803583529183019183016115e3565b509695505050505050565b60008060006060848603121561161a57600080fd5b833567ffffffffffffffff8082111561163257600080fd5b61163e878388016113d0565b9450602086013591508082111561165457600080fd5b506116618682870161159f565b925050604084013590509250925092565b6000806000806080858703121561168857600080fd5b84359350602085013567ffffffffffffffff808211156116a757600080fd5b6116b38883890161159f565b945060408701359150808211156116c957600080fd5b818701915087601f8301126116dd57600080fd5b6116ea61148d83356113ac565b82358082526020808301929160051b8501018a81111561170957600080fd5b602085015b818110156117a557848135111561172457600080fd5b803586016040818e03601f1901121561173c57600080fd5b611744611358565b60208201358781111561175657600080fd5b6117658f6020838601016113d0565b82525060408201358781111561177a57600080fd5b6117898f6020838601016113d0565b602083015250808652505060208401935060208101905061170e565b50979a969950976060013596505050505050565b6000602082840312156117cb57600080fd5b81356001600160a01b03811681146112ba57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561180b5761180b6117e2565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061183b57607f821691505b60208210810361185b57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516118738184602087016111ec565b9190910192915050565b601f8211156118c757600081815260208120601f850160051c810160208610156118a45750805b601f850160051c820191505b818110156118c3578281556001016118b0565b5050505b505050565b815167ffffffffffffffff8111156118e6576118e6611319565b6118fa816118f48454611827565b8461187d565b602080601f83116001811461192f57600084156119175750858301515b600019600386901b1c1916600185901b1785556118c3565b600085815260208120601f198616915b8281101561195e5788860151825594840194600190910190840161193f565b508582101561197c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161199e5761199e6117e2565b5060010190565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156119fa57603f198886030184526119e885835161123c565b945092850192908501906001016119cc565b5092979650505050505050565b600081518084526020808501945080840160005b83811015611a3757815187529582019590820190600101611a1b565b509495945050505050565b604081526000611a556040830185611a07565b828103602084015261129e8185611210565b600060208284031215611a7957600080fd5b815180151581146112ba57600080fd5b83815260006020606081840152611aa36060840186611a07565b6040848203818601528186518084528484019150848160051b85010185890160005b83811015611b1557868303601f1901855281518051878552611ae988860182611210565b918a0151858303868c0152919050611b018183611210565b968a01969450505090870190600101611ac5565b50909b9a505050505050505050505056fea264697066735822122045d9336f0b6314796496c7a1cf160c19b42a61943a90fb5bbe2cfcef107bb5db64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a3c4bcf811610066578063a3c4bcf814610169578063c7ddca0e1461018c578063c8e581471461019f578063da64a750146101c2578063f2fde38b146101d557600080fd5b806319b33968146100a357806349ce8997146100cc578063715018a6146100fa57806379502c55146101045780638da5cb5b1461014e575b600080fd5b6100b66100b13660046111d3565b6101e8565b6040516100c391906112a7565b60405180910390f35b6100ec6100da3660046111d3565b60046020526000908152604090205481565b6040519081526020016100c3565b610102610500565b005b60015461012a9061ffff8082169162010000810490911690640100000000900460ff1683565b6040805161ffff948516815293909216602084015260ff16908201526060016100c3565b6000546040516001600160a01b0390911681526020016100c3565b61017c6101773660046111d3565b610514565b6040516100c394939291906112c1565b61010261019a366004611440565b610774565b6101b26101ad366004611605565b610a15565b60405190151581526020016100c3565b6101026101d0366004611672565b610bdb565b6101026101e33660046117b9565b610fa7565b6102136040518060800160405280606081526020016060815260200160608152602001606081525090565b60008281526003602052604090205461026a5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b600082815260036020526040902054600290610288906001906117f8565b8154811061029857610298611811565b90600052602060002090600402016040518060800160405290816000820180546102c190611827565b80601f01602080910402602001604051908101604052809291908181526020018280546102ed90611827565b801561033a5780601f1061030f5761010080835404028352916020019161033a565b820191906000526020600020905b81548152906001019060200180831161031d57829003601f168201915b5050505050815260200160018201805461035390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611827565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b505050505081526020016002820180546103e590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611827565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b5050505050815260200160038201805461047790611827565b80601f01602080910402602001604051908101604052809291908181526020018280546104a390611827565b80156104f05780601f106104c5576101008083540402835291602001916104f0565b820191906000526020600020905b8154815290600101906020018083116104d357829003601f168201915b5050505050815250509050919050565b610508611020565b610512600061107a565b565b6002818154811061052457600080fd5b906000526020600020906004020160009150905080600001805461054790611827565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611827565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050908060010180546105d590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461060190611827565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050509080600201805461066390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90611827565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050908060030180546106f190611827565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90611827565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905084565b61077c611020565b60005b81518110156109da57600082828151811061079c5761079c611811565b6020026020010151600001516040516020016107b89190611861565b60408051601f19818403018152918152815160209283012060008181526003909352912054909150801561082e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610261565b600284848151811061084257610842611811565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061087490826118cc565b506020820151600182019061088990826118cc565b506040820151600282019061089e90826118cc565b50606082015160038201906108b390826118cc565b50506002546000848152600360205260409020555083518490849081106108dc576108dc611811565b60200260200101516000015151600014158015610918575083838151811061090657610906611811565b60200260200101516020015151600014155b8015610943575083838151811061093157610931611811565b60200260200101516040015151600014155b801561096e575083838151811061095c5761095c611811565b60200260200101516060015151600014155b6109c55760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610261565b505080806109d29061198c565b91505061077f565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610a0a91906119a5565b60405180910390a150565b600082600181518110610a2a57610a2a611811565b6020026020010151600460008481526020019081526020016000206000015414610a895760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b60025b8351811015610b4357838181518110610aa757610aa7611811565b602002602001015160046000858152602001908152602001600020600101600283610ad291906117f8565b81548110610ae257610ae2611811565b906000526020600020015414610b315760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420726f6f742062616c616e636560601b6044820152606401610261565b80610b3b8161198c565b915050610a8c565b50604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610b929086908890600401611a42565b602060405180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190611a67565b949350505050565b610be3611020565b83600003610c265760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b8151835114610c955760405162461bcd60e51b815260206004820152603560248201527f526f6f74206c696162696c69746965732073756d7320616e64206c696162696c6044820152740d2e8d2cae640dceadac4cae440dad2e6dac2e8c6d605b1b6064820152608401610261565b6000825167ffffffffffffffff811115610cb157610cb1611319565b604051908082528060200260200182016040528015610ce457816020015b6060815260200190600190039081610ccf5790505b5090506000835167ffffffffffffffff811115610d0357610d03611319565b604051908082528060200260200182016040528015610d3657816020015b6060815260200190600190039081610d215790505b50905060005b8451811015610edc57848181518110610d5757610d57611811565b60200260200101516020015151600014158015610d935750848181518110610d8157610d81611811565b60200260200101516000015151600014155b610dd85760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b6044820152606401610261565b858181518110610dea57610dea611811565b6020026020010151600003610e535760405162461bcd60e51b815260206004820152602960248201527f416c6c20726f6f742073756d732073686f756c642062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610261565b848181518110610e6557610e65611811565b602002602001015160000151838281518110610e8357610e83611811565b6020026020010181905250848181518110610ea057610ea0611811565b602002602001015160200151828281518110610ebe57610ebe611811565b60200260200101819052508080610ed49061198c565b915050610d3c565b5060408051608081018252878152602080820188815282840186905260608301859052600087815260048352939093208251815592518051929392610f2792600185019201906110ca565b5060408201518051610f43916002840191602090910190611115565b5060608201518051610f5f916003840191602090910190611115565b50905050827f88bfc7389cb831ea0208ff106da6f5c9f88036ba084f1eb008d2788d3d45998d878787604051610f9793929190611a89565b60405180910390a2505050505050565b610faf611020565b6001600160a01b0381166110145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610261565b61101d8161107a565b50565b6000546001600160a01b031633146105125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610261565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215611105579160200282015b828111156111055782518255916020019190600101906110ea565b50611111929150611167565b5090565b82805482825590600052602060002090810192821561115b579160200282015b8281111561115b578251829061114b90826118cc565b5091602001919060010190611135565b5061111192915061117c565b5b808211156111115760008155600101611168565b808211156111115760006111908282611199565b5060010161117c565b5080546111a590611827565b6000825580601f106111b5575050565b601f01602090049060005260206000209081019061101d9190611167565b6000602082840312156111e557600080fd5b5035919050565b60005b838110156112075781810151838201526020016111ef565b50506000910152565b600081518084526112288160208601602086016111ec565b601f01601f19169290920160200192915050565b60008151608084526112516080850182611210565b90506020830151848203602086015261126a8282611210565b915050604083015184820360408601526112848282611210565b9150506060830151848203606086015261129e8282611210565b95945050505050565b6020815260006112ba602083018461123c565b9392505050565b6080815260006112d46080830187611210565b82810360208401526112e68187611210565b905082810360408401526112fa8186611210565b9050828103606084015261130e8185611210565b979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561135257611352611319565b60405290565b6040805190810167ffffffffffffffff8111828210171561135257611352611319565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a4576113a4611319565b604052919050565b600067ffffffffffffffff8211156113c6576113c6611319565b5060051b60200190565b600082601f8301126113e157600080fd5b813567ffffffffffffffff8111156113fb576113fb611319565b61140e601f8201601f191660200161137b565b81815284602083860101111561142357600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561145357600080fd5b823567ffffffffffffffff8082111561146b57600080fd5b818501915085601f83011261147f57600080fd5b813561149261148d826113ac565b61137b565b81815260059190911b830184019084810190888311156114b157600080fd5b8585015b83811015611592578035858111156114cc57600080fd5b86016080818c03601f190112156114e35760008081fd5b6114eb61132f565b88820135878111156114fd5760008081fd5b61150b8d8b838601016113d0565b825250604080830135888111156115225760008081fd5b6115308e8c838701016113d0565b8b84015250606080840135898111156115495760008081fd5b6115578f8d838801016113d0565b838501525060808401359150888211156115715760008081fd5b61157f8e8c848701016113d0565b90830152508452509186019186016114b5565b5098975050505050505050565b600082601f8301126115b057600080fd5b813560206115c061148d836113ac565b82815260059290921b840181019181810190868411156115df57600080fd5b8286015b848110156115fa57803583529183019183016115e3565b509695505050505050565b60008060006060848603121561161a57600080fd5b833567ffffffffffffffff8082111561163257600080fd5b61163e878388016113d0565b9450602086013591508082111561165457600080fd5b506116618682870161159f565b925050604084013590509250925092565b6000806000806080858703121561168857600080fd5b84359350602085013567ffffffffffffffff808211156116a757600080fd5b6116b38883890161159f565b945060408701359150808211156116c957600080fd5b818701915087601f8301126116dd57600080fd5b6116ea61148d83356113ac565b82358082526020808301929160051b8501018a81111561170957600080fd5b602085015b818110156117a557848135111561172457600080fd5b803586016040818e03601f1901121561173c57600080fd5b611744611358565b60208201358781111561175657600080fd5b6117658f6020838601016113d0565b82525060408201358781111561177a57600080fd5b6117898f6020838601016113d0565b602083015250808652505060208401935060208101905061170e565b50979a969950976060013596505050505050565b6000602082840312156117cb57600080fd5b81356001600160a01b03811681146112ba57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561180b5761180b6117e2565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061183b57607f821691505b60208210810361185b57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516118738184602087016111ec565b9190910192915050565b601f8211156118c757600081815260208120601f850160051c810160208610156118a45750805b601f850160051c820191505b818110156118c3578281556001016118b0565b5050505b505050565b815167ffffffffffffffff8111156118e6576118e6611319565b6118fa816118f48454611827565b8461187d565b602080601f83116001811461192f57600084156119175750858301515b600019600386901b1c1916600185901b1785556118c3565b600085815260208120601f198616915b8281101561195e5788860151825594840194600190910190840161193f565b508582101561197c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161199e5761199e6117e2565b5060010190565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156119fa57603f198886030184526119e885835161123c565b945092850192908501906001016119cc565b5092979650505050505050565b600081518084526020808501945080840160005b83811015611a3757815187529582019590820190600101611a1b565b509495945050505050565b604081526000611a556040830185611a07565b828103602084015261129e8185611210565b600060208284031215611a7957600080fd5b815180151581146112ba57600080fd5b83815260006020606081840152611aa36060840186611a07565b6040848203818601528186518084528484019150848160051b85010185890160005b83811015611b1557868303601f1901855281518051878552611ae988860182611210565b918a0151858303868c0152919050611b018183611210565b968a01969450505090870190600101611ac5565b50909b9a505050505050505050505056fea264697066735822122045d9336f0b6314796496c7a1cf160c19b42a61943a90fb5bbe2cfcef107bb5db64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/deployments.json b/backend/src/contracts/deployments.json index a945ae8f..6896ec0c 100644 --- a/backend/src/contracts/deployments.json +++ b/backend/src/contracts/deployments.json @@ -1 +1 @@ -{"31337":{"address":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9"}} +{"31337":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"}} \ No newline at end of file diff --git a/backend/src/contracts/generated/inclusion_verifier.rs b/backend/src/contracts/generated/inclusion_verifier.rs index 71ddc9f7..b2235df0 100644 --- a/backend/src/contracts/generated/inclusion_verifier.rs +++ b/backend/src/contracts/generated/inclusion_verifier.rs @@ -40,12 +40,13 @@ pub mod inclusion_verifier { 91, 80, 97, - 84, - 103, + 86, + 54, 128, - 97, + 98, 0, - 32, + 0, + 33, 96, 0, 57, @@ -112,8 +113,8 @@ pub mod inclusion_verifier { 96, 4, 97, - 83, - 41, + 84, + 248, 86, 91, 97, @@ -149,8 +150,8 @@ pub mod inclusion_verifier { 0, 99, 97, - 82, - 82, + 84, + 33, 86, 91, 96, @@ -160,8 +161,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -180,8 +181,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -206,8 +207,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -224,8 +225,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -244,8 +245,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -295,39 +296,63 @@ pub mod inclusion_verifier { 131, 1, 82, - 127, - 45, - 241, - 98, - 24, - 168, - 45, - 57, + 128, + 96, + 96, + 135, + 1, + 81, + 6, + 96, + 96, 131, - 16, - 113, - 228, - 105, - 86, - 194, - 51, - 238, - 154, - 167, - 155, - 176, - 101, - 178, - 101, + 1, + 82, + 128, + 96, + 128, 135, - 16, + 1, + 81, + 6, + 96, 128, - 216, - 100, - 63, - 47, + 131, + 1, 82, + 127, + 16, + 30, + 50, + 32, + 159, + 188, + 42, + 253, + 218, + 46, 171, + 8, + 238, + 211, + 227, + 233, + 50, + 62, + 205, + 146, + 229, + 198, + 185, + 80, + 130, + 4, + 185, + 72, + 222, + 26, + 229, + 243, 96, 0, 131, @@ -340,7 +365,7 @@ pub mod inclusion_verifier { 81, 128, 96, - 96, + 160, 132, 1, 82, @@ -351,14 +376,14 @@ pub mod inclusion_verifier { 81, 128, 96, - 128, + 192, 133, 1, 82, 132, 97, 1, - 56, + 80, 130, 132, 97, @@ -378,7 +403,7 @@ pub mod inclusion_verifier { 81, 128, 96, - 160, + 224, 132, 1, 82, @@ -388,15 +413,16 @@ pub mod inclusion_verifier { 1, 81, 128, - 96, - 192, + 97, + 1, + 0, 133, 1, 82, 132, 97, 1, - 94, + 119, 130, 132, 97, @@ -415,8 +441,9 @@ pub mod inclusion_verifier { 1, 81, 128, - 96, - 224, + 97, + 1, + 32, 132, 1, 82, @@ -428,14 +455,14 @@ pub mod inclusion_verifier { 128, 97, 1, - 0, + 64, 133, 1, 82, 132, 97, 1, - 133, + 159, 130, 132, 97, @@ -450,7 +477,7 @@ pub mod inclusion_verifier { 80, 97, 1, - 32, + 96, 96, 0, 131, @@ -458,13 +485,13 @@ pub mod inclusion_verifier { 32, 97, 1, - 32, + 96, 131, 1, 82, 97, 1, - 32, + 96, 130, 1, 81, @@ -473,14 +500,14 @@ pub mod inclusion_verifier { 6, 97, 1, - 64, + 128, 132, 1, 82, 128, 97, 1, - 96, + 160, 132, 1, 82, @@ -493,7 +520,7 @@ pub mod inclusion_verifier { 128, 97, 1, - 128, + 192, 132, 1, 82, @@ -506,14 +533,14 @@ pub mod inclusion_verifier { 128, 97, 1, - 160, + 224, 133, 1, 82, 132, 97, 1, - 211, + 237, 130, 132, 97, @@ -534,8 +561,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 1, - 192, + 2, + 0, 132, 1, 82, @@ -547,15 +574,15 @@ pub mod inclusion_verifier { 81, 128, 97, - 1, - 224, + 2, + 32, 133, 1, 82, 132, 97, - 1, - 253, + 2, + 23, 130, 132, 97, @@ -567,13 +594,13 @@ pub mod inclusion_verifier { 160, 97, 1, - 96, + 160, 135, 1, 32, 97, 2, - 0, + 64, 135, 1, 129, @@ -584,13 +611,13 @@ pub mod inclusion_verifier { 6, 97, 2, - 32, + 96, 136, 1, 82, 97, 2, - 64, + 128, 135, 1, 82, @@ -604,7 +631,7 @@ pub mod inclusion_verifier { 80, 97, 2, - 96, + 160, 131, 1, 83, @@ -612,13 +639,13 @@ pub mod inclusion_verifier { 33, 97, 2, - 64, + 128, 131, 1, 32, 97, 2, - 96, + 160, 131, 1, 129, @@ -629,13 +656,13 @@ pub mod inclusion_verifier { 6, 97, 2, - 128, + 192, 132, 1, 82, 97, 2, - 160, + 224, 131, 1, 82, @@ -646,8 +673,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 2, - 192, + 3, + 0, 131, 1, 129, @@ -660,8 +687,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 2, - 224, + 3, + 32, 132, 1, 129, @@ -670,7 +697,7 @@ pub mod inclusion_verifier { 132, 97, 2, - 112, + 138, 130, 132, 97, @@ -692,7 +719,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 0, + 64, 132, 1, 82, @@ -705,14 +732,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 32, + 96, 133, 1, 82, 132, 97, 2, - 154, + 180, 130, 132, 97, @@ -734,7 +761,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 64, + 128, 132, 1, 82, @@ -747,14 +774,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 96, + 160, 133, 1, 82, 132, 97, 2, - 196, + 222, 130, 132, 97, @@ -776,7 +803,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 128, + 192, 132, 1, 82, @@ -789,14 +816,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 160, + 224, 133, 1, 82, 132, 97, - 2, - 238, + 3, + 8, 130, 132, 97, @@ -814,19 +841,19 @@ pub mod inclusion_verifier { 32, 97, 2, - 160, + 224, 131, 1, 32, 97, - 3, - 192, + 4, + 0, 131, 1, 82, 97, - 3, - 192, + 4, + 0, 130, 1, 81, @@ -834,15 +861,15 @@ pub mod inclusion_verifier { 129, 6, 97, - 3, - 224, + 4, + 32, 132, 1, 82, 128, 97, 4, - 0, + 64, 132, 1, 82, @@ -856,7 +883,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 32, + 96, 132, 1, 82, @@ -869,14 +896,14 @@ pub mod inclusion_verifier { 128, 97, 4, - 64, + 128, 133, 1, 82, 132, 97, 3, - 62, + 88, 130, 132, 97, @@ -898,7 +925,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 96, + 160, 132, 1, 82, @@ -911,14 +938,14 @@ pub mod inclusion_verifier { 128, 97, 4, - 128, + 192, 133, 1, 82, 132, 97, 3, - 104, + 130, 130, 132, 97, @@ -940,7 +967,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 160, + 224, 132, 1, 82, @@ -952,15 +979,15 @@ pub mod inclusion_verifier { 81, 128, 97, - 4, - 192, + 5, + 0, 133, 1, 82, 132, 97, 3, - 146, + 172, 130, 132, 97, @@ -981,8 +1008,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 4, - 224, + 5, + 32, 132, 1, 82, @@ -995,14 +1022,14 @@ pub mod inclusion_verifier { 128, 97, 5, - 0, + 64, 133, 1, 82, 132, 97, 3, - 188, + 214, 130, 132, 97, @@ -1024,7 +1051,7 @@ pub mod inclusion_verifier { 128, 97, 5, - 32, + 96, 132, 1, 82, @@ -1037,14 +1064,14 @@ pub mod inclusion_verifier { 128, 97, 5, - 64, + 128, 133, 1, 82, 132, 97, - 3, - 230, + 4, + 0, 130, 132, 97, @@ -1062,19 +1089,19 @@ pub mod inclusion_verifier { 96, 97, 4, - 0, + 64, 131, 1, 32, 97, 5, - 96, + 160, 131, 1, 82, 97, 5, - 96, + 160, 130, 1, 81, @@ -1083,14 +1110,14 @@ pub mod inclusion_verifier { 6, 97, 5, - 128, + 192, 132, 1, 82, 128, 97, 5, - 160, + 224, 132, 1, 82, @@ -1104,8 +1131,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 5, - 192, + 6, + 0, 131, 1, 82, @@ -1118,8 +1145,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 5, - 224, + 6, + 32, 131, 1, 82, @@ -1133,7 +1160,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 0, + 64, 131, 1, 82, @@ -1147,7 +1174,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 32, + 96, 131, 1, 82, @@ -1161,7 +1188,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 64, + 128, 131, 1, 82, @@ -1175,7 +1202,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 96, + 160, 131, 1, 82, @@ -1189,7 +1216,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 128, + 192, 131, 1, 82, @@ -1203,7 +1230,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 160, + 224, 131, 1, 82, @@ -1216,8 +1243,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 6, - 192, + 7, + 0, 131, 1, 82, @@ -1230,8 +1257,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 6, - 224, + 7, + 32, 131, 1, 82, @@ -1245,7 +1272,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 0, + 64, 131, 1, 82, @@ -1259,7 +1286,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 32, + 96, 131, 1, 82, @@ -1273,7 +1300,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 64, + 128, 131, 1, 82, @@ -1287,7 +1314,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 96, + 160, 131, 1, 82, @@ -1301,7 +1328,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 128, + 192, 131, 1, 82, @@ -1315,7 +1342,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 160, + 224, 131, 1, 82, @@ -1328,8 +1355,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 7, - 192, + 8, + 0, 131, 1, 82, @@ -1342,8 +1369,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 7, - 224, + 8, + 32, 131, 1, 82, @@ -1357,7 +1384,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 0, + 64, 131, 1, 82, @@ -1371,7 +1398,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 32, + 96, 131, 1, 82, @@ -1385,7 +1412,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 64, + 128, 131, 1, 82, @@ -1399,7 +1426,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 96, + 160, 131, 1, 82, @@ -1413,7 +1440,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 128, + 192, 131, 1, 82, @@ -1427,7 +1454,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 160, + 224, 131, 1, 82, @@ -1440,8 +1467,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 8, - 192, + 9, + 0, 131, 1, 82, @@ -1454,8 +1481,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 8, - 224, + 9, + 32, 131, 1, 82, @@ -1469,7 +1496,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 0, + 64, 131, 1, 82, @@ -1483,7 +1510,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 32, + 96, 131, 1, 82, @@ -1497,7 +1524,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 64, + 128, 131, 1, 82, @@ -1511,7 +1538,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 96, + 160, 131, 1, 82, @@ -1525,7 +1552,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 128, + 192, 131, 1, 82, @@ -1539,7 +1566,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 160, + 224, 131, 1, 82, @@ -1552,8 +1579,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 9, - 192, + 10, + 0, 131, 1, 82, @@ -1566,8 +1593,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 9, - 224, + 10, + 32, 131, 1, 82, @@ -1581,7 +1608,7 @@ pub mod inclusion_verifier { 6, 97, 10, - 0, + 64, 131, 1, 82, @@ -1590,19 +1617,19 @@ pub mod inclusion_verifier { 128, 97, 5, - 160, + 224, 131, 1, 32, 97, 10, - 32, + 96, 131, 1, 82, 97, 10, - 32, + 96, 130, 1, 81, @@ -1611,14 +1638,14 @@ pub mod inclusion_verifier { 6, 97, 10, - 64, + 128, 132, 1, 82, 128, 97, 10, - 96, + 160, 132, 1, 82, @@ -1627,7 +1654,7 @@ pub mod inclusion_verifier { 1, 97, 10, - 128, + 192, 131, 1, 83, @@ -1635,13 +1662,13 @@ pub mod inclusion_verifier { 33, 97, 10, - 96, + 160, 131, 1, 32, 97, 10, - 128, + 192, 131, 1, 129, @@ -1652,13 +1679,13 @@ pub mod inclusion_verifier { 6, 97, 10, - 160, + 224, 132, 1, 82, 97, - 10, - 192, + 11, + 0, 131, 1, 82, @@ -1669,8 +1696,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 10, - 224, + 11, + 32, 131, 1, 129, @@ -1684,7 +1711,7 @@ pub mod inclusion_verifier { 81, 97, 11, - 0, + 64, 132, 1, 129, @@ -1693,7 +1720,7 @@ pub mod inclusion_verifier { 132, 97, 6, - 111, + 137, 130, 132, 97, @@ -1709,20 +1736,20 @@ pub mod inclusion_verifier { 96, 96, 97, - 10, - 192, + 11, + 0, 131, 1, 32, 97, 11, - 32, + 96, 131, 1, 82, 97, 11, - 32, + 96, 130, 1, 81, @@ -1731,14 +1758,14 @@ pub mod inclusion_verifier { 6, 97, 11, - 64, + 128, 132, 1, 82, 128, 97, 11, - 96, + 160, 132, 1, 82, @@ -1752,7 +1779,7 @@ pub mod inclusion_verifier { 128, 97, 11, - 128, + 192, 132, 1, 82, @@ -1765,14 +1792,14 @@ pub mod inclusion_verifier { 128, 97, 11, - 160, + 224, 133, 1, 82, 132, 97, 6, - 190, + 216, 130, 132, 97, @@ -1788,20 +1815,20 @@ pub mod inclusion_verifier { 128, 97, 5, - 128, + 192, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 11, - 192, + 12, + 0, 131, 1, 129, @@ -1812,8 +1839,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 11, - 224, + 12, + 32, 131, 1, 129, @@ -1825,7 +1852,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 0, + 64, 131, 1, 129, @@ -1837,7 +1864,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 32, + 96, 131, 1, 129, @@ -1849,7 +1876,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 64, + 128, 131, 1, 129, @@ -1861,7 +1888,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 96, + 160, 131, 1, 129, @@ -1873,7 +1900,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 128, + 192, 131, 1, 129, @@ -1885,7 +1912,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 160, + 224, 131, 1, 129, @@ -1896,8 +1923,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 12, - 192, + 13, + 0, 131, 1, 129, @@ -1908,8 +1935,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 12, - 224, + 13, + 32, 131, 1, 129, @@ -1921,7 +1948,7 @@ pub mod inclusion_verifier { 9, 97, 13, - 0, + 64, 131, 1, 82, @@ -1961,14 +1988,14 @@ pub mod inclusion_verifier { 0, 97, 13, - 0, + 64, 132, 1, 81, 8, 97, 13, - 32, + 96, 131, 1, 82, @@ -2008,14 +2035,14 @@ pub mod inclusion_verifier { 1, 97, 13, - 32, + 96, 132, 1, 81, 9, 97, 13, - 64, + 128, 131, 1, 82, @@ -2055,14 +2082,14 @@ pub mod inclusion_verifier { 2, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 13, - 96, + 160, 131, 1, 82, @@ -2102,14 +2129,14 @@ pub mod inclusion_verifier { 255, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 13, - 128, + 192, 131, 1, 82, @@ -2149,14 +2176,14 @@ pub mod inclusion_verifier { 81, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 13, - 160, + 224, 131, 1, 82, @@ -2196,14 +2223,14 @@ pub mod inclusion_verifier { 176, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, - 13, - 192, + 14, + 0, 131, 1, 82, @@ -2243,14 +2270,14 @@ pub mod inclusion_verifier { 53, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, - 13, - 224, + 14, + 32, 131, 1, 82, @@ -2290,14 +2317,14 @@ pub mod inclusion_verifier { 204, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 0, + 64, 131, 1, 82, @@ -2337,14 +2364,14 @@ pub mod inclusion_verifier { 37, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 32, + 96, 131, 1, 82, @@ -2384,14 +2411,14 @@ pub mod inclusion_verifier { 220, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 64, + 128, 131, 1, 82, @@ -2431,14 +2458,14 @@ pub mod inclusion_verifier { 227, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 96, + 160, 131, 1, 82, @@ -2478,14 +2505,14 @@ pub mod inclusion_verifier { 30, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 128, + 192, 131, 1, 82, @@ -2525,14 +2552,14 @@ pub mod inclusion_verifier { 26, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 160, + 224, 131, 1, 82, @@ -2572,14 +2599,14 @@ pub mod inclusion_verifier { 231, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, - 14, - 192, + 15, + 0, 131, 1, 82, @@ -2588,14 +2615,14 @@ pub mod inclusion_verifier { 1, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, - 14, - 224, + 15, + 32, 131, 1, 82, @@ -2635,14 +2662,14 @@ pub mod inclusion_verifier { 0, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 15, - 0, + 64, 131, 1, 82, @@ -2682,14 +2709,14 @@ pub mod inclusion_verifier { 95, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 15, - 32, + 96, 131, 1, 82, @@ -2729,28 +2756,216 @@ pub mod inclusion_verifier { 162, 97, 5, + 192, + 132, + 1, + 81, + 8, + 97, + 15, + 128, + 131, + 1, + 82, + 128, + 127, + 42, + 217, + 2, + 30, + 208, + 124, + 66, + 171, + 25, + 247, + 124, + 92, + 242, + 203, + 210, + 222, + 177, + 53, + 234, + 51, + 15, + 27, + 21, + 115, + 189, + 8, + 217, + 147, + 9, + 196, + 187, + 125, + 97, + 13, + 128, + 132, + 1, + 81, + 9, + 97, + 15, + 160, + 131, + 1, + 82, 128, + 127, + 5, + 139, + 76, + 84, + 16, + 181, + 93, + 126, + 158, + 88, + 201, + 89, + 142, + 181, + 133, + 126, + 118, + 253, + 254, + 21, + 106, + 158, + 91, + 29, + 134, + 217, + 28, + 0, + 230, + 59, + 68, + 132, + 97, + 5, + 192, 132, 1, 81, 8, 97, 15, - 64, + 192, 131, 1, 82, + 128, + 127, + 25, + 8, + 89, + 125, + 47, + 195, + 188, + 29, + 163, + 18, + 239, + 163, + 68, + 224, + 252, + 138, + 112, + 121, + 48, + 2, + 56, + 242, + 238, + 53, + 119, + 79, + 17, + 126, + 102, + 253, + 68, + 103, 97, 13, 128, + 132, + 1, + 81, + 9, + 97, + 15, + 224, + 131, + 1, + 82, + 128, + 127, + 23, + 91, + 244, + 245, + 177, + 109, + 228, + 12, + 21, + 61, + 86, + 19, + 60, + 160, + 91, + 210, + 183, + 186, + 184, + 70, + 64, + 198, 130, + 91, + 204, + 146, + 228, + 21, + 137, + 2, + 187, + 154, + 97, + 5, + 192, + 132, 1, 81, - 129, - 129, + 8, + 97, + 16, + 0, + 131, + 1, + 82, 97, 13, 192, + 130, + 1, + 81, + 129, + 129, + 97, + 14, + 0, 133, 1, 81, @@ -2759,8 +2974,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 96, + 16, + 32, 132, 1, 82, @@ -2768,7 +2983,7 @@ pub mod inclusion_verifier { 129, 97, 14, - 0, + 64, 133, 1, 81, @@ -2777,8 +2992,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 128, + 16, + 64, 132, 1, 82, @@ -2786,7 +3001,7 @@ pub mod inclusion_verifier { 129, 97, 14, - 64, + 128, 133, 1, 81, @@ -2795,8 +3010,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 160, + 16, + 96, 132, 1, 82, @@ -2804,7 +3019,25 @@ pub mod inclusion_verifier { 129, 97, 14, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, 128, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 0, 133, 1, 81, @@ -2813,7 +3046,25 @@ pub mod inclusion_verifier { 80, 128, 97, + 16, + 160, + 132, + 1, + 82, + 129, + 129, + 97, 15, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, 192, 132, 1, @@ -2821,8 +3072,8 @@ pub mod inclusion_verifier { 129, 129, 97, - 14, - 192, + 15, + 128, 133, 1, 81, @@ -2831,7 +3082,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, + 16, 224, 132, 1, @@ -2840,7 +3091,7 @@ pub mod inclusion_verifier { 129, 97, 15, - 0, + 192, 133, 1, 81, @@ -2849,7 +3100,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 0, 132, 1, @@ -2857,8 +3108,8 @@ pub mod inclusion_verifier { 129, 129, 97, - 15, - 64, + 16, + 0, 133, 1, 81, @@ -2867,7 +3118,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 32, 132, 1, @@ -2876,7 +3127,7 @@ pub mod inclusion_verifier { 129, 97, 13, - 32, + 96, 133, 1, 81, @@ -2885,7 +3136,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 64, 132, 1, @@ -2894,7 +3145,7 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 128, 131, 1, @@ -2902,7 +3153,7 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 160, 131, 1, @@ -2910,19 +3161,19 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 192, 131, 1, 82, 97, - 16, + 17, 64, 130, 1, 81, 97, - 16, + 17, 224, 131, 1, @@ -2961,7 +3212,7 @@ pub mod inclusion_verifier { 255, 255, 97, - 17, + 18, 0, 131, 1, @@ -2973,8 +3224,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -2982,7 +3233,7 @@ pub mod inclusion_verifier { 145, 82, 97, - 17, + 18, 32, 131, 1, @@ -2993,14 +3244,14 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 96, 133, 1, 96, 192, 97, - 16, + 17, 128, 135, 1, @@ -3013,7 +3264,7 @@ pub mod inclusion_verifier { 146, 80, 97, - 16, + 17, 96, 130, 1, @@ -3022,7 +3273,7 @@ pub mod inclusion_verifier { 0, 97, 13, - 32, + 96, 132, 1, 81, @@ -3031,7 +3282,7 @@ pub mod inclusion_verifier { 130, 130, 97, - 16, + 17, 32, 134, 1, @@ -3039,7 +3290,7 @@ pub mod inclusion_verifier { 9, 97, 13, - 32, + 96, 133, 1, 82, @@ -3050,8 +3301,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 15, - 64, + 16, + 0, 132, 1, 81, @@ -3060,15 +3311,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 16, + 17, 0, 134, 1, 81, 9, 97, - 15, - 64, + 16, + 0, 133, 1, 82, @@ -3080,7 +3331,7 @@ pub mod inclusion_verifier { 80, 97, 15, - 0, + 192, 132, 1, 81, @@ -3089,7 +3340,7 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, + 16, 224, 134, 1, @@ -3097,7 +3348,7 @@ pub mod inclusion_verifier { 9, 97, 15, - 0, + 192, 133, 1, 82, @@ -3108,8 +3359,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 14, - 192, + 15, + 128, 132, 1, 81, @@ -3118,15 +3369,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, + 16, 192, 134, 1, 81, 9, 97, - 14, - 192, + 15, + 128, 133, 1, 82, @@ -3137,8 +3388,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 14, - 128, + 15, + 64, 132, 1, 81, @@ -3147,15 +3398,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, + 16, 160, 134, 1, 81, 9, 97, - 14, - 128, + 15, + 64, 133, 1, 82, @@ -3166,8 +3417,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 14, - 64, + 15, + 0, 132, 1, 81, @@ -3176,15 +3427,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, + 16, 128, 134, 1, 81, 9, 97, - 14, - 64, + 15, + 0, 133, 1, 82, @@ -3196,7 +3447,7 @@ pub mod inclusion_verifier { 80, 97, 14, - 0, + 192, 132, 1, 81, @@ -3205,7 +3456,7 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, + 16, 96, 134, 1, @@ -3213,7 +3464,7 @@ pub mod inclusion_verifier { 9, 97, 14, - 0, + 192, 133, 1, 82, @@ -3224,8 +3475,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 13, - 192, + 14, + 128, 132, 1, 81, @@ -3234,15 +3485,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 13, - 128, + 16, + 64, 134, 1, 81, 9, 97, - 13, - 192, + 14, + 128, 133, 1, 82, @@ -3250,50 +3501,88 @@ pub mod inclusion_verifier { 130, 130, 9, + 145, + 80, 97, - 13, - 128, - 133, + 14, + 64, + 132, 1, - 129, + 81, 144, - 82, + 80, + 130, + 130, 97, - 13, - 96, - 133, + 16, + 32, + 134, 1, 81, - 132, - 147, + 9, + 97, + 14, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, 80, + 97, + 14, + 0, + 132, + 1, + 81, 144, - 145, 80, + 130, + 130, + 97, + 13, + 192, + 134, + 1, + 81, 9, 97, - 17, - 64, - 131, + 14, + 0, + 133, 1, 82, - 128, + 130, + 130, + 130, + 9, 97, 13, 192, - 131, + 133, 1, - 81, + 129, + 144, + 82, 97, 13, 160, - 132, + 133, 1, 81, + 132, + 147, + 80, + 144, + 145, + 80, 9, 97, - 17, - 96, + 18, + 64, 131, 1, 82, @@ -3312,8 +3601,8 @@ pub mod inclusion_verifier { 81, 9, 97, - 17, - 128, + 18, + 96, 131, 1, 82, @@ -3332,8 +3621,8 @@ pub mod inclusion_verifier { 81, 9, 97, - 17, - 160, + 18, + 128, 131, 1, 82, @@ -3352,8 +3641,8 @@ pub mod inclusion_verifier { 81, 9, 97, - 17, - 192, + 18, + 160, 131, 1, 82, @@ -3372,8 +3661,8 @@ pub mod inclusion_verifier { 81, 9, 97, - 17, - 224, + 18, + 192, 131, 1, 82, @@ -3393,7 +3682,7 @@ pub mod inclusion_verifier { 9, 97, 18, - 0, + 224, 131, 1, 82, @@ -3412,56 +3701,152 @@ pub mod inclusion_verifier { 81, 9, 97, - 18, - 32, + 19, + 0, 131, 1, 82, 128, - 96, - 32, + 97, + 15, + 128, 131, 1, 81, 97, - 18, - 0, + 15, + 96, 132, 1, 81, 9, - 129, - 129, + 97, + 19, + 32, + 131, + 1, + 82, + 128, + 97, + 15, + 192, 131, - 96, - 64, - 134, 1, 81, 97, - 18, - 32, - 135, + 15, + 160, + 132, 1, 81, 9, - 8, 97, - 18, + 19, 64, - 132, + 131, 1, 82, - 80, + 128, 97, - 6, - 224, - 130, + 16, + 0, + 131, 1, 81, 97, - 5, - 192, + 15, + 224, + 132, + 1, + 81, + 9, + 97, + 19, + 96, + 131, + 1, + 82, + 128, + 96, + 32, + 131, + 1, + 81, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 96, + 64, + 134, + 1, + 81, + 97, + 19, + 32, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 96, + 96, + 134, + 1, + 81, + 97, + 19, + 64, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 96, + 128, + 134, + 1, + 81, + 97, + 19, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 19, + 128, + 132, + 1, + 82, + 80, + 97, + 7, + 32, + 130, + 1, + 81, + 97, + 6, + 0, 131, 1, 81, @@ -3470,8 +3855,8 @@ pub mod inclusion_verifier { 144, 8, 97, - 18, - 96, + 19, + 160, 131, 1, 129, @@ -3482,8 +3867,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 18, - 128, + 19, + 192, 131, 1, 129, @@ -3494,28 +3879,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 18, - 160, + 19, + 224, 131, 1, 82, 128, 97, - 18, - 160, + 19, + 224, 131, 1, 81, 97, - 18, - 96, + 19, + 160, 132, 1, 81, 9, 97, - 18, - 192, + 20, + 0, 131, 1, 82, @@ -3554,35 +3939,35 @@ pub mod inclusion_verifier { 122, 213, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 9, 97, - 18, - 224, + 20, + 32, 131, 1, 82, 128, 97, 7, - 0, + 64, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, 8, 97, - 19, - 0, + 20, + 64, 131, 1, 129, @@ -3593,8 +3978,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 19, - 32, + 20, + 96, 131, 1, 129, @@ -3605,28 +3990,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 19, - 64, + 20, + 128, 131, 1, 82, 128, 97, - 19, - 64, + 20, + 128, 131, 1, 81, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 19, - 96, + 20, + 160, 131, 1, 82, @@ -3665,57 +4050,57 @@ pub mod inclusion_verifier { 177, 232, 97, - 19, - 96, + 20, + 160, 132, 1, 81, 9, 97, - 19, - 128, + 20, + 192, 131, 1, 82, 128, 97, - 19, - 128, + 20, + 192, 131, 1, 81, 97, - 18, - 224, + 20, + 32, 132, 1, 81, 8, 97, - 19, - 160, + 20, + 224, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, 130, 3, 97, - 19, - 160, + 20, + 224, 132, 1, 81, 8, 97, - 19, - 192, + 21, + 0, 131, 1, 129, @@ -3723,7 +4108,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 128, + 192, 131, 1, 81, @@ -3731,28 +4116,28 @@ pub mod inclusion_verifier { 145, 9, 97, - 19, - 224, + 21, + 32, 131, 1, 82, 128, 97, - 19, - 224, + 21, + 32, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 20, - 0, + 21, + 64, 131, 1, 82, @@ -3791,15 +4176,15 @@ pub mod inclusion_verifier { 143, 249, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 9, 97, - 20, - 32, + 21, + 96, 131, 1, 82, @@ -3838,57 +4223,57 @@ pub mod inclusion_verifier { 3, 200, 97, - 19, - 96, + 20, + 160, 132, 1, 81, 9, 97, - 20, - 64, + 21, + 128, 131, 1, 82, 128, 97, - 20, - 64, + 21, + 128, 131, 1, 81, 97, - 20, - 32, + 21, + 96, 132, 1, 81, 8, 97, - 20, - 96, + 21, + 160, 131, 1, 82, 128, 97, 6, - 32, + 96, 131, 1, 81, 130, 3, 97, - 20, - 96, + 21, + 160, 132, 1, 81, 8, 97, - 20, - 128, + 21, + 192, 131, 1, 129, @@ -3896,7 +4281,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 128, + 192, 131, 1, 81, @@ -3904,70 +4289,70 @@ pub mod inclusion_verifier { 145, 9, 97, - 20, - 160, + 21, + 224, 131, 1, 82, 128, 97, - 20, - 160, + 21, + 224, 131, 1, 81, 97, - 20, - 0, + 21, + 64, 132, 1, 81, 8, 97, - 20, - 192, + 22, + 0, 131, 1, 82, 128, 97, - 20, - 192, + 22, + 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 20, - 224, + 22, + 32, 131, 1, 82, 128, 97, 6, - 64, + 128, 131, 1, 81, 130, 3, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 8, 97, - 21, - 0, + 22, + 64, 131, 1, 129, @@ -3975,7 +4360,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -3983,48 +4368,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 21, - 32, + 22, + 96, 131, 1, 82, 128, 97, - 21, - 32, + 22, + 96, 131, 1, 81, 97, - 20, - 224, + 22, + 32, 132, 1, 81, 8, 97, - 21, - 64, + 22, + 128, 131, 1, 82, 128, 97, - 21, - 64, + 22, + 128, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 21, - 96, + 22, + 160, 131, 1, 82, @@ -4064,14 +4449,14 @@ pub mod inclusion_verifier { 213, 97, 6, - 64, + 128, 132, 1, 81, 9, 97, - 21, - 128, + 22, + 192, 131, 1, 82, @@ -4110,35 +4495,35 @@ pub mod inclusion_verifier { 177, 232, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 21, - 160, + 22, + 224, 131, 1, 82, 128, 97, - 21, - 160, + 22, + 224, 131, 1, 81, 97, - 21, - 128, + 22, + 192, 132, 1, 81, 8, 97, - 21, - 192, + 23, + 0, 131, 1, 129, @@ -4146,7 +4531,7 @@ pub mod inclusion_verifier { 82, 97, 6, - 160, + 224, 131, 1, 81, @@ -4154,8 +4539,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 21, - 224, + 23, + 32, 131, 1, 129, @@ -4166,8 +4551,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 22, - 0, + 23, + 64, 131, 1, 129, @@ -4178,28 +4563,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 22, - 32, + 23, + 96, 131, 1, 82, 128, 97, - 22, - 32, + 23, + 96, 131, 1, 81, 97, - 21, - 224, + 23, + 32, 132, 1, 81, 9, 97, - 22, - 64, + 23, + 128, 131, 1, 82, @@ -4239,14 +4624,14 @@ pub mod inclusion_verifier { 102, 97, 6, - 0, + 64, 132, 1, 81, 9, 97, - 22, - 96, + 23, + 160, 131, 1, 82, @@ -4286,56 +4671,56 @@ pub mod inclusion_verifier { 254, 97, 6, - 32, + 96, 132, 1, 81, 9, 97, - 22, - 128, + 23, + 192, 131, 1, 82, 128, 97, - 22, - 128, + 23, + 192, 131, 1, 81, 97, - 22, - 96, + 23, + 160, 132, 1, 81, 8, 97, - 22, - 160, + 23, + 224, 131, 1, 82, 128, 97, - 22, - 160, + 23, + 224, 131, 1, 81, 130, 3, 97, - 22, - 64, + 23, + 128, 132, 1, 81, 8, 97, - 22, - 192, + 24, + 0, 131, 1, 129, @@ -4343,7 +4728,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -4351,48 +4736,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 22, - 224, + 24, + 32, 131, 1, 82, 128, 97, - 22, - 224, + 24, + 32, 131, 1, 81, 97, - 21, - 96, + 22, + 160, 132, 1, 81, 8, 97, - 23, - 0, + 24, + 64, 131, 1, 82, 128, 97, - 23, - 0, + 24, + 64, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 23, - 32, + 24, + 96, 131, 1, 82, @@ -4432,14 +4817,14 @@ pub mod inclusion_verifier { 249, 97, 6, - 64, + 128, 132, 1, 81, 9, 97, - 23, - 64, + 24, + 128, 131, 1, 82, @@ -4478,43 +4863,43 @@ pub mod inclusion_verifier { 3, 200, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 23, - 96, + 24, + 160, 131, 1, 82, 128, 97, - 23, - 96, + 24, + 160, 131, 1, 81, 97, - 23, - 64, + 24, + 128, 132, 1, 81, 8, 97, - 23, - 128, + 24, + 192, 131, 1, 129, 144, 82, 97, - 6, - 192, + 7, + 0, 131, 1, 81, @@ -4522,8 +4907,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 23, - 160, + 24, + 224, 131, 1, 82, @@ -4563,14 +4948,14 @@ pub mod inclusion_verifier { 2, 97, 6, - 0, + 64, 132, 1, 81, 9, 97, - 23, - 192, + 25, + 0, 131, 1, 82, @@ -4610,56 +4995,56 @@ pub mod inclusion_verifier { 190, 97, 6, - 32, + 96, 132, 1, 81, 9, 97, - 23, - 224, + 25, + 32, 131, 1, 82, 128, 97, - 23, - 224, + 25, + 32, 131, 1, 81, 97, - 23, - 192, + 25, + 0, 132, 1, 81, 8, 97, - 24, - 0, + 25, + 64, 131, 1, 82, 128, 97, - 24, - 0, + 25, + 64, 131, 1, 81, 130, 3, 97, - 23, - 160, + 24, + 224, 132, 1, 81, 8, 97, - 24, - 32, + 25, + 96, 131, 1, 129, @@ -4667,7 +5052,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -4675,55 +5060,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 24, - 64, + 25, + 128, 131, 1, 82, 128, 97, - 24, - 64, + 25, + 128, 131, 1, 81, 97, - 23, - 32, + 24, + 96, 132, 1, 81, 8, 97, - 24, - 96, + 25, + 160, 131, 1, 82, 128, 97, - 24, - 96, + 25, + 160, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 24, - 128, + 25, + 192, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -4733,8 +5118,8 @@ pub mod inclusion_verifier { 1, 8, 97, - 24, - 160, + 25, + 224, 131, 1, 129, @@ -4742,7 +5127,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 96, + 160, 131, 1, 81, @@ -4750,15 +5135,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 24, - 192, + 26, + 0, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -4768,16 +5153,16 @@ pub mod inclusion_verifier { 2, 8, 97, - 24, - 224, + 26, + 32, 131, 1, 129, 144, 82, 97, - 24, - 192, + 26, + 0, 131, 1, 81, @@ -4785,15 +5170,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 0, + 26, + 64, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -4803,16 +5188,16 @@ pub mod inclusion_verifier { 4, 8, 97, - 25, - 32, + 26, + 96, 131, 1, 129, 144, 82, 97, - 25, - 0, + 26, + 64, 131, 1, 81, @@ -4820,58 +5205,58 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 64, + 26, + 128, 131, 1, 82, 128, 97, - 5, - 192, + 6, + 0, 131, 1, 81, 97, 6, - 128, + 192, 132, 1, 81, 8, 97, - 25, - 96, + 26, + 160, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, 130, 3, 97, - 25, - 96, + 26, + 160, 132, 1, 81, 8, 97, - 25, - 128, + 26, + 192, 131, 1, 129, 144, 82, 97, - 25, - 64, + 26, + 128, 131, 1, 81, @@ -4879,55 +5264,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 160, + 26, + 224, 131, 1, 82, 128, 97, - 25, - 160, + 26, + 224, 131, 1, 81, 97, - 24, - 128, + 25, + 192, 132, 1, 81, 8, 97, - 25, - 192, + 27, + 0, 131, 1, 82, 128, 97, - 25, - 192, + 27, + 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 25, - 224, + 27, + 32, 131, 1, 82, 128, 97, 6, - 32, + 96, 131, 1, 81, @@ -4935,732 +5320,542 @@ pub mod inclusion_verifier { 3, 97, 6, - 96, + 160, 132, 1, 81, 8, 97, - 26, - 0, + 27, + 64, 131, 1, 129, 144, 82, 97, - 25, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 26, - 32, - 131, - 1, - 82, - 128, - 97, - 26, - 32, - 131, - 1, - 81, - 97, - 25, - 224, - 132, - 1, - 81, - 8, - 97, 26, - 64, - 131, - 1, - 82, 128, - 97, - 26, - 64, 131, 1, 81, - 97, - 3, - 224, - 132, - 1, - 81, + 130, + 145, 9, 97, - 26, + 27, 96, 131, 1, 82, 128, 97, - 7, - 192, + 27, + 96, 131, 1, 81, 97, - 19, - 192, + 27, + 32, 132, 1, 81, - 9, + 8, 97, - 26, + 27, 128, 131, 1, 82, 128, 97, - 26, + 27, 128, 131, 1, 81, 97, - 26, - 96, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 26, + 27, 160, 131, 1, 82, 128, 97, - 26, - 160, + 8, + 0, 131, 1, 81, 97, - 3, - 224, + 21, + 0, 132, 1, 81, 9, 97, - 26, + 27, 192, 131, 1, 82, 128, 97, - 7, + 27, 192, 131, 1, 81, 97, - 20, - 128, + 27, + 160, 132, 1, 81, - 9, + 8, 97, - 26, + 27, 224, 131, 1, 82, 128, 97, - 26, + 27, 224, 131, 1, 81, 97, - 26, - 192, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 27, + 28, 0, 131, 1, 82, 128, 97, - 27, + 8, 0, 131, 1, 81, 97, - 3, - 224, + 21, + 192, 132, 1, 81, 9, 97, - 27, + 28, 32, 131, 1, 82, 128, 97, - 7, - 224, + 28, + 32, 131, 1, 81, 97, - 21, + 28, 0, 132, 1, 81, - 9, + 8, 97, - 27, + 28, 64, 131, 1, 82, 128, 97, - 27, + 28, 64, 131, 1, 81, 97, - 27, + 4, 32, 132, 1, 81, - 8, + 9, 97, - 27, + 28, 96, 131, 1, 82, 128, 97, - 27, - 96, + 8, + 32, 131, 1, 81, 97, - 3, - 224, + 22, + 64, 132, 1, 81, 9, 97, - 27, + 28, 128, 131, 1, 82, 128, 97, - 7, - 224, + 28, + 128, 131, 1, 81, 97, - 22, - 192, + 28, + 96, 132, 1, 81, - 9, + 8, 97, - 27, + 28, 160, 131, 1, 82, 128, 97, - 27, + 28, 160, 131, 1, 81, 97, - 27, - 128, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 27, + 28, 192, 131, 1, 82, 128, 97, - 27, - 192, + 8, + 32, 131, 1, 81, 97, - 3, - 224, + 24, + 0, 132, 1, 81, 9, 97, - 27, + 28, 224, 131, 1, 82, 128, 97, - 7, + 28, 224, 131, 1, 81, 97, - 24, - 32, + 28, + 192, 132, 1, 81, - 9, + 8, 97, - 28, + 29, 0, 131, 1, 82, 128, 97, - 28, + 29, 0, 131, 1, 81, 97, - 27, - 224, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 28, + 29, 32, 131, 1, 82, 128, 97, - 28, + 8, 32, 131, 1, 81, 97, - 3, - 224, + 25, + 96, 132, 1, 81, 9, 97, - 28, + 29, 64, 131, 1, 82, 128, 97, - 7, - 96, + 29, + 64, 131, 1, 81, - 130, - 3, - 96, - 3, - 8, - 97, - 28, - 96, - 131, - 1, - 129, - 144, - 82, 97, - 25, - 0, - 131, + 29, + 32, + 132, 1, 81, - 130, - 145, - 9, + 8, 97, - 28, - 128, + 29, + 96, 131, 1, 82, 128, 97, - 28, - 128, + 29, + 96, 131, 1, 81, 97, - 25, - 128, + 4, + 32, 132, 1, 81, 9, 97, - 28, - 160, + 29, + 128, 131, 1, 82, 128, 97, - 28, + 7, 160, 131, 1, 81, - 97, - 28, - 64, - 132, - 1, - 81, + 130, + 3, + 96, + 3, 8, 97, - 28, - 192, + 29, + 160, 131, 1, + 129, + 144, 82, - 128, 97, - 28, - 192, + 26, + 64, 131, 1, 81, - 97, - 3, - 224, - 132, - 1, - 81, + 130, + 145, 9, 97, - 28, - 224, + 29, + 192, 131, 1, 82, 128, 97, - 28, - 128, + 29, + 192, 131, 1, 81, 97, 26, - 0, + 192, 132, 1, 81, 9, 97, 29, - 0, - 131, - 1, - 82, - 128, - 97, - 29, - 0, - 131, - 1, - 81, - 97, - 28, 224, - 132, - 1, - 81, - 8, - 97, - 29, - 32, 131, 1, 82, 128, 97, 29, - 32, - 131, - 1, - 81, - 97, - 3, 224, - 132, - 1, - 81, - 9, - 97, - 29, - 64, - 131, - 1, - 82, - 128, - 97, - 7, - 96, 131, 1, 81, 97, - 24, - 224, - 132, - 1, - 81, - 9, - 97, 29, - 96, - 131, - 1, - 82, 128, - 97, - 29, - 96, - 131, - 1, - 81, - 97, - 28, - 96, 132, 1, 81, - 9, + 8, 97, - 29, - 128, + 30, + 0, 131, 1, 82, 128, 97, - 29, - 128, + 30, + 0, 131, 1, 81, 97, - 25, + 4, 32, 132, 1, 81, 9, 97, - 29, - 160, + 30, + 32, 131, 1, 82, 128, 97, 29, - 160, + 192, 131, 1, 81, 97, - 6, + 27, 64, 132, 1, 81, 9, 97, - 29, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 29, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 29, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, 30, - 0, + 64, 131, 1, 82, 128, 97, 30, - 0, + 64, 131, 1, 81, 97, - 29, - 64, + 30, + 32, 132, 1, 81, 8, 97, 30, - 32, + 96, 131, 1, 82, 128, 97, 30, - 32, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, 30, - 64, - 131, - 1, - 82, 128, - 97, - 6, - 64, - 131, - 1, - 81, - 96, - 2, - 9, - 97, - 30, - 96, 131, 1, 82, 128, 97, - 5, - 192, + 7, + 160, 131, 1, 81, - 130, - 3, 97, - 5, - 224, + 26, + 32, 132, 1, 81, - 8, - 97, - 30, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 30, - 96, - 131, - 1, - 81, - 130, - 145, 9, 97, 30, @@ -5670,20 +5865,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 5, - 192, + 30, + 160, 131, 1, 81, - 130, - 3, 97, - 6, - 0, + 29, + 160, 132, 1, 81, - 8, + 9, 97, 30, 192, @@ -5697,15 +5890,13 @@ pub mod inclusion_verifier { 131, 1, 81, - 130, - 3, 97, - 30, - 160, + 26, + 96, 132, 1, 81, - 8, + 9, 97, 30, 224, @@ -5714,20 +5905,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 6, - 32, + 30, + 224, 131, 1, 81, - 130, - 3, 97, - 5, - 224, + 6, + 128, 132, 1, 81, - 8, + 9, 97, 31, 0, @@ -5736,19 +5925,15 @@ pub mod inclusion_verifier { 82, 128, 97, - 31, - 0, + 6, + 128, 131, 1, 81, 130, 3, - 97, - 30, - 224, - 132, + 96, 1, - 81, 8, 97, 31, @@ -5759,8 +5944,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 29, - 160, + 31, + 0, 131, 1, 81, @@ -5782,7 +5967,7 @@ pub mod inclusion_verifier { 81, 97, 30, - 64, + 128, 132, 1, 81, @@ -5801,8 +5986,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, @@ -5815,18 +6000,20 @@ pub mod inclusion_verifier { 82, 128, 97, - 24, - 192, + 6, + 0, 131, 1, 81, + 130, + 3, 97, - 28, - 96, + 6, + 32, 132, 1, 81, - 9, + 8, 97, 31, 160, @@ -5841,8 +6028,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 25, - 32, + 6, + 128, 132, 1, 81, @@ -5852,20 +6039,17 @@ pub mod inclusion_verifier { 192, 131, 1, + 129, + 144, 82, - 128, 97, - 5, - 224, + 6, + 0, 131, 1, 81, - 97, - 5, - 192, - 132, - 1, - 81, + 130, + 145, 8, 97, 31, @@ -5898,8 +6082,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 31, - 192, + 30, + 224, 131, 1, 81, @@ -5940,8 +6124,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, @@ -5951,17 +6135,22 @@ pub mod inclusion_verifier { 96, 131, 1, - 129, - 144, 82, + 128, 97, - 32, + 6, 32, 131, 1, 81, 130, - 145, + 3, + 97, + 6, + 0, + 132, + 1, + 81, 8, 97, 32, @@ -5977,8 +6166,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 3, - 224, + 6, + 128, 132, 1, 81, @@ -5988,56 +6177,57 @@ pub mod inclusion_verifier { 160, 131, 1, + 129, + 144, 82, - 128, 97, - 8, - 224, + 6, + 32, 131, 1, 81, 130, - 3, - 96, - 1, + 145, 8, 97, 32, 192, 131, 1, - 129, - 144, 82, + 128, 97, - 18, - 0, + 6, + 96, 131, 1, 81, 130, - 145, - 9, + 3, 97, 32, - 224, - 131, + 192, + 132, 1, - 82, - 128, + 81, + 8, 97, 32, 224, 131, 1, - 81, + 129, + 144, + 82, 97, - 32, - 160, - 132, + 30, + 224, + 131, 1, 81, - 8, + 130, + 145, + 9, 97, 33, 0, @@ -6052,140 +6242,125 @@ pub mod inclusion_verifier { 1, 81, 97, - 3, - 224, + 32, + 96, 132, 1, 81, - 9, + 8, 97, 33, 32, 131, 1, 82, - 97, - 9, - 64, - 130, - 1, - 81, - 129, - 144, 128, - 9, 97, 33, - 64, - 131, - 1, - 82, - 128, - 97, - 9, - 64, + 32, 131, 1, 81, - 130, - 3, 97, - 33, - 64, + 4, + 32, 132, 1, 81, - 8, + 9, 97, 33, - 96, + 64, 131, 1, - 129, - 144, 82, + 128, 97, - 17, - 64, + 26, + 0, 131, 1, 81, - 130, - 145, + 97, + 29, + 160, + 132, + 1, + 81, 9, 97, 33, - 128, + 96, 131, 1, 82, 128, 97, 33, - 128, + 96, 131, 1, 81, 97, - 33, - 32, + 26, + 96, 132, 1, 81, - 8, + 9, 97, 33, - 160, + 128, 131, 1, 82, 128, 97, - 33, - 160, + 6, + 32, 131, 1, 81, 97, - 3, - 224, + 6, + 0, 132, 1, 81, - 9, + 8, 97, 33, - 192, + 160, 131, 1, 82, 128, 97, - 9, - 32, + 6, + 128, 131, 1, 81, 130, 3, 97, - 9, - 64, + 33, + 160, 132, 1, 81, 8, 97, 33, - 224, + 192, 131, 1, 129, 144, 82, 97, - 18, - 0, + 33, + 128, 131, 1, 81, @@ -6193,149 +6368,130 @@ pub mod inclusion_verifier { 145, 9, 97, - 34, - 0, + 33, + 224, 131, 1, 82, 128, 97, - 34, - 0, + 33, + 224, 131, 1, 81, 97, 33, - 192, + 64, 132, 1, 81, 8, 97, 34, - 32, + 0, 131, 1, 82, 128, 97, 34, - 32, + 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, 34, - 64, + 32, 131, 1, + 129, + 144, 82, - 128, 97, - 17, - 64, + 33, + 224, 131, 1, 81, 130, - 3, - 96, - 1, + 145, 8, 97, 34, - 96, + 64, 131, 1, 82, 128, 97, - 17, - 128, + 34, + 64, 131, 1, 81, 97, - 17, - 96, + 4, + 32, 132, 1, 81, - 8, + 9, 97, 34, - 128, + 96, 131, 1, - 129, - 144, 82, + 128, 97, - 17, - 160, + 9, + 32, 131, 1, 81, 130, - 145, - 8, - 97, - 34, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 192, - 131, + 3, + 96, 1, - 81, - 130, - 145, 8, 97, 34, - 192, + 128, 131, 1, 129, 144, 82, 97, - 17, - 224, + 19, + 0, 131, 1, 81, 130, 145, - 8, + 9, 97, 34, - 224, + 160, 131, 1, 82, 128, 97, 34, - 224, + 160, 131, 1, 81, - 130, - 3, 97, 34, 96, @@ -6344,61 +6500,99 @@ pub mod inclusion_verifier { 81, 8, 97, - 35, - 0, + 34, + 192, 131, 1, 82, 128, 97, - 2, - 32, + 34, + 192, 131, 1, 81, 97, - 8, + 4, 32, 132, 1, 81, 9, 97, - 35, - 32, + 34, + 224, 131, 1, 82, + 97, + 9, + 128, + 130, + 1, + 81, + 129, + 144, 128, + 9, 97, 35, - 32, + 0, + 131, + 1, + 82, + 128, + 97, + 9, + 128, 131, 1, 81, + 130, + 3, 97, - 6, - 160, + 35, + 0, 132, 1, 81, 8, 97, 35, - 64, + 32, 131, 1, 129, 144, 82, 97, - 2, - 128, + 18, + 64, 131, 1, 81, 130, 145, + 9, + 97, + 35, + 64, + 131, + 1, + 82, + 128, + 97, + 35, + 64, + 131, + 1, + 81, + 97, + 34, + 224, + 132, + 1, + 81, 8, 97, 35, @@ -6408,14 +6602,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 2, - 32, + 35, + 96, 131, 1, 81, 97, - 8, - 64, + 4, + 32, 132, 1, 81, @@ -6428,14 +6622,16 @@ pub mod inclusion_verifier { 82, 128, 97, - 35, - 128, + 9, + 96, 131, 1, 81, + 130, + 3, 97, - 5, - 192, + 9, + 128, 132, 1, 81, @@ -6449,31 +6645,34 @@ pub mod inclusion_verifier { 144, 82, 97, - 2, - 128, + 19, + 0, 131, 1, 81, 130, 145, - 8, + 9, 97, 35, 192, 131, 1, - 129, - 144, 82, + 128, 97, 35, - 96, + 192, 131, 1, 81, - 130, - 145, - 9, + 97, + 35, + 128, + 132, + 1, + 81, + 8, 97, 35, 224, @@ -6482,14 +6681,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 2, - 32, + 35, + 224, 131, 1, 81, 97, - 8, - 96, + 4, + 32, 132, 1, 81, @@ -6502,34 +6701,35 @@ pub mod inclusion_verifier { 82, 128, 97, - 36, - 0, + 18, + 64, 131, 1, 81, - 97, - 5, - 224, - 132, + 130, + 3, + 96, 1, - 81, 8, 97, 36, 32, 131, 1, - 129, - 144, 82, + 128, 97, - 2, + 18, 128, 131, 1, 81, - 130, - 145, + 97, + 18, + 96, + 132, + 1, + 81, 8, 97, 36, @@ -6540,121 +6740,127 @@ pub mod inclusion_verifier { 144, 82, 97, - 35, - 224, + 18, + 160, 131, 1, 81, 130, 145, - 9, + 8, 97, 36, 96, 131, 1, + 129, + 144, 82, - 128, 97, - 2, - 32, + 18, + 192, 131, 1, 81, - 97, + 130, + 145, 8, - 128, - 132, - 1, - 81, - 9, 97, 36, 128, 131, 1, + 129, + 144, 82, - 128, 97, - 36, - 128, + 18, + 224, 131, 1, 81, - 97, - 6, - 192, - 132, - 1, - 81, + 130, + 145, 8, 97, 36, 160, 131, 1, - 129, - 144, 82, - 97, - 2, 128, + 97, + 36, + 160, 131, 1, 81, 130, - 145, + 3, + 97, + 36, + 32, + 132, + 1, + 81, 8, 97, 36, 192, 131, 1, - 129, - 144, 82, + 128, 97, - 36, + 2, 96, 131, 1, 81, - 130, - 145, + 97, + 8, + 96, + 132, + 1, + 81, 9, 97, 36, 224, 131, 1, - 129, - 144, 82, + 128, 97, - 9, - 0, + 36, + 224, 131, 1, 81, - 130, - 145, - 9, + 97, + 6, + 224, + 132, + 1, + 81, + 8, 97, 37, 0, 131, 1, + 129, + 144, 82, - 128, 97, 2, - 32, + 192, 131, 1, 81, - 96, - 1, - 9, + 130, + 145, + 8, 97, 37, 32, @@ -6663,13 +6869,13 @@ pub mod inclusion_verifier { 82, 128, 97, - 37, - 32, + 2, + 96, 131, 1, 81, 97, - 5, + 8, 128, 132, 1, @@ -6690,7 +6896,7 @@ pub mod inclusion_verifier { 81, 97, 6, - 160, + 0, 132, 1, 81, @@ -6705,7 +6911,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -6717,47 +6923,17 @@ pub mod inclusion_verifier { 128, 131, 1, + 129, + 144, 82, - 128, 97, - 2, + 37, 32, 131, 1, 81, - 127, - 9, - 34, - 107, - 110, - 34, - 198, - 240, - 202, - 100, - 236, - 38, - 170, - 212, - 200, - 110, - 113, - 91, - 95, - 137, - 142, - 94, - 150, - 63, - 37, - 135, - 14, - 86, - 187, - 229, - 51, - 233, - 162, + 130, + 145, 9, 97, 37, @@ -6767,14 +6943,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 37, - 160, + 2, + 96, 131, 1, 81, 97, - 5, - 128, + 8, + 160, 132, 1, 81, @@ -6793,8 +6969,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 5, - 192, + 6, + 32, 132, 1, 81, @@ -6809,7 +6985,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -6826,7 +7002,7 @@ pub mod inclusion_verifier { 82, 97, 37, - 128, + 160, 131, 1, 81, @@ -6842,43 +7018,16 @@ pub mod inclusion_verifier { 128, 97, 2, - 32, + 96, 131, 1, 81, - 127, - 19, - 179, - 96, - 212, - 232, - 47, - 233, - 21, - 254, - 209, - 96, - 129, - 3, - 143, - 152, - 194, - 17, - 66, - 123, - 135, - 162, - 129, - 189, - 115, - 60, - 39, - 125, - 186, - 223, - 16, - 55, - 43, + 97, + 8, + 192, + 132, + 1, + 81, 9, 97, 38, @@ -6894,31 +7043,28 @@ pub mod inclusion_verifier { 1, 81, 97, - 5, - 128, + 7, + 0, 132, 1, 81, - 9, + 8, 97, 38, 96, 131, 1, + 129, + 144, 82, - 128, 97, - 38, - 96, + 2, + 192, 131, 1, 81, - 97, - 5, - 224, - 132, - 1, - 81, + 130, + 145, 8, 97, 38, @@ -6929,14 +7075,14 @@ pub mod inclusion_verifier { 144, 82, 97, - 2, - 128, + 38, + 32, 131, 1, 81, 130, 145, - 8, + 9, 97, 38, 160, @@ -6946,8 +7092,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 38, - 32, + 9, + 64, 131, 1, 81, @@ -6963,43 +7109,12 @@ pub mod inclusion_verifier { 128, 97, 2, - 32, + 96, 131, 1, 81, - 127, - 24, - 175, - 223, - 35, - 233, - 189, - 147, - 2, - 103, - 63, - 193, - 224, - 118, - 164, - 146, - 212, - 214, - 91, - 209, - 142, - 188, - 77, - 133, - 78, - 209, - 137, - 19, - 155, - 171, - 49, - 62, - 82, + 96, + 1, 9, 97, 38, @@ -7016,7 +7131,7 @@ pub mod inclusion_verifier { 81, 97, 5, - 128, + 192, 132, 1, 81, @@ -7036,7 +7151,7 @@ pub mod inclusion_verifier { 81, 97, 6, - 192, + 224, 132, 1, 81, @@ -7051,7 +7166,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -7063,52 +7178,83 @@ pub mod inclusion_verifier { 64, 131, 1, - 129, - 144, 82, + 128, 97, - 38, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 39, + 2, 96, 131, 1, - 129, - 144, - 82, - 97, - 8, - 224, - 131, - 1, 81, - 130, - 145, + 127, 9, - 97, - 39, - 128, - 131, - 1, - 82, - 128, - 97, - 39, - 128, - 131, - 1, - 81, - 130, - 3, - 97, + 34, + 107, + 110, + 34, + 198, + 240, + 202, + 100, + 236, + 38, + 170, + 212, + 200, + 110, + 113, + 91, + 95, + 137, + 142, + 94, + 150, + 63, 37, + 135, + 14, + 86, + 187, + 229, + 51, + 233, + 162, + 9, + 97, + 39, + 96, + 131, + 1, + 82, + 128, + 97, + 39, + 96, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 9, + 97, + 39, + 128, + 131, + 1, + 82, + 128, + 97, + 39, + 128, + 131, + 1, + 81, + 97, + 6, 0, 132, 1, @@ -7123,34 +7269,31 @@ pub mod inclusion_verifier { 144, 82, 97, - 35, - 0, + 2, + 192, 131, 1, 81, 130, 145, - 9, + 8, 97, 39, 192, 131, 1, + 129, + 144, 82, - 128, 97, 39, - 192, - 131, - 1, - 81, - 97, - 34, 64, - 132, + 131, 1, 81, - 8, + 130, + 145, + 9, 97, 39, 224, @@ -7159,17 +7302,44 @@ pub mod inclusion_verifier { 82, 128, 97, - 39, - 224, + 2, + 96, 131, 1, 81, - 97, + 127, + 19, + 179, + 96, + 212, + 232, + 47, + 233, + 21, + 254, + 209, + 96, + 129, 3, - 224, - 132, - 1, - 81, + 143, + 152, + 194, + 17, + 66, + 123, + 135, + 162, + 129, + 189, + 115, + 60, + 39, + 125, + 186, + 223, + 16, + 55, + 43, 9, 97, 40, @@ -7179,14 +7349,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 2, - 32, + 40, + 0, 131, 1, 81, 97, - 8, - 160, + 5, + 192, 132, 1, 81, @@ -7206,7 +7376,7 @@ pub mod inclusion_verifier { 81, 97, 6, - 64, + 32, 132, 1, 81, @@ -7221,7 +7391,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -7233,16 +7403,80 @@ pub mod inclusion_verifier { 96, 131, 1, + 129, + 144, + 82, + 97, + 39, + 224, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 40, + 128, + 131, + 1, 82, 128, 97, 2, - 32, + 96, + 131, + 1, + 81, + 127, + 24, + 175, + 223, + 35, + 233, + 189, + 147, + 2, + 103, + 63, + 193, + 224, + 118, + 164, + 146, + 212, + 214, + 91, + 209, + 142, + 188, + 77, + 133, + 78, + 209, + 137, + 19, + 155, + 171, + 49, + 62, + 82, + 9, + 97, + 40, + 160, + 131, + 1, + 82, + 128, + 97, + 40, + 160, 131, 1, 81, 97, - 8, + 5, 192, 132, 1, @@ -7250,27 +7484,27 @@ pub mod inclusion_verifier { 9, 97, 40, - 128, + 192, 131, 1, 82, 128, 97, 40, - 128, + 192, 131, 1, 81, 97, - 18, - 64, + 7, + 0, 132, 1, 81, 8, 97, 40, - 160, + 224, 131, 1, 129, @@ -7278,7 +7512,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -7286,8 +7520,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 40, - 192, + 41, + 0, 131, 1, 129, @@ -7295,7 +7529,7 @@ pub mod inclusion_verifier { 82, 97, 40, - 96, + 128, 131, 1, 81, @@ -7303,8 +7537,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 40, - 224, + 41, + 32, 131, 1, 129, @@ -7312,26 +7546,253 @@ pub mod inclusion_verifier { 82, 97, 9, + 32, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 41, + 64, + 131, + 1, + 82, + 128, + 97, + 41, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 38, + 192, + 132, + 1, + 81, + 8, + 97, + 41, 96, 131, 1, + 129, + 144, + 82, + 97, + 36, + 192, + 131, + 1, 81, 130, 145, 9, 97, 41, + 128, + 131, + 1, + 82, + 128, + 97, + 41, + 128, + 131, + 1, + 81, + 97, + 36, + 0, + 132, + 1, + 81, + 8, + 97, + 41, + 160, + 131, + 1, + 82, + 128, + 97, + 41, + 160, + 131, + 1, + 81, + 97, + 4, + 32, + 132, + 1, + 81, + 9, + 97, + 41, + 192, + 131, + 1, + 82, + 128, + 97, + 2, + 96, + 131, + 1, + 81, + 97, + 8, + 224, + 132, + 1, + 81, + 9, + 97, + 41, + 224, + 131, + 1, + 82, + 128, + 97, + 41, + 224, + 131, + 1, + 81, + 97, + 6, + 128, + 132, + 1, + 81, + 8, + 97, + 42, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 42, + 32, + 131, + 1, + 82, + 128, + 97, + 2, + 96, + 131, + 1, + 81, + 97, + 9, 0, + 132, + 1, + 81, + 9, + 97, + 42, + 64, 131, 1, 82, 128, 97, + 42, + 64, + 131, + 1, + 81, + 97, + 19, + 128, + 132, + 1, + 81, + 8, + 97, + 42, + 96, + 131, + 1, + 129, + 144, + 82, + 97, 2, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 42, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 42, 32, 131, 1, 81, + 130, + 145, + 9, + 97, + 42, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 192, + 131, + 1, + 82, + 128, + 97, + 2, + 96, + 131, + 1, + 81, 126, 161, 54, @@ -7366,48 +7827,48 @@ pub mod inclusion_verifier { 66, 9, 97, - 41, - 32, + 42, + 224, 131, 1, 82, 128, 97, - 41, - 32, + 42, + 224, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 41, - 64, + 43, + 0, 131, 1, 82, 128, 97, - 41, - 64, + 43, + 0, 131, 1, 81, 97, 6, - 64, + 128, 132, 1, 81, 8, 97, - 41, - 96, + 43, + 32, 131, 1, 129, @@ -7415,7 +7876,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -7423,15 +7884,15 @@ pub mod inclusion_verifier { 145, 8, 97, - 41, - 128, + 43, + 64, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -7470,48 +7931,48 @@ pub mod inclusion_verifier { 157, 9, 97, - 41, - 160, + 43, + 96, 131, 1, 82, 128, 97, - 41, - 160, + 43, + 96, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 41, - 192, + 43, + 128, 131, 1, 82, 128, 97, - 41, - 192, + 43, + 128, 131, 1, 81, 97, - 18, - 64, + 19, + 128, 132, 1, 81, 8, 97, - 41, - 224, + 43, + 160, 131, 1, 129, @@ -7519,7 +7980,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -7527,16 +7988,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 42, - 0, + 43, + 192, 131, 1, 129, 144, 82, 97, - 41, - 128, + 43, + 64, 131, 1, 81, @@ -7544,8 +8005,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 32, + 43, + 224, 131, 1, 129, @@ -7553,7 +8014,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 64, + 128, 131, 1, 81, @@ -7561,38 +8022,38 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 64, + 44, + 0, 131, 1, 82, 128, 97, - 42, - 64, + 44, + 0, 131, 1, 81, 130, 3, 97, - 41, - 0, + 42, + 192, 132, 1, 81, 8, 97, - 42, - 96, + 44, + 32, 131, 1, 129, 144, 82, 97, - 35, - 0, + 36, + 192, 131, 1, 81, @@ -7600,55 +8061,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 128, + 44, + 64, 131, 1, 82, 128, 97, - 42, - 128, + 44, + 64, 131, 1, 81, 97, - 40, - 0, + 41, + 192, 132, 1, 81, 8, 97, - 42, - 160, + 44, + 96, 131, 1, 82, 128, 97, - 42, - 160, + 44, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 42, - 192, + 44, + 128, 131, 1, 82, 128, 97, 9, - 128, + 192, 131, 1, 81, @@ -7658,15 +8119,15 @@ pub mod inclusion_verifier { 1, 8, 97, - 42, - 224, + 44, + 160, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -7675,54 +8136,54 @@ pub mod inclusion_verifier { 145, 9, 97, - 43, - 0, + 44, + 192, 131, 1, 82, 128, 97, - 43, - 0, + 44, + 192, 131, 1, 81, 97, - 42, - 192, + 44, + 128, 132, 1, 81, 8, 97, - 43, - 32, + 44, + 224, 131, 1, 82, 128, 97, - 43, - 32, + 44, + 224, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 43, - 64, + 45, + 0, 131, 1, 82, 97, 9, - 128, + 192, 130, 1, 81, @@ -7731,37 +8192,37 @@ pub mod inclusion_verifier { 128, 9, 97, - 43, - 96, + 45, + 32, 131, 1, 82, 128, 97, 9, - 128, + 192, 131, 1, 81, 130, 3, 97, - 43, - 96, + 45, + 32, 132, 1, 81, 8, 97, - 43, - 128, + 45, + 64, 131, 1, 129, 144, 82, 97, - 17, + 18, 64, 131, 1, @@ -7770,68 +8231,68 @@ pub mod inclusion_verifier { 145, 9, 97, - 43, - 160, + 45, + 96, 131, 1, 82, 128, 97, - 43, - 160, + 45, + 96, 131, 1, 81, 97, - 43, - 64, + 45, + 0, 132, 1, 81, 8, 97, - 43, - 192, + 45, + 128, 131, 1, 82, 128, 97, - 43, - 192, + 45, + 128, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 43, - 224, + 45, + 160, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 44, - 0, + 45, + 192, 131, 1, 129, @@ -7839,7 +8300,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 160, + 224, 131, 1, 81, @@ -7847,36 +8308,36 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 32, + 45, + 224, 131, 1, 82, 128, 97, 2, - 128, + 192, 131, 1, 81, 97, 10, - 0, + 64, 132, 1, 81, 8, 97, - 44, - 64, + 46, + 0, 131, 1, 129, 144, 82, 97, - 44, - 32, + 45, + 224, 131, 1, 81, @@ -7884,15 +8345,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 96, + 46, + 32, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, @@ -7901,30 +8362,30 @@ pub mod inclusion_verifier { 0, 9, 97, - 44, - 128, + 46, + 64, 131, 1, 82, 128, 97, - 44, - 128, + 46, + 64, 131, 1, 81, 130, 3, 97, - 5, - 192, + 6, + 0, 132, 1, 81, 8, 97, - 44, - 160, + 46, + 96, 131, 1, 129, @@ -7932,7 +8393,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 64, + 128, 131, 1, 81, @@ -7940,8 +8401,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 192, + 46, + 128, 131, 1, 129, @@ -7949,7 +8410,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 32, + 96, 131, 1, 81, @@ -7957,8 +8418,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 44, - 224, + 46, + 160, 131, 1, 129, @@ -7966,7 +8427,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 128, + 192, 131, 1, 81, @@ -7974,36 +8435,36 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 0, + 46, + 192, 131, 1, 82, 128, 97, 2, - 128, + 192, 131, 1, 81, 97, 7, - 32, + 96, 132, 1, 81, 8, 97, - 45, - 32, + 46, + 224, 131, 1, 129, 144, 82, 97, - 45, - 0, + 46, + 192, 131, 1, 81, @@ -8011,38 +8472,38 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 64, + 47, + 0, 131, 1, 82, 128, 97, - 45, - 64, + 47, + 0, 131, 1, 81, 130, 3, 97, - 44, - 96, + 46, + 32, 132, 1, 81, 8, 97, - 45, - 96, + 47, + 32, 131, 1, 129, 144, 82, 97, - 35, - 0, + 36, + 192, 131, 1, 81, @@ -8050,77 +8511,77 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 128, + 47, + 64, 131, 1, 82, 128, 97, - 45, - 128, + 47, + 64, 131, 1, 81, 97, - 43, - 224, + 45, + 160, 132, 1, 81, 8, 97, - 45, - 160, + 47, + 96, 131, 1, 82, 128, 97, - 45, - 160, + 47, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 45, - 192, + 47, + 128, 131, 1, 82, 128, 97, 10, - 0, + 64, 131, 1, 81, 130, 3, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 45, - 224, + 47, + 160, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -8129,98 +8590,98 @@ pub mod inclusion_verifier { 145, 9, 97, - 46, - 0, + 47, + 192, 131, 1, 82, 128, 97, - 46, - 0, + 47, + 192, 131, 1, 81, 97, - 45, - 192, + 47, + 128, 132, 1, 81, 8, 97, - 46, - 32, + 47, + 224, 131, 1, 82, 128, 97, - 46, - 32, + 47, + 224, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 46, - 64, + 48, + 0, 131, 1, 82, 128, 97, - 35, - 0, + 36, + 192, 131, 1, 81, 97, - 45, - 224, + 47, + 160, 132, 1, 81, 9, 97, - 46, - 96, + 48, + 32, 131, 1, 82, 128, 97, - 9, - 224, + 10, + 32, 131, 1, 81, 130, 3, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 46, - 128, + 48, + 64, 131, 1, 129, 144, 82, 97, - 46, - 96, + 48, + 32, 131, 1, 81, @@ -8228,34 +8689,34 @@ pub mod inclusion_verifier { 145, 9, 97, - 46, - 160, + 48, + 96, 131, 1, 82, 128, 97, - 46, - 160, + 48, + 96, 131, 1, 81, 97, - 46, - 64, + 48, + 0, 132, 1, 81, 8, 97, - 46, - 192, + 48, + 128, 131, 1, 82, 97, 13, - 0, + 64, 130, 1, 81, @@ -8264,8 +8725,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 46, - 224, + 48, + 160, 131, 1, 129, @@ -8273,7 +8734,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -8281,8 +8742,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 0, + 48, + 192, 131, 1, 129, @@ -8290,7 +8751,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -8298,8 +8759,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 32, + 48, + 224, 131, 1, 129, @@ -8307,7 +8768,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -8315,15 +8776,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 64, + 49, + 0, 131, 1, 82, 128, 97, 13, - 0, + 64, 131, 1, 81, @@ -8331,15 +8792,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 96, + 49, + 32, 131, 1, 82, 128, 97, - 46, - 224, + 48, + 160, 131, 1, 81, @@ -8347,15 +8808,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 128, + 49, + 64, 131, 1, 82, 128, 97, - 47, - 0, + 48, + 192, 131, 1, 81, @@ -8363,15 +8824,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 160, + 49, + 96, 131, 1, 82, 128, 97, - 47, - 32, + 48, + 224, 131, 1, 81, @@ -8379,48 +8840,48 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 192, + 49, + 128, 131, 1, 82, 128, 97, 13, - 32, + 96, 131, 1, 81, 97, - 46, - 192, + 48, + 128, 132, 1, 81, 9, 97, - 47, - 224, + 49, + 160, 131, 1, 82, 128, 97, 5, - 128, + 192, 131, 1, 81, 97, - 11, - 192, + 12, + 0, 132, 1, 81, 9, 97, - 48, - 0, + 49, + 192, 131, 1, 82, @@ -8429,21 +8890,21 @@ pub mod inclusion_verifier { 1, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 32, + 49, + 224, 131, 1, 82, 128, 97, - 48, - 32, + 49, + 224, 131, 1, 81, @@ -8451,14 +8912,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 64, + 50, + 0, 131, 1, 82, @@ -8498,21 +8959,21 @@ pub mod inclusion_verifier { 95, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 96, + 50, + 32, 131, 1, 82, 128, 97, - 48, - 96, + 50, + 32, 131, 1, 81, @@ -8520,14 +8981,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 128, + 50, + 64, 131, 1, 82, @@ -8567,21 +9028,21 @@ pub mod inclusion_verifier { 2, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 160, + 50, + 96, 131, 1, 82, 128, 97, - 48, - 160, + 50, + 96, 131, 1, 81, @@ -8589,14 +9050,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 192, + 50, + 128, 131, 1, 82, @@ -8636,21 +9097,21 @@ pub mod inclusion_verifier { 26, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 224, + 50, + 160, 131, 1, 82, 128, 97, - 48, - 224, + 50, + 160, 131, 1, 81, @@ -8658,14 +9119,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 49, - 0, + 50, + 192, 131, 1, 82, @@ -8705,15 +9166,15 @@ pub mod inclusion_verifier { 121, 139, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -8756,15 +9217,15 @@ pub mod inclusion_verifier { 134, 118, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -8774,8 +9235,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 32, + 50, + 224, 132, 1, 82, @@ -8816,15 +9277,15 @@ pub mod inclusion_verifier { 97, 54, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -8867,15 +9328,15 @@ pub mod inclusion_verifier { 231, 116, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -8885,8 +9346,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 64, + 51, + 0, 132, 1, 82, @@ -8927,15 +9388,15 @@ pub mod inclusion_verifier { 12, 40, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -8978,30 +9439,30 @@ pub mod inclusion_verifier { 239, 215, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 49, - 96, + 51, + 32, 132, 1, 82, 80, 97, - 48, - 64, + 50, + 0, 130, 1, 81, @@ -9011,16 +9472,16 @@ pub mod inclusion_verifier { 1, 9, 97, - 49, - 128, + 51, + 64, 131, 1, 129, 144, 82, 97, - 48, - 128, + 50, + 64, 131, 1, 81, @@ -9028,16 +9489,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 49, - 160, + 51, + 96, 131, 1, 129, 144, 82, 97, - 49, - 0, + 50, + 192, 131, 1, 81, @@ -9045,8 +9506,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 49, - 192, + 51, + 128, 131, 1, 82, @@ -9055,7 +9516,7 @@ pub mod inclusion_verifier { 1, 97, 11, - 64, + 128, 132, 1, 81, @@ -9098,7 +9559,7 @@ pub mod inclusion_verifier { 0, 97, 5, - 128, + 192, 135, 1, 81, @@ -9108,8 +9569,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 224, + 51, + 160, 132, 1, 82, @@ -9150,15 +9611,15 @@ pub mod inclusion_verifier { 76, 242, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9201,15 +9662,15 @@ pub mod inclusion_verifier { 179, 15, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -9219,8 +9680,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 0, + 51, + 192, 132, 1, 82, @@ -9261,15 +9722,15 @@ pub mod inclusion_verifier { 141, 207, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9312,15 +9773,15 @@ pub mod inclusion_verifier { 38, 251, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -9330,8 +9791,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 32, + 51, + 224, 132, 1, 82, @@ -9372,15 +9833,15 @@ pub mod inclusion_verifier { 8, 51, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9423,36 +9884,36 @@ pub mod inclusion_verifier { 46, 39, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 50, - 64, + 52, + 0, 132, 1, 82, 80, 97, - 48, - 192, + 50, + 128, 130, 1, 81, 97, - 49, - 160, + 51, + 96, 131, 1, 81, @@ -9461,8 +9922,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 50, - 96, + 52, + 32, 131, 1, 82, @@ -9503,14 +9964,14 @@ pub mod inclusion_verifier { 163, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9554,14 +10015,14 @@ pub mod inclusion_verifier { 94, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -9571,8 +10032,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 128, + 52, + 64, 132, 1, 82, @@ -9614,14 +10075,14 @@ pub mod inclusion_verifier { 94, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9665,14 +10126,14 @@ pub mod inclusion_verifier { 227, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -9682,8 +10143,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 160, + 52, + 96, 132, 1, 82, @@ -9725,14 +10186,14 @@ pub mod inclusion_verifier { 232, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9776,14 +10237,14 @@ pub mod inclusion_verifier { 25, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -9793,8 +10254,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 192, + 52, + 128, 132, 1, 82, @@ -9836,14 +10297,14 @@ pub mod inclusion_verifier { 25, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -9887,35 +10348,35 @@ pub mod inclusion_verifier { 55, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 50, - 224, + 52, + 160, 132, 1, 82, 80, 97, - 49, - 0, + 50, + 192, 130, 1, 81, 97, - 49, - 128, + 51, + 64, 131, 1, 81, @@ -9924,22 +10385,22 @@ pub mod inclusion_verifier { 144, 9, 97, - 51, - 0, + 52, + 192, 131, 1, 82, 97, - 49, - 32, + 50, + 224, 130, 1, 81, 129, 129, 97, - 49, - 64, + 51, + 0, 133, 1, 81, @@ -9948,16 +10409,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 32, + 52, + 224, 132, 1, 82, 129, 129, 97, - 49, - 96, + 51, + 32, 133, 1, 81, @@ -9966,16 +10427,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 64, + 53, + 0, 132, 1, 82, 129, 129, 97, - 49, - 224, + 51, + 160, 133, 1, 81, @@ -9984,16 +10445,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 96, + 53, + 32, 132, 1, 82, 129, 129, 97, - 49, - 128, + 51, + 64, 133, 1, 81, @@ -10002,16 +10463,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 128, + 53, + 64, 132, 1, 82, 129, 129, 97, - 50, - 0, + 51, + 192, 133, 1, 81, @@ -10020,16 +10481,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 160, + 53, + 96, 132, 1, 82, 129, 129, 97, - 50, - 32, + 51, + 224, 133, 1, 81, @@ -10038,16 +10499,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 192, + 53, + 128, 132, 1, 82, 129, 129, 97, - 50, - 64, + 52, + 0, 133, 1, 81, @@ -10056,16 +10517,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 224, + 53, + 160, 132, 1, 82, 129, 129, 97, - 50, - 96, + 52, + 32, 133, 1, 81, @@ -10074,16 +10535,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 0, + 53, + 192, 132, 1, 82, 129, 129, 97, - 50, - 128, + 52, + 64, 133, 1, 81, @@ -10092,16 +10553,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 32, + 53, + 224, 132, 1, 82, 129, 129, 97, - 50, - 160, + 52, + 96, 133, 1, 81, @@ -10110,16 +10571,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 64, + 54, + 0, 132, 1, 82, 129, 129, 97, - 49, - 160, + 51, + 96, 133, 1, 81, @@ -10128,16 +10589,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 96, + 54, + 32, 132, 1, 82, 129, 129, 97, - 50, - 192, + 52, + 128, 133, 1, 81, @@ -10146,16 +10607,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 128, + 54, + 64, 132, 1, 82, 129, 129, 97, - 50, - 224, + 52, + 160, 133, 1, 81, @@ -10164,16 +10625,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 160, + 54, + 96, 132, 1, 82, 129, 129, 97, - 51, - 0, + 52, + 192, 133, 1, 81, @@ -10182,8 +10643,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 192, + 54, + 128, 132, 1, 82, @@ -10191,36 +10652,36 @@ pub mod inclusion_verifier { 96, 32, 97, - 53, - 0, + 54, + 192, 131, 1, 82, 96, 32, 97, - 53, - 32, + 54, + 224, 131, 1, 82, 96, 32, 97, - 53, - 64, + 55, + 0, 131, 1, 82, 97, - 52, - 192, + 54, + 128, 130, 1, 81, 97, - 53, - 96, + 55, + 32, 131, 1, 82, @@ -10258,8 +10719,8 @@ pub mod inclusion_verifier { 255, 255, 97, - 53, - 128, + 55, + 64, 131, 1, 82, @@ -10270,8 +10731,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -10279,8 +10740,8 @@ pub mod inclusion_verifier { 145, 82, 97, - 53, - 160, + 55, + 96, 131, 1, 82, @@ -10290,15 +10751,15 @@ pub mod inclusion_verifier { 96, 32, 97, - 52, - 224, + 54, + 160, 133, 1, 96, 192, 97, - 53, - 0, + 54, + 192, 135, 1, 96, @@ -10310,16 +10771,16 @@ pub mod inclusion_verifier { 146, 80, 97, - 52, - 224, + 54, + 160, 130, 1, 81, 96, 0, 97, - 51, - 0, + 52, + 192, 132, 1, 81, @@ -10328,15 +10789,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 160, + 54, + 96, 134, 1, 81, 9, 97, - 51, - 0, + 52, + 192, 133, 1, 82, @@ -10347,8 +10808,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 224, + 52, + 160, 132, 1, 81, @@ -10357,15 +10818,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 128, + 54, + 64, 134, 1, 81, 9, 97, - 50, - 224, + 52, + 160, 133, 1, 82, @@ -10376,8 +10837,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 192, + 52, + 128, 132, 1, 81, @@ -10386,15 +10847,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 96, + 54, + 32, 134, 1, 81, 9, 97, - 50, - 192, + 52, + 128, 133, 1, 82, @@ -10405,8 +10866,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 160, + 51, + 96, 132, 1, 81, @@ -10415,15 +10876,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 64, + 54, + 0, 134, 1, 81, 9, 97, - 49, - 160, + 51, + 96, 133, 1, 82, @@ -10434,8 +10895,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 160, + 52, + 96, 132, 1, 81, @@ -10444,15 +10905,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 32, + 53, + 224, 134, 1, 81, 9, 97, - 50, - 160, + 52, + 96, 133, 1, 82, @@ -10463,8 +10924,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 128, + 52, + 64, 132, 1, 81, @@ -10473,15 +10934,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 0, + 53, + 192, 134, 1, 81, 9, 97, - 50, - 128, + 52, + 64, 133, 1, 82, @@ -10492,8 +10953,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 96, + 52, + 32, 132, 1, 81, @@ -10502,15 +10963,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 224, + 53, + 160, 134, 1, 81, 9, 97, - 50, - 96, + 52, + 32, 133, 1, 82, @@ -10521,8 +10982,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 64, + 52, + 0, 132, 1, 81, @@ -10531,15 +10992,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 192, + 53, + 128, 134, 1, 81, 9, 97, - 50, - 64, + 52, + 0, 133, 1, 82, @@ -10550,8 +11011,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 32, + 51, + 224, 132, 1, 81, @@ -10560,15 +11021,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 160, + 53, + 96, 134, 1, 81, 9, 97, - 50, - 32, + 51, + 224, 133, 1, 82, @@ -10579,8 +11040,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 0, + 51, + 192, 132, 1, 81, @@ -10589,15 +11050,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 128, + 53, + 64, 134, 1, 81, 9, 97, - 50, - 0, + 51, + 192, 133, 1, 82, @@ -10608,8 +11069,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 128, + 51, + 64, 132, 1, 81, @@ -10618,15 +11079,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 96, + 53, + 32, 134, 1, 81, 9, 97, - 49, - 128, + 51, + 64, 133, 1, 82, @@ -10637,8 +11098,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 224, + 51, + 160, 132, 1, 81, @@ -10647,15 +11108,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 64, + 53, + 0, 134, 1, 81, 9, 97, - 49, - 224, + 51, + 160, 133, 1, 82, @@ -10666,8 +11127,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 96, + 51, + 32, 132, 1, 81, @@ -10676,15 +11137,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 32, + 52, + 224, 134, 1, 81, 9, 97, - 49, - 96, + 51, + 32, 133, 1, 82, @@ -10695,8 +11156,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 64, + 51, + 0, 132, 1, 81, @@ -10705,15 +11166,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 49, - 32, + 50, + 224, 134, 1, 81, 9, 97, - 49, - 64, + 51, + 0, 133, 1, 82, @@ -10722,16 +11183,16 @@ pub mod inclusion_verifier { 130, 9, 97, - 49, - 32, + 50, + 224, 133, 1, 129, 144, 82, 97, - 49, - 64, + 51, + 0, 133, 1, 81, @@ -10749,28 +11210,28 @@ pub mod inclusion_verifier { 129, 129, 97, - 49, - 96, + 51, + 32, 133, 1, 81, 8, 97, - 53, - 192, + 55, + 128, 132, 1, 82, 80, 97, - 49, - 128, + 51, + 64, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -10779,56 +11240,56 @@ pub mod inclusion_verifier { 144, 9, 97, - 53, - 224, + 55, + 160, 131, 1, 82, 97, - 49, - 224, + 51, + 160, 130, 1, 81, 128, 97, - 54, - 0, + 55, + 192, 132, 1, 82, 80, 128, 97, - 50, - 96, + 52, + 32, 131, 1, 81, 97, - 49, - 192, + 51, + 128, 132, 1, 81, 9, 97, - 54, - 32, + 55, + 224, 131, 1, 82, 97, - 50, - 0, + 51, + 192, 130, 1, 81, 129, 129, 97, - 50, - 32, + 51, + 224, 133, 1, 81, @@ -10838,28 +11299,28 @@ pub mod inclusion_verifier { 129, 129, 97, - 50, - 64, + 52, + 0, 133, 1, 81, 8, 97, - 54, - 64, + 56, + 0, 132, 1, 82, 80, 97, - 49, - 160, + 51, + 96, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -10868,42 +11329,42 @@ pub mod inclusion_verifier { 144, 9, 97, - 54, - 96, + 56, + 32, 131, 1, 82, 97, - 50, - 128, + 52, + 64, 130, 1, 81, 129, 129, 97, - 50, - 160, + 52, + 96, 133, 1, 81, 8, 97, - 54, - 128, + 56, + 64, 132, 1, 82, 80, 97, - 51, - 0, + 52, + 192, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -10912,42 +11373,42 @@ pub mod inclusion_verifier { 144, 9, 97, - 54, - 160, + 56, + 96, 131, 1, 82, 97, - 50, - 192, + 52, + 128, 130, 1, 81, 129, 129, 97, - 50, - 224, + 52, + 160, 133, 1, 81, 8, 97, - 54, - 192, + 56, + 128, 132, 1, 82, 80, 97, - 53, - 192, + 55, + 128, 130, 1, 81, 97, - 54, - 0, + 55, + 192, 131, 1, 81, @@ -10960,16 +11421,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 54, - 224, + 56, + 160, 132, 1, 82, 129, 129, 97, - 54, - 64, + 56, + 0, 133, 1, 81, @@ -10978,16 +11439,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 0, + 56, + 192, 132, 1, 82, 129, 129, 97, - 54, - 128, + 56, + 64, 133, 1, 81, @@ -10996,16 +11457,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 32, + 56, + 224, 132, 1, 82, 129, 129, 97, - 54, - 192, + 56, + 128, 133, 1, 81, @@ -11014,8 +11475,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 64, + 57, + 0, 132, 1, 82, @@ -11023,36 +11484,36 @@ pub mod inclusion_verifier { 96, 32, 97, - 55, - 128, + 57, + 64, 131, 1, 82, 96, 32, 97, - 55, - 160, + 57, + 96, 131, 1, 82, 96, 32, 97, - 55, - 192, + 57, + 128, 131, 1, 82, 97, - 55, - 64, + 57, + 0, 130, 1, 81, 97, - 55, - 224, + 57, + 160, 131, 1, 82, @@ -11090,8 +11551,8 @@ pub mod inclusion_verifier { 255, 255, 97, - 56, - 0, + 57, + 192, 131, 1, 82, @@ -11102,8 +11563,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -11111,8 +11572,8 @@ pub mod inclusion_verifier { 145, 82, 97, - 56, - 32, + 57, + 224, 131, 1, 82, @@ -11122,15 +11583,15 @@ pub mod inclusion_verifier { 96, 32, 97, - 55, - 96, + 57, + 32, 133, 1, 96, 192, 97, - 55, - 128, + 57, + 64, 135, 1, 96, @@ -11142,16 +11603,16 @@ pub mod inclusion_verifier { 146, 80, 97, - 55, - 96, + 57, + 32, 130, 1, 81, 96, 0, 97, - 54, - 192, + 56, + 128, 132, 1, 81, @@ -11160,15 +11621,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 55, - 32, + 56, + 224, 134, 1, 81, 9, 97, - 54, - 192, + 56, + 128, 133, 1, 82, @@ -11179,8 +11640,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 128, + 56, + 64, 132, 1, 81, @@ -11189,15 +11650,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 55, - 0, + 56, + 192, 134, 1, 81, 9, 97, - 54, - 128, + 56, + 64, 133, 1, 82, @@ -11208,8 +11669,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 64, + 56, + 0, 132, 1, 81, @@ -11218,15 +11679,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 54, - 224, + 56, + 160, 134, 1, 81, 9, 97, - 54, - 64, + 56, + 0, 133, 1, 82, @@ -11237,8 +11698,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 0, + 55, + 192, 132, 1, 81, @@ -11247,15 +11708,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 53, - 192, + 55, + 128, 134, 1, 81, 9, 97, - 54, - 0, + 55, + 192, 133, 1, 82, @@ -11264,22 +11725,22 @@ pub mod inclusion_verifier { 130, 9, 97, - 53, - 192, + 55, + 128, 133, 1, 82, 80, 80, - 97, - 54, - 0, + 97, + 55, + 192, 130, 1, 81, 97, - 53, - 224, + 55, + 160, 131, 1, 81, @@ -11288,74 +11749,74 @@ pub mod inclusion_verifier { 144, 9, 97, - 56, - 64, + 58, + 0, 131, 1, 82, 128, 97, - 54, - 64, + 56, + 0, 131, 1, 81, 97, - 54, - 32, + 55, + 224, 132, 1, 81, 9, 97, - 56, - 96, + 58, + 32, 131, 1, 82, 128, 97, - 54, - 128, + 56, + 64, 131, 1, 81, 97, - 54, - 96, + 56, + 32, 132, 1, 81, 9, 97, - 56, - 128, + 58, + 64, 131, 1, 82, 128, 97, - 54, - 192, + 56, + 128, 131, 1, 81, 97, - 54, - 160, + 56, + 96, 132, 1, 81, 9, 97, - 56, - 160, + 58, + 96, 131, 1, 82, 97, 10, - 64, + 128, 130, 1, 81, @@ -11364,8 +11825,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 56, - 192, + 58, + 128, 131, 1, 129, @@ -11373,7 +11834,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11381,8 +11842,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 56, - 224, + 58, + 160, 131, 1, 129, @@ -11390,7 +11851,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11398,8 +11859,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 0, + 58, + 192, 131, 1, 129, @@ -11407,7 +11868,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11415,8 +11876,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 32, + 58, + 224, 131, 1, 129, @@ -11424,7 +11885,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11432,8 +11893,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 64, + 59, + 0, 131, 1, 129, @@ -11441,7 +11902,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11449,8 +11910,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 96, + 59, + 32, 131, 1, 129, @@ -11458,7 +11919,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11466,8 +11927,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 128, + 59, + 64, 131, 1, 129, @@ -11475,7 +11936,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11483,8 +11944,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 160, + 59, + 96, 131, 1, 129, @@ -11492,7 +11953,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11500,8 +11961,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 192, + 59, + 128, 131, 1, 129, @@ -11509,7 +11970,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11517,8 +11978,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 224, + 59, + 160, 131, 1, 129, @@ -11526,7 +11987,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11534,8 +11995,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 0, + 59, + 192, 131, 1, 129, @@ -11543,7 +12004,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11551,8 +12012,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 32, + 59, + 224, 131, 1, 129, @@ -11560,7 +12021,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11568,8 +12029,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 64, + 60, + 0, 131, 1, 129, @@ -11577,7 +12038,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11585,8 +12046,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 96, + 60, + 32, 131, 1, 129, @@ -11594,7 +12055,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11602,8 +12063,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 128, + 60, + 64, 131, 1, 129, @@ -11611,7 +12072,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11619,8 +12080,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 160, + 60, + 96, 131, 1, 129, @@ -11628,7 +12089,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11636,8 +12097,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 192, + 60, + 128, 131, 1, 129, @@ -11645,7 +12106,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11653,8 +12114,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 224, + 60, + 160, 131, 1, 129, @@ -11662,7 +12123,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11670,8 +12131,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 0, + 60, + 192, 131, 1, 129, @@ -11679,7 +12140,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11687,14 +12148,14 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 32, + 60, + 224, 131, 1, 82, 97, 10, - 160, + 224, 130, 1, 81, @@ -11703,8 +12164,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 59, - 64, + 61, + 0, 131, 1, 129, @@ -11712,7 +12173,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -11720,8 +12181,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 96, + 61, + 32, 131, 1, 129, @@ -11729,7 +12190,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -11737,8 +12198,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 128, + 61, + 64, 131, 1, 129, @@ -11746,7 +12207,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -11754,21 +12215,21 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 160, + 61, + 96, 131, 1, 82, 128, 97, - 49, - 32, + 50, + 224, 131, 1, 81, 97, - 5, - 192, + 6, + 0, 132, 1, 81, @@ -11777,14 +12238,14 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 64, + 51, + 0, 134, 1, 81, 97, 6, - 0, + 64, 135, 1, 81, @@ -11796,30 +12257,30 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 96, + 51, + 32, 134, 1, 81, 97, 6, - 128, + 192, 135, 1, 81, 9, 8, 97, - 59, - 192, + 61, + 128, 132, 1, 129, 144, 82, 97, - 53, - 192, + 55, + 128, 132, 1, 81, @@ -11829,8 +12290,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 59, - 224, + 61, + 160, 131, 1, 82, @@ -11838,8 +12299,8 @@ pub mod inclusion_verifier { 96, 1, 97, - 59, - 224, + 61, + 160, 132, 1, 81, @@ -11847,21 +12308,21 @@ pub mod inclusion_verifier { 3, 9, 97, - 60, - 0, + 61, + 192, 131, 1, 82, 128, 97, - 49, - 32, + 50, + 224, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, @@ -11870,14 +12331,14 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 64, + 51, + 0, 134, 1, 81, 97, 6, - 32, + 96, 135, 1, 81, @@ -11889,30 +12350,30 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 96, + 51, + 32, 134, 1, 81, 97, 6, - 96, + 160, 135, 1, 81, 9, 8, 97, - 60, - 32, + 61, + 224, 132, 1, 129, 144, 82, 97, - 53, - 192, + 55, + 128, 132, 1, 81, @@ -11922,8 +12383,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 60, - 64, + 62, + 0, 131, 1, 129, @@ -11931,7 +12392,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -11941,83 +12402,15 @@ pub mod inclusion_verifier { 3, 9, 97, - 60, - 96, + 62, + 32, 131, 1, 82, 128, 97, 10, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 60, - 128, - 131, - 1, - 82, - 128, - 97, - 60, - 96, - 131, - 1, - 81, - 97, - 60, - 0, - 132, - 1, - 81, - 8, - 97, - 60, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 60, - 160, - 132, - 1, - 81, - 9, - 97, - 60, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 60, - 128, - 132, - 1, - 81, - 9, - 97, - 60, - 224, - 131, - 1, - 82, 128, - 97, - 53, - 224, 131, 1, 81, @@ -12025,62 +12418,27 @@ pub mod inclusion_verifier { 1, 9, 97, - 61, - 0, + 62, + 64, 131, 1, 82, 128, 97, - 49, - 224, - 131, - 1, - 81, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 61, + 62, 32, 131, 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, 81, - 130, - 145, - 9, - 97, - 61, - 64, - 131, - 1, - 82, - 128, - 96, - 1, 97, 61, - 64, + 192, 132, 1, 81, - 131, - 3, - 9, + 8, 97, - 61, + 62, 96, 131, 1, @@ -12089,235 +12447,146 @@ pub mod inclusion_verifier { 96, 1, 97, - 61, - 0, + 62, + 96, 132, 1, 81, 9, 97, - 61, + 62, 128, 131, 1, 82, 128, - 97, - 49, - 224, - 131, - 1, - 81, - 97, - 10, - 0, - 132, - 1, - 81, - 9, - 97, - 61, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 61, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 64, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 61, - 224, - 131, + 96, 1, - 82, - 128, 97, - 10, + 62, 64, - 131, - 1, - 81, - 97, - 61, - 0, 132, 1, 81, 9, 97, 62, - 0, + 160, 131, 1, 82, 128, 97, - 61, - 224, + 55, + 160, 131, 1, 81, - 97, - 61, 96, - 132, 1, - 81, - 8, + 9, 97, 62, - 32, + 192, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 6, - 160, + 128, 132, 1, 81, 9, 97, 62, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 62, - 96, + 224, 131, 1, 129, 144, 82, 97, - 56, - 192, + 58, + 0, 131, 1, 81, 130, 145, - 130, - 3, 9, 97, - 62, - 128, + 63, + 0, 131, 1, 82, 128, - 97, - 56, - 192, - 131, + 96, 1, - 81, 97, - 61, + 63, 0, 132, 1, 81, + 131, + 3, 9, 97, - 62, - 160, + 63, + 32, 131, 1, 82, 128, - 97, - 62, - 128, - 131, + 96, 1, - 81, 97, 62, - 32, + 192, 132, 1, 81, - 8, + 9, 97, - 62, - 192, + 63, + 64, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 6, - 192, + 10, + 64, 132, 1, 81, 9, 97, - 62, - 224, + 63, + 96, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12326,15 +12595,15 @@ pub mod inclusion_verifier { 9, 97, 63, - 0, + 128, 131, 1, 129, 144, 82, 97, - 56, - 224, + 10, + 128, 131, 1, 81, @@ -12345,54 +12614,54 @@ pub mod inclusion_verifier { 9, 97, 63, - 32, + 160, 131, 1, 82, 128, 97, - 56, - 224, + 10, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 63, - 64, + 192, 131, 1, 82, 128, 97, 63, - 32, + 160, 131, 1, 81, 97, - 62, - 192, + 63, + 32, 132, 1, 81, 8, 97, 63, - 96, + 224, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12404,16 +12673,16 @@ pub mod inclusion_verifier { 81, 9, 97, - 63, - 128, + 64, + 0, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12421,16 +12690,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 63, - 160, + 64, + 32, 131, 1, 129, 144, 82, 97, - 57, - 0, + 58, + 128, 131, 1, 81, @@ -12440,55 +12709,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 63, - 192, + 64, + 64, 131, 1, 82, 128, 97, - 57, - 0, + 58, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 63, - 224, + 64, + 96, 131, 1, 82, 128, 97, - 63, - 192, + 64, + 64, 131, 1, 81, 97, 63, - 96, + 224, 132, 1, 81, 8, 97, 64, - 0, + 128, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12501,15 +12770,15 @@ pub mod inclusion_verifier { 9, 97, 64, - 32, + 160, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12518,15 +12787,15 @@ pub mod inclusion_verifier { 9, 97, 64, - 64, + 192, 131, 1, 129, 144, 82, 97, - 57, - 32, + 58, + 160, 131, 1, 81, @@ -12537,54 +12806,54 @@ pub mod inclusion_verifier { 9, 97, 64, - 96, + 224, 131, 1, 82, 128, 97, - 57, - 32, + 58, + 160, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 64, - 128, + 65, + 0, 131, 1, 82, 128, 97, 64, - 96, + 224, 131, 1, 81, 97, 64, - 0, + 128, 132, 1, 81, 8, 97, - 64, - 160, + 65, + 32, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12596,16 +12865,16 @@ pub mod inclusion_verifier { 81, 9, 97, + 65, 64, - 192, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12613,16 +12882,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 64, - 224, + 65, + 96, 131, 1, 129, 144, 82, 97, - 57, - 64, + 58, + 192, 131, 1, 81, @@ -12633,54 +12902,54 @@ pub mod inclusion_verifier { 9, 97, 65, - 0, + 128, 131, 1, 82, 128, 97, - 57, - 64, + 58, + 192, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 65, - 32, + 160, 131, 1, 82, 128, 97, 65, - 0, + 128, 131, 1, 81, 97, - 64, - 160, + 65, + 32, 132, 1, 81, 8, 97, 65, - 64, + 192, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12693,15 +12962,15 @@ pub mod inclusion_verifier { 9, 97, 65, - 96, + 224, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12709,16 +12978,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 65, - 128, + 66, + 0, 131, 1, 129, 144, 82, 97, - 57, - 96, + 58, + 224, 131, 1, 81, @@ -12728,55 +12997,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 65, - 160, + 66, + 32, 131, 1, 82, 128, 97, - 57, - 96, + 58, + 224, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 65, - 192, + 66, + 64, 131, 1, 82, 128, 97, - 65, - 160, + 66, + 32, 131, 1, 81, 97, 65, - 64, + 192, 132, 1, 81, 8, 97, - 65, - 224, + 66, + 96, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12789,15 +13058,15 @@ pub mod inclusion_verifier { 9, 97, 66, - 0, + 128, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12806,15 +13075,15 @@ pub mod inclusion_verifier { 9, 97, 66, - 32, + 160, 131, 1, 129, 144, 82, 97, - 57, - 128, + 59, + 0, 131, 1, 81, @@ -12825,54 +13094,54 @@ pub mod inclusion_verifier { 9, 97, 66, - 64, + 192, 131, 1, 82, 128, 97, - 57, - 128, + 59, + 0, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 66, - 96, + 224, 131, 1, 82, 128, 97, 66, - 64, + 192, 131, 1, 81, 97, - 65, - 224, + 66, + 96, 132, 1, 81, 8, 97, - 66, - 128, + 67, + 0, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12884,16 +13153,16 @@ pub mod inclusion_verifier { 81, 9, 97, - 66, - 160, + 67, + 32, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12901,16 +13170,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 66, - 192, + 67, + 64, 131, 1, 129, 144, 82, 97, - 57, - 160, + 59, + 32, 131, 1, 81, @@ -12920,55 +13189,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 66, - 224, + 67, + 96, 131, 1, 82, 128, 97, - 57, - 160, + 59, + 32, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 67, - 0, + 128, 131, 1, 82, 128, 97, - 66, - 224, + 67, + 96, 131, 1, 81, 97, - 66, - 128, + 67, + 0, 132, 1, 81, 8, 97, 67, - 32, + 160, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -12981,15 +13250,15 @@ pub mod inclusion_verifier { 9, 97, 67, - 64, + 192, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -12998,15 +13267,15 @@ pub mod inclusion_verifier { 9, 97, 67, - 96, + 224, 131, 1, 129, 144, 82, 97, - 57, - 192, + 59, + 64, 131, 1, 81, @@ -13016,55 +13285,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 67, - 128, + 68, + 0, 131, 1, 82, 128, 97, - 57, - 192, + 59, + 64, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 67, - 160, + 68, + 32, 131, 1, 82, 128, 97, - 67, - 128, + 68, + 0, 131, 1, 81, 97, 67, - 32, + 160, 132, 1, 81, 8, 97, - 67, - 192, + 68, + 64, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13076,16 +13345,16 @@ pub mod inclusion_verifier { 81, 9, 97, - 67, - 224, + 68, + 96, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13094,15 +13363,15 @@ pub mod inclusion_verifier { 9, 97, 68, - 0, + 128, 131, 1, 129, 144, 82, 97, - 57, - 224, + 59, + 96, 131, 1, 81, @@ -13113,54 +13382,54 @@ pub mod inclusion_verifier { 9, 97, 68, - 32, + 160, 131, 1, 82, 128, 97, - 57, - 224, + 59, + 96, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 68, - 64, + 192, 131, 1, 82, 128, 97, 68, - 32, + 160, 131, 1, 81, 97, - 67, - 192, + 68, + 64, 132, 1, 81, 8, 97, 68, - 96, + 224, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13172,16 +13441,16 @@ pub mod inclusion_verifier { 81, 9, 97, - 68, - 128, + 69, + 0, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13189,16 +13458,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 68, - 160, + 69, + 32, 131, 1, 129, 144, 82, 97, - 58, - 0, + 59, + 128, 131, 1, 81, @@ -13208,76 +13477,76 @@ pub mod inclusion_verifier { 3, 9, 97, - 68, - 192, + 69, + 64, 131, 1, 82, 128, 97, - 58, - 0, + 59, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 68, - 224, + 69, + 96, 131, 1, 82, 128, 97, - 68, - 192, + 69, + 64, 131, 1, 81, 97, 68, - 96, + 224, 132, 1, 81, 8, 97, 69, - 0, + 128, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 32, + 0, 132, 1, 81, 9, 97, 69, - 32, + 160, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13286,15 +13555,15 @@ pub mod inclusion_verifier { 9, 97, 69, - 64, + 192, 131, 1, 129, 144, 82, 97, - 58, - 32, + 59, + 160, 131, 1, 81, @@ -13305,75 +13574,75 @@ pub mod inclusion_verifier { 9, 97, 69, - 96, + 224, 131, 1, 82, 128, 97, - 58, - 32, + 59, + 160, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 69, - 128, + 70, + 0, 131, 1, 82, 128, 97, 69, - 96, + 224, 131, 1, 81, 97, 69, - 0, + 128, 132, 1, 81, 8, 97, - 69, - 160, + 70, + 32, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 64, + 32, 132, 1, 81, 9, 97, - 69, - 192, + 70, + 64, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13381,16 +13650,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 69, - 224, + 70, + 96, 131, 1, 129, 144, 82, 97, - 58, - 64, + 59, + 192, 131, 1, 81, @@ -13401,54 +13670,54 @@ pub mod inclusion_verifier { 9, 97, 70, - 0, + 128, 131, 1, 82, 128, 97, - 58, - 64, + 59, + 192, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 70, - 32, + 160, 131, 1, 82, 128, 97, 70, - 0, + 128, 131, 1, 81, 97, - 69, - 160, + 70, + 32, 132, 1, 81, 8, 97, 70, - 64, + 192, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13461,15 +13730,15 @@ pub mod inclusion_verifier { 9, 97, 70, - 96, + 224, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13477,16 +13746,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 70, - 128, + 71, + 0, 131, 1, 129, 144, 82, 97, - 58, - 96, + 59, + 224, 131, 1, 81, @@ -13496,55 +13765,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 70, - 160, + 71, + 32, 131, 1, 82, 128, 97, - 58, - 96, + 59, + 224, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 70, - 192, + 71, + 64, 131, 1, 82, 128, 97, - 70, - 160, + 71, + 32, 131, 1, 81, 97, 70, - 64, + 192, 132, 1, 81, 8, 97, - 70, - 224, + 71, + 96, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13557,15 +13826,15 @@ pub mod inclusion_verifier { 9, 97, 71, - 0, + 128, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13574,15 +13843,15 @@ pub mod inclusion_verifier { 9, 97, 71, - 32, + 160, 131, 1, 129, 144, 82, 97, - 58, - 128, + 60, + 0, 131, 1, 81, @@ -13593,54 +13862,54 @@ pub mod inclusion_verifier { 9, 97, 71, - 64, + 192, 131, 1, 82, 128, 97, - 58, - 128, + 60, + 0, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 71, - 96, + 224, 131, 1, 82, 128, 97, 71, - 64, + 192, 131, 1, 81, 97, - 70, - 224, + 71, + 96, 132, 1, 81, 8, 97, - 71, - 128, + 72, + 0, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13652,16 +13921,16 @@ pub mod inclusion_verifier { 81, 9, 97, - 71, - 160, + 72, + 32, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13669,16 +13938,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 71, - 192, + 72, + 64, 131, 1, 129, 144, 82, 97, - 58, - 160, + 60, + 32, 131, 1, 81, @@ -13688,55 +13957,55 @@ pub mod inclusion_verifier { 3, 9, 97, - 71, - 224, + 72, + 96, 131, 1, 82, 128, 97, - 58, - 160, + 60, + 32, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 72, - 0, + 128, 131, 1, 82, 128, 97, - 71, - 224, + 72, + 96, 131, 1, 81, 97, - 71, - 128, + 72, + 0, 132, 1, 81, 8, 97, 72, - 32, + 160, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, @@ -13749,15 +14018,15 @@ pub mod inclusion_verifier { 9, 97, 72, - 64, + 192, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13766,15 +14035,15 @@ pub mod inclusion_verifier { 9, 97, 72, - 96, + 224, 131, 1, 129, 144, 82, 97, - 58, - 192, + 60, + 64, 131, 1, 81, @@ -13784,156 +14053,172 @@ pub mod inclusion_verifier { 3, 9, 97, - 72, - 128, + 73, + 0, 131, 1, 82, 128, 97, - 58, - 192, + 60, + 64, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 72, - 160, + 73, + 32, 131, 1, 82, 128, 97, - 72, - 128, + 73, + 0, 131, 1, 81, 97, 72, - 32, + 160, 132, 1, 81, 8, 97, - 72, - 192, + 73, + 64, 131, 1, 82, 128, 97, - 53, - 224, + 51, + 160, 131, 1, 81, 97, - 47, - 96, + 8, + 224, 132, 1, 81, 9, 97, - 72, - 224, + 73, + 96, 131, 1, + 129, + 144, 82, - 128, 97, - 53, - 224, + 58, + 0, 131, 1, 81, + 130, + 145, + 9, 97, - 47, + 73, 128, - 132, + 131, + 1, + 129, + 144, + 82, + 97, + 60, + 96, + 131, 1, 81, + 130, + 145, + 130, + 3, 9, 97, 73, - 0, + 160, 131, 1, 82, 128, 97, - 53, - 224, + 60, + 96, 131, 1, 81, 97, - 47, - 160, + 62, + 192, 132, 1, 81, 9, 97, 73, - 32, + 192, 131, 1, 82, 128, 97, - 53, - 224, + 73, + 160, 131, 1, 81, 97, - 47, - 192, + 73, + 64, 132, 1, 81, - 9, + 8, 97, 73, - 64, + 224, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 47, - 224, + 9, + 0, 132, 1, 81, 9, 97, - 73, - 96, + 74, + 0, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -13941,16 +14226,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 73, - 128, + 74, + 32, 131, 1, 129, 144, 82, 97, - 58, - 224, + 60, + 128, 131, 1, 81, @@ -13960,156 +14245,156 @@ pub mod inclusion_verifier { 3, 9, 97, - 73, - 160, + 74, + 64, 131, 1, 82, 128, 97, - 58, - 224, + 60, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 73, - 192, + 74, + 96, 131, 1, 82, 128, 97, - 58, - 224, + 74, + 64, 131, 1, 81, 97, - 72, + 73, 224, 132, 1, 81, - 9, + 8, 97, - 73, - 224, + 74, + 128, 131, 1, 82, 128, 97, - 58, - 224, + 55, + 160, 131, 1, 81, 97, - 73, - 0, + 49, + 32, 132, 1, 81, 9, 97, 74, - 0, + 160, 131, 1, 82, 128, 97, - 58, - 224, + 55, + 160, 131, 1, 81, 97, - 73, - 32, + 49, + 64, 132, 1, 81, 9, 97, 74, - 32, + 192, 131, 1, 82, 128, 97, - 58, - 224, + 55, + 160, 131, 1, 81, 97, - 73, - 64, + 49, + 96, 132, 1, 81, 9, 97, 74, - 64, + 224, 131, 1, 82, 128, 97, - 73, + 55, 160, 131, 1, 81, 97, - 72, - 192, + 49, + 128, 132, 1, 81, - 8, + 9, 97, - 74, - 96, + 75, + 0, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 8, - 0, + 49, + 160, 132, 1, 81, 9, 97, - 74, - 128, + 75, + 32, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -14117,16 +14402,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 74, - 160, + 75, + 64, 131, 1, 129, 144, 82, 97, - 59, - 0, + 60, + 160, 131, 1, 81, @@ -14136,184 +14421,240 @@ pub mod inclusion_verifier { 3, 9, 97, - 74, - 192, + 75, + 96, 131, 1, 82, 128, 97, - 59, - 0, + 60, + 160, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 74, - 224, + 75, + 128, 131, 1, 82, 128, 97, - 74, - 192, + 60, + 160, 131, 1, 81, 97, 74, - 96, + 160, 132, 1, 81, - 8, + 9, 97, 75, - 0, + 160, 131, 1, - 129, - 144, 82, + 128, 97, - 10, + 60, 160, 131, 1, 81, - 130, - 145, + 97, + 74, + 192, + 132, + 1, + 81, 9, 97, 75, - 32, + 192, 131, 1, 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 61, - 128, + 74, + 224, 132, 1, 81, 9, 97, 75, - 64, + 224, 131, 1, 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 62, + 75, 0, 132, 1, 81, 9, 97, - 75, - 96, + 76, + 0, 131, 1, 82, 128, 97, - 10, - 160, + 75, + 96, 131, 1, 81, 97, - 62, - 160, + 74, + 128, 132, 1, 81, - 9, + 8, 97, - 75, - 128, + 76, + 32, 131, 1, 82, 128, 97, - 10, + 51, 160, 131, 1, 81, 97, - 63, + 8, 64, 132, 1, 81, 9, 97, - 75, - 160, + 76, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 76, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 60, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 76, + 128, 131, 1, 82, 128, 97, - 10, - 160, + 60, + 192, 131, 1, 81, 97, - 63, - 224, + 62, + 192, 132, 1, 81, 9, 97, - 75, - 192, + 76, + 160, 131, 1, 82, 128, 97, - 10, - 160, + 76, + 128, 131, 1, 81, 97, - 64, - 128, + 76, + 32, 132, 1, 81, + 8, + 97, + 76, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 224, + 131, + 1, + 81, + 130, + 145, 9, 97, - 75, + 76, 224, 131, 1, @@ -14321,19 +14662,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 65, - 32, + 63, + 64, 132, 1, 81, 9, 97, - 76, + 77, 0, 131, 1, @@ -14341,19 +14682,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 65, + 63, 192, 132, 1, 81, 9, 97, - 76, + 77, 32, 131, 1, @@ -14361,19 +14702,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 66, + 64, 96, 132, 1, 81, 9, 97, - 76, + 77, 64, 131, 1, @@ -14381,19 +14722,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 67, + 65, 0, 132, 1, 81, 9, 97, - 76, + 77, 96, 131, 1, @@ -14401,19 +14742,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 67, + 65, 160, 132, 1, 81, 9, 97, - 76, + 77, 128, 131, 1, @@ -14421,19 +14762,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 68, + 66, 64, 132, 1, 81, 9, 97, - 76, + 77, 160, 131, 1, @@ -14441,19 +14782,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 68, + 66, 224, 132, 1, 81, 9, 97, - 76, + 77, 192, 131, 1, @@ -14461,19 +14802,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 69, + 67, 128, 132, 1, 81, 9, 97, - 76, + 77, 224, 131, 1, @@ -14481,19 +14822,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 70, + 68, 32, 132, 1, 81, 9, 97, - 77, + 78, 0, 131, 1, @@ -14501,19 +14842,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 70, + 68, 192, 132, 1, 81, 9, 97, - 77, + 78, 32, 131, 1, @@ -14521,19 +14862,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 71, + 69, 96, 132, 1, 81, 9, 97, - 77, + 78, 64, 131, 1, @@ -14541,19 +14882,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 72, + 70, 0, 132, 1, 81, 9, 97, - 77, + 78, 96, 131, 1, @@ -14561,19 +14902,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 72, + 70, 160, 132, 1, 81, 9, 97, - 77, + 78, 128, 131, 1, @@ -14581,19 +14922,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 73, - 192, + 71, + 64, 132, 1, 81, 9, 97, - 77, + 78, 160, 131, 1, @@ -14601,19 +14942,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 73, + 71, 224, 132, 1, 81, 9, 97, - 77, + 78, 192, 131, 1, @@ -14621,19 +14962,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, - 0, + 72, + 128, 132, 1, 81, 9, 97, - 77, + 78, 224, 131, 1, @@ -14641,19 +14982,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, + 73, 32, 132, 1, 81, 9, 97, - 78, + 79, 0, 131, 1, @@ -14661,19 +15002,19 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, - 64, + 73, + 192, 132, 1, 81, 9, 97, - 78, + 79, 32, 131, 1, @@ -14681,232 +15022,167 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, 74, - 224, + 96, 132, 1, 81, 9, 97, - 78, + 79, 64, 131, 1, 82, 128, 97, - 75, - 32, + 10, + 224, 131, 1, 81, 97, - 60, - 192, + 75, + 128, 132, 1, 81, - 8, + 9, 97, - 78, + 79, 96, 131, 1, 82, 128, 97, - 54, - 32, + 10, + 224, 131, 1, 81, - 96, + 97, + 75, + 160, + 132, 1, + 81, 9, 97, - 78, + 79, 128, 131, 1, 82, 128, 97, - 50, - 0, - 131, - 1, - 81, - 97, - 8, + 10, 224, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 50, - 32, - 134, - 1, - 81, - 97, - 9, - 0, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, 131, - 97, - 50, - 64, - 134, - 1, - 81, - 97, - 9, - 32, - 135, 1, 81, - 9, - 8, - 97, - 78, - 160, - 132, - 1, - 129, - 144, - 82, 97, - 56, - 96, + 75, + 192, 132, 1, 81, - 131, - 146, - 80, - 144, 9, 97, - 78, - 192, + 79, + 160, 131, 1, 82, 128, - 96, - 1, - 97, - 78, - 192, - 132, - 1, - 81, - 131, - 3, - 9, 97, - 78, + 10, 224, 131, 1, - 82, - 128, - 96, - 1, + 81, 97, - 78, - 128, + 75, + 224, 132, 1, 81, 9, 97, 79, - 0, + 192, 131, 1, 82, 128, 97, - 59, - 64, + 10, + 224, 131, 1, 81, 97, - 78, - 224, + 76, + 0, 132, 1, 81, 9, 97, 79, - 32, + 224, 131, 1, 82, 128, 97, - 59, - 64, + 10, + 224, 131, 1, 81, 97, - 79, - 0, + 76, + 160, 132, 1, 81, 9, 97, - 79, - 64, + 80, + 0, 131, 1, 82, 128, 97, - 79, - 32, + 76, + 224, 131, 1, 81, 97, - 78, - 96, + 62, + 128, 132, 1, 81, 8, 97, - 79, - 96, + 80, + 32, 131, 1, 82, 128, 97, - 54, - 96, + 55, + 224, 131, 1, 81, @@ -14914,21 +15190,21 @@ pub mod inclusion_verifier { 1, 9, 97, - 79, - 128, + 80, + 64, 131, 1, 82, 128, 97, - 50, - 128, + 51, + 192, 131, 1, 81, 97, 9, - 64, + 32, 132, 1, 81, @@ -14937,8 +15213,27 @@ pub mod inclusion_verifier { 129, 131, 97, - 50, - 160, + 51, + 224, + 134, + 1, + 81, + 97, + 9, + 64, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 52, + 0, 134, 1, 81, @@ -14951,16 +15246,16 @@ pub mod inclusion_verifier { 9, 8, 97, - 79, - 160, + 80, + 96, 132, 1, 129, 144, 82, 97, - 56, - 128, + 58, + 32, 132, 1, 81, @@ -14970,8 +15265,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 79, - 192, + 80, + 128, 131, 1, 82, @@ -14979,8 +15274,8 @@ pub mod inclusion_verifier { 96, 1, 97, - 79, - 192, + 80, + 128, 132, 1, 81, @@ -14988,8 +15283,8 @@ pub mod inclusion_verifier { 3, 9, 97, - 79, - 224, + 80, + 160, 131, 1, 82, @@ -14997,230 +15292,188 @@ pub mod inclusion_verifier { 96, 1, 97, - 79, - 128, + 80, + 64, 132, 1, 81, 9, 97, 80, - 0, + 192, 131, 1, 82, 128, 97, - 50, - 128, + 61, + 0, 131, 1, 81, 97, - 9, - 128, + 80, + 160, 132, 1, 81, 9, - 129, - 129, + 97, + 80, + 224, 131, + 1, + 82, + 128, 97, - 50, - 160, - 134, + 61, + 0, + 131, 1, 81, 97, - 9, - 160, - 135, + 80, + 192, + 132, 1, 81, 9, - 8, 97, - 80, - 32, - 132, + 81, + 0, + 131, 1, - 129, - 144, 82, - 97, - 56, 128, - 132, + 97, + 80, + 224, + 131, 1, 81, - 131, - 146, - 80, - 144, - 9, 97, 80, - 64, + 32, + 132, + 1, + 81, + 8, + 97, + 81, + 32, 131, 1, - 129, - 144, 82, + 128, 97, - 10, - 64, + 56, + 32, 131, 1, 81, - 130, - 145, - 130, - 3, + 96, + 1, 9, 97, - 80, - 96, + 81, + 64, 131, 1, 82, 128, 97, - 10, + 52, 64, 131, 1, 81, 97, - 79, + 9, 128, 132, 1, 81, 9, - 97, - 80, - 128, + 129, + 129, 131, - 1, - 82, - 128, 97, - 80, + 52, 96, - 131, + 134, 1, 81, 97, - 79, - 224, - 132, + 9, + 160, + 135, 1, 81, + 9, 8, 97, - 80, - 160, - 131, + 81, + 96, + 132, 1, 129, 144, 82, 97, - 59, - 96, - 131, + 58, + 64, + 132, 1, 81, - 130, - 145, - 9, - 97, - 80, - 192, - 131, - 1, - 82, - 128, - 97, - 59, - 96, 131, - 1, - 81, - 97, + 146, 80, - 0, - 132, - 1, - 81, + 144, 9, 97, - 80, - 224, + 81, + 128, 131, 1, 82, 128, - 97, - 59, 96, - 131, 1, - 81, 97, - 80, + 81, 128, 132, 1, 81, + 131, + 3, 9, 97, 81, - 0, + 160, 131, 1, 82, 128, - 97, - 80, - 192, - 131, - 1, - 81, - 97, - 79, 96, - 132, 1, - 81, - 8, 97, 81, - 32, - 131, - 1, - 82, - 128, - 97, - 54, - 160, - 131, + 64, + 132, 1, 81, - 96, - 1, 9, 97, 81, - 64, + 192, 131, 1, 82, 128, 97, - 50, - 192, + 52, + 64, 131, 1, 81, @@ -15235,8 +15488,8 @@ pub mod inclusion_verifier { 129, 131, 97, - 50, - 224, + 52, + 96, 134, 1, 81, @@ -15250,15 +15503,15 @@ pub mod inclusion_verifier { 8, 97, 81, - 96, + 224, 132, 1, 129, 144, 82, 97, - 56, - 160, + 58, + 64, 132, 1, 81, @@ -15268,32 +15521,37 @@ pub mod inclusion_verifier { 144, 9, 97, - 81, - 128, + 82, + 0, 131, 1, + 129, + 144, 82, - 128, - 96, - 1, 97, - 81, + 10, 128, - 132, + 131, 1, 81, - 131, + 130, + 145, + 130, 3, 9, 97, - 81, - 160, + 82, + 32, 131, 1, 82, 128, - 96, + 97, + 10, + 128, + 131, 1, + 81, 97, 81, 64, @@ -15302,15 +15560,15 @@ pub mod inclusion_verifier { 81, 9, 97, - 81, - 192, + 82, + 64, 131, 1, 82, 128, 97, - 59, - 128, + 82, + 32, 131, 1, 81, @@ -15320,17 +15578,34 @@ pub mod inclusion_verifier { 132, 1, 81, - 9, + 8, + 97, + 82, + 96, + 131, + 1, + 129, + 144, + 82, 97, + 61, + 32, + 131, + 1, 81, - 224, + 130, + 145, + 9, + 97, + 82, + 128, 131, 1, 82, 128, 97, - 59, - 128, + 61, + 32, 131, 1, 81, @@ -15343,50 +15618,54 @@ pub mod inclusion_verifier { 9, 97, 82, - 0, + 160, 131, 1, 82, 128, 97, - 81, - 224, + 61, + 32, 131, 1, 81, 97, - 81, - 32, + 82, + 64, 132, 1, 81, - 8, + 9, 97, 82, - 32, + 192, 131, 1, 82, 128, 97, - 49, - 192, + 82, + 128, 131, 1, 81, - 96, + 97, + 81, + 32, + 132, 1, - 9, + 81, + 8, 97, 82, - 64, + 224, 131, 1, 82, 128, 97, - 11, - 64, + 56, + 96, 131, 1, 81, @@ -15394,313 +15673,232 @@ pub mod inclusion_verifier { 1, 9, 97, - 82, - 96, + 83, + 0, 131, 1, 82, - 96, - 1, + 128, 97, - 82, + 52, 128, 131, 1, - 129, - 129, - 82, - 96, - 2, - 97, - 82, - 160, - 133, - 1, - 82, - 97, - 82, - 32, - 132, - 1, 81, 97, - 82, - 192, - 133, - 1, - 82, + 10, + 0, 132, - 145, - 144, - 96, - 64, - 144, - 96, - 96, - 129, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 82, - 128, - 130, 1, 81, - 97, - 82, - 224, + 9, + 129, + 129, 131, - 1, - 82, 97, - 82, + 52, 160, - 130, + 134, 1, 81, 97, - 83, - 0, - 131, - 1, - 82, - 96, - 96, - 130, + 10, + 32, + 135, 1, 81, + 9, + 8, 97, 83, 32, - 131, + 132, 1, + 129, + 144, 82, + 97, + 58, 96, - 128, - 130, + 132, 1, 81, + 131, + 146, + 80, + 144, + 9, 97, 83, 64, 131, 1, 82, - 130, - 96, - 1, + 128, 96, - 64, - 97, - 82, - 224, - 133, 1, - 96, - 128, 97, - 82, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 96, - 160, - 130, + 83, + 64, + 132, 1, 81, + 131, + 3, + 9, 97, 83, 96, 131, 1, 82, + 128, 96, - 192, - 130, + 1, + 97, + 83, + 0, + 132, 1, 81, + 9, 97, 83, 128, 131, 1, 82, + 128, 97, - 60, - 224, - 130, + 61, + 64, + 131, 1, 81, 97, 83, - 160, - 131, - 1, - 82, - 130, 96, + 132, 1, - 96, - 64, + 81, + 9, 97, 83, - 96, - 133, + 160, + 131, 1, - 96, - 96, + 82, + 128, 97, - 83, - 96, - 135, + 61, + 64, + 131, 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, + 81, 97, - 82, - 224, - 130, + 83, + 128, + 132, 1, 81, + 9, 97, 83, 192, 131, 1, 82, + 128, 97, 83, - 0, - 130, + 160, + 131, + 1, + 81, + 97, + 82, + 224, + 132, 1, 81, + 8, 97, 83, 224, 131, 1, 82, + 128, 97, - 83, - 96, - 130, + 51, + 128, + 131, 1, 81, + 96, + 1, + 9, 97, 84, 0, 131, 1, 82, + 128, 97, - 83, + 11, 128, - 130, + 131, 1, 81, + 96, + 1, + 9, 97, 84, 32, 131, 1, 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 192, - 133, - 1, - 96, - 128, - 97, - 83, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, 96, - 224, - 130, 1, - 81, 97, 84, 64, 131, 1, + 129, + 129, 82, - 97, - 1, - 0, - 130, - 1, - 81, + 96, + 2, 97, 84, 96, - 131, + 133, 1, 82, 97, - 75, - 64, - 130, + 83, + 224, + 132, 1, 81, 97, 84, 128, - 131, + 133, 1, 82, - 130, - 96, - 1, + 132, + 145, + 144, 96, 64, - 97, - 84, - 64, - 133, - 1, + 144, 96, 96, - 97, - 84, - 64, - 135, - 1, + 129, 96, 7, 90, @@ -15710,8 +15908,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 83, - 192, + 84, + 64, 130, 1, 81, @@ -15722,8 +15920,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 83, - 224, + 84, + 96, 130, 1, 81, @@ -15733,9 +15931,8 @@ pub mod inclusion_verifier { 131, 1, 82, - 97, - 84, - 64, + 96, + 160, 130, 1, 81, @@ -15745,9 +15942,8 @@ pub mod inclusion_verifier { 131, 1, 82, - 97, - 84, 96, + 192, 130, 1, 81, @@ -15782,9 +15978,8 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 1, - 192, + 96, + 224, 130, 1, 81, @@ -15796,7 +15991,7 @@ pub mod inclusion_verifier { 82, 97, 1, - 224, + 0, 130, 1, 81, @@ -15807,8 +16002,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 96, + 62, + 160, 130, 1, 81, @@ -15916,78 +16111,24 @@ pub mod inclusion_verifier { 22, 146, 80, - 127, - 41, - 30, - 77, - 180, - 60, - 38, - 7, - 38, - 185, - 28, - 83, - 89, - 23, - 168, + 97, 1, - 189, - 224, - 107, - 231, - 247, - 207, - 69, + 32, + 130, 1, - 9, - 9, - 118, - 35, - 19, - 219, - 66, - 82, - 144, + 81, 97, 86, 0, 131, 1, 82, - 127, - 21, - 78, - 127, - 225, - 88, - 71, - 172, - 77, - 28, - 217, - 63, - 166, - 200, - 32, - 150, - 114, - 207, - 204, - 244, - 90, - 216, - 225, - 58, - 184, - 47, - 198, - 177, - 103, - 186, - 25, - 148, - 252, + 97, + 1, + 64, + 130, + 1, + 81, 97, 86, 32, @@ -15995,8 +16136,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 128, + 77, + 0, 130, 1, 81, @@ -16094,87 +16235,33 @@ pub mod inclusion_verifier { 97, 86, 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 23, - 107, - 16, - 212, - 2, - 250, - 192, - 91, - 252, - 152, - 34, - 52, - 245, - 11, - 48, - 90, - 208, - 103, - 225, - 34, - 241, - 104, - 42, - 75, - 156, - 75, - 217, - 139, - 218, - 145, - 145, - 157, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 2, + 0, + 130, + 1, + 81, 97, 86, 224, 131, 1, 82, - 127, - 29, - 98, - 231, - 141, - 101, - 94, - 63, - 199, - 65, - 136, - 102, - 103, - 56, - 252, - 166, - 82, - 74, - 113, - 47, - 26, - 60, - 76, - 207, - 221, - 15, - 164, - 79, - 62, - 44, - 132, - 156, + 97, + 2, + 32, + 130, + 1, 81, 97, 87, @@ -16183,8 +16270,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 160, + 77, + 32, 130, 1, 81, @@ -16293,38 +16380,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 1, - 157, - 215, - 238, + 41, + 155, + 18, + 230, 83, + 153, + 220, + 234, + 63, + 30, + 12, + 224, + 70, + 207, + 95, + 147, + 206, + 123, + 169, + 247, + 121, + 191, + 163, + 158, + 127, + 12, + 109, + 76, 25, + 98, + 138, 144, - 211, - 53, - 170, - 216, - 246, - 76, - 38, - 161, - 188, - 7, - 43, - 71, - 167, - 239, - 212, - 80, - 68, - 4, - 210, - 233, - 94, - 32, - 37, - 7, - 89, 97, 87, 192, @@ -16332,38 +16419,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 12, - 65, + 33, + 197, + 119, + 18, + 42, 61, - 216, - 229, + 31, + 77, 1, - 137, - 160, - 90, - 55, - 70, - 121, - 186, + 155, + 147, 231, - 47, - 114, - 79, - 123, - 113, - 233, - 86, - 195, - 44, - 8, + 36, + 217, 129, - 234, - 55, - 105, - 66, - 118, - 234, - 131, + 176, + 101, + 62, + 217, + 79, + 73, + 46, + 175, + 236, + 80, + 148, + 82, + 49, + 147, + 95, + 154, + 149, 97, 87, 224, @@ -16371,8 +16458,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 192, + 77, + 64, 130, 1, 81, @@ -16481,38 +16568,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 48, + 25, + 217, + 34, + 1, + 65, + 190, + 242, + 89, + 33, + 212, + 116, + 198, + 230, + 52, + 208, + 109, + 251, + 125, 121, - 157, - 91, - 254, - 193, - 206, - 252, - 90, - 175, - 252, - 255, - 227, - 243, - 221, - 73, - 27, - 43, - 252, - 175, - 159, - 85, - 63, - 148, - 222, - 97, - 69, - 237, - 71, - 66, - 175, + 4, + 229, + 154, + 78, + 196, + 134, + 161, + 72, + 176, + 11, + 253, + 56, + 163, 97, 88, 160, @@ -16520,38 +16607,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, - 173, - 74, - 240, - 130, - 233, - 107, - 20, - 185, - 166, - 218, - 128, - 244, - 250, - 19, - 52, - 242, + 47, + 56, + 81, + 30, 83, - 196, - 88, - 173, - 213, - 49, + 104, + 128, + 86, + 182, + 147, 200, - 217, - 248, - 178, + 78, + 246, + 154, + 122, + 226, + 185, + 171, + 72, + 41, + 6, + 220, + 70, + 174, + 157, + 149, + 34, + 253, 60, - 94, - 203, - 156, - 67, + 224, + 152, + 182, 97, 88, 192, @@ -16559,8 +16646,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 224, + 77, + 96, 130, 1, 81, @@ -16669,38 +16756,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 34, - 225, - 205, - 191, - 255, - 207, - 207, - 79, - 24, - 207, - 67, - 66, - 237, - 241, - 251, - 38, - 195, - 182, - 229, - 42, + 23, + 231, + 203, + 106, + 48, + 196, 206, + 154, 61, - 95, - 173, - 207, - 92, - 194, - 97, - 67, - 51, - 186, - 164, + 141, + 230, + 4, + 219, + 175, + 81, + 123, + 31, + 35, + 228, + 64, + 172, + 185, + 231, + 52, + 89, + 56, + 255, + 91, + 36, + 90, + 64, + 62, 97, 89, 128, @@ -16708,38 +16795,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 40, - 223, - 114, - 220, - 198, - 156, - 198, - 68, + 28, + 49, + 164, 45, - 114, + 125, + 163, + 96, + 204, + 232, + 38, + 46, + 33, + 251, + 154, + 94, + 242, + 106, + 35, + 235, + 188, 246, - 147, - 102, - 25, - 151, - 72, - 10, - 145, - 58, - 195, - 83, - 137, - 14, - 253, - 99, - 168, - 115, - 149, - 151, - 39, - 192, + 153, + 92, + 202, + 184, + 154, + 238, + 64, + 12, + 46, + 153, + 75, 97, 89, 160, @@ -16747,8 +16834,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 0, + 77, + 128, 130, 1, 81, @@ -16857,38 +16944,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 11, - 48, - 254, + 5, + 89, + 28, + 127, + 170, + 44, + 158, + 175, + 28, 149, - 129, - 166, - 199, - 0, - 100, - 227, - 179, - 84, - 70, - 178, - 67, - 56, - 66, - 219, - 118, - 232, - 250, - 213, - 71, - 251, - 177, - 238, - 105, - 145, - 100, 115, - 247, + 168, + 75, + 221, + 236, + 48, + 50, + 25, + 171, + 244, + 150, + 175, + 8, + 153, 237, + 67, + 136, + 83, + 34, + 125, + 208, + 86, 97, 90, 96, @@ -16896,38 +16983,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 110, - 15, - 135, - 214, - 25, - 227, - 254, - 218, - 200, - 163, - 215, - 68, - 46, - 243, - 79, - 182, - 86, - 108, - 233, - 175, - 90, - 49, - 87, - 88, - 192, - 194, - 184, - 0, - 12, + 44, + 250, + 36, + 253, + 229, + 118, + 117, + 11, + 64, 54, - 207, + 223, + 254, + 64, + 16, + 94, + 107, + 114, + 68, + 246, + 56, + 67, + 236, + 116, + 217, + 208, + 170, + 212, + 139, + 164, + 19, + 40, + 124, 97, 90, 128, @@ -16935,8 +17022,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 32, + 77, + 160, 130, 1, 81, @@ -17045,38 +17132,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 20, - 230, - 106, - 119, - 30, - 240, - 140, - 202, - 5, - 81, - 194, - 107, - 52, - 57, - 212, - 157, - 57, - 27, - 162, - 29, - 145, - 183, - 6, - 223, - 44, - 75, - 31, - 23, - 125, - 119, - 89, + 34, + 225, + 205, + 191, + 255, + 207, + 207, + 79, + 24, + 207, + 67, + 66, + 237, + 241, + 251, + 38, + 195, + 182, 229, + 42, + 206, + 61, + 95, + 173, + 207, + 92, + 194, + 97, + 67, + 51, + 186, + 164, 97, 91, 64, @@ -17084,38 +17171,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 5, - 50, + 14, + 40, + 223, 114, - 58, - 38, 220, - 146, - 143, - 67, - 3, - 62, - 250, - 239, - 142, - 74, - 162, + 198, + 156, + 198, + 68, + 45, + 114, + 246, + 147, + 102, + 25, + 151, + 72, + 10, + 145, + 58, + 195, + 83, + 137, + 14, + 253, + 99, + 168, 115, + 149, + 151, 39, - 114, - 186, - 65, - 75, - 29, - 173, - 206, - 31, - 231, - 208, - 179, - 13, - 153, - 210, + 192, 97, 91, 96, @@ -17123,8 +17210,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 64, + 77, + 192, 130, 1, 81, @@ -17233,38 +17320,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 116, + 25, + 32, + 107, + 235, + 197, + 204, + 74, + 91, + 105, + 44, + 88, + 188, + 97, + 231, 174, - 28, - 66, - 48, - 189, - 205, - 210, - 92, - 228, - 96, - 239, - 115, 198, - 137, - 228, - 34, - 126, - 223, + 211, + 251, + 184, + 52, + 78, + 57, + 161, + 51, + 105, + 159, + 116, + 230, + 244, 14, - 199, 194, - 190, - 133, - 239, - 141, - 117, - 89, - 46, - 27, - 54, + 168, 97, 92, 32, @@ -17272,38 +17359,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 47, - 216, - 62, - 110, - 7, - 204, - 53, - 117, - 90, - 4, + 6, + 120, + 199, + 189, + 209, + 65, + 189, + 38, + 203, + 233, 51, - 127, - 215, - 10, - 248, - 170, - 49, - 252, - 116, - 222, - 7, - 165, - 57, - 184, - 168, - 117, - 108, - 170, - 96, - 208, - 72, - 144, + 111, + 93, + 207, + 28, + 90, + 140, + 242, + 26, + 89, + 39, + 175, + 209, + 178, + 243, + 147, + 21, + 46, + 224, + 42, + 106, + 120, 97, 92, 64, @@ -17311,8 +17398,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 96, + 77, + 224, 130, 1, 81, @@ -17422,37 +17509,37 @@ pub mod inclusion_verifier { 80, 127, 28, - 111, - 147, - 174, - 247, - 149, - 245, - 37, + 110, + 35, + 67, + 51, + 55, + 131, + 180, + 244, + 138, + 231, + 210, + 104, + 26, + 251, + 60, + 223, + 106, + 77, + 251, 200, - 181, - 27, - 203, - 2, - 52, - 187, - 52, - 89, - 66, - 204, - 49, - 120, - 43, - 247, + 58, 80, - 150, - 255, - 242, - 112, - 127, - 62, - 75, - 159, + 12, + 176, + 109, + 179, + 38, + 90, + 211, + 229, + 213, 97, 93, 0, @@ -17460,38 +17547,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 27, - 248, - 75, - 118, - 24, - 113, - 163, - 49, - 27, - 9, + 26, + 61, + 131, 109, - 135, - 5, - 52, - 176, + 67, + 37, + 255, + 48, + 20, + 76, + 30, + 32, + 56, 164, - 176, - 149, - 51, - 12, 212, + 2, 95, - 190, - 123, - 187, - 245, - 179, - 83, - 169, - 128, - 195, - 157, + 208, + 240, + 26, + 242, + 76, + 253, + 141, + 253, + 84, + 1, + 142, + 100, + 243, + 176, + 152, 97, 93, 32, @@ -17499,8 +17586,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 128, + 78, + 0, 130, 1, 81, @@ -17609,38 +17696,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 96, - 155, - 167, - 145, - 240, - 237, - 93, - 86, - 144, - 145, - 4, - 28, - 128, - 9, - 116, - 184, - 68, - 11, + 32, + 59, + 33, + 166, + 72, + 251, + 251, + 150, + 69, + 150, + 64, + 187, 197, - 192, - 249, - 125, + 180, + 24, + 82, + 221, + 30, + 252, + 18, + 9, + 200, 155, - 98, - 149, - 161, 99, - 33, - 117, - 17, - 108, + 91, + 166, + 56, + 220, + 185, + 41, + 218, + 107, 97, 93, 224, @@ -17648,38 +17735,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 219, 4, - 18, - 243, - 142, - 26, - 25, - 83, + 231, + 0, + 47, + 6, + 242, + 9, 26, - 251, - 209, - 201, - 96, + 68, + 175, + 205, 49, + 30, + 147, + 194, + 47, 70, - 231, - 189, - 28, - 52, - 169, - 61, - 246, - 190, - 76, + 221, + 159, + 50, + 7, + 181, + 188, + 195, + 79, + 12, + 167, 101, - 177, - 38, - 227, - 83, - 123, - 104, + 32, + 152, + 240, + 151, 97, 94, 0, @@ -17687,8 +17774,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 160, + 78, + 32, 130, 1, 81, @@ -17797,38 +17884,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 14, - 149, - 91, - 137, - 236, - 165, - 252, - 52, - 210, - 23, 32, - 34, - 248, - 157, - 196, - 103, - 172, + 171, + 116, + 144, + 180, + 47, + 63, + 123, + 43, + 11, + 190, + 96, + 26, + 9, + 215, 46, - 132, - 201, + 233, + 63, 146, - 158, - 28, - 224, - 194, - 168, - 206, - 131, - 28, - 93, - 215, + 72, 1, + 213, + 151, + 244, + 140, + 242, + 212, + 67, + 117, + 29, + 95, + 145, 97, 94, 192, @@ -17836,38 +17923,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 207, - 146, - 154, - 220, - 230, - 20, - 176, - 136, - 200, + 43, + 202, + 47, + 23, + 98, + 148, + 106, + 5, + 251, + 22, + 50, + 85, + 12, + 108, + 177, 44, - 179, - 147, - 79, - 30, - 183, - 84, - 109, - 210, - 228, - 131, - 150, - 233, - 20, - 180, - 255, - 6, - 236, - 69, - 222, - 158, - 138, + 2, + 209, + 141, + 155, + 238, + 91, + 221, + 66, + 18, + 202, + 115, + 66, + 136, + 135, + 32, + 253, 97, 94, 224, @@ -17875,8 +17962,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 192, + 78, + 64, 130, 1, 81, @@ -17985,38 +18072,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, + 9, + 227, + 48, + 50, 69, - 49, - 164, - 117, - 40, - 230, - 66, - 248, - 246, - 149, - 74, - 63, - 63, - 249, - 246, - 7, - 46, - 56, - 211, - 14, - 46, - 13, - 16, - 141, - 28, - 172, - 32, - 29, - 75, - 104, - 77, + 227, + 176, + 10, + 202, + 137, + 78, + 159, + 186, + 61, + 81, + 132, + 255, + 55, + 57, + 198, + 100, + 227, + 99, + 242, + 5, + 212, + 47, + 238, + 227, + 39, + 182, + 170, 97, 95, 160, @@ -18024,38 +18111,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 21, - 76, - 64, - 155, + 19, + 206, + 146, + 40, + 60, + 198, + 246, + 72, 189, - 23, + 218, + 134, + 24, + 45, + 145, + 133, + 42, + 171, + 92, 96, - 236, + 136, + 171, + 0, + 141, + 156, + 219, 85, - 99, - 157, - 50, - 213, - 129, - 124, - 147, - 153, - 229, - 115, - 178, - 42, - 143, - 221, - 165, - 247, - 7, - 201, - 185, - 222, - 29, - 76, - 166, + 34, + 252, + 191, + 92, + 98, + 137, 97, 95, 192, @@ -18063,8 +18150,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 224, + 78, + 96, 130, 1, 81, @@ -18173,38 +18260,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 36, - 2, + 8, + 165, + 3, + 231, + 161, + 102, + 132, + 168, + 25, + 145, 219, + 252, + 94, + 200, + 76, + 159, 75, - 28, - 119, - 70, - 220, - 217, - 254, - 126, - 171, - 130, - 171, - 63, - 167, - 235, - 177, - 189, - 53, - 42, - 154, - 249, - 78, - 246, - 129, - 27, - 42, - 249, - 171, - 111, - 142, + 15, + 122, + 80, + 109, + 223, + 38, + 182, + 125, + 48, + 94, + 191, + 192, + 248, + 23, + 67, 97, 96, 128, @@ -18212,38 +18299,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 42, - 0, - 71, - 236, 8, 162, - 84, - 117, - 60, - 70, - 102, - 72, - 240, - 220, - 110, - 7, - 126, - 136, - 229, - 73, - 88, - 41, - 195, - 168, - 69, - 135, - 59, - 144, - 88, - 191, - 68, - 7, + 216, + 225, + 118, + 15, + 251, + 22, + 247, + 1, + 71, + 248, + 180, + 78, + 120, + 28, + 237, + 101, + 161, + 230, + 119, + 167, + 134, + 205, + 216, + 188, + 159, + 148, + 123, + 54, + 19, + 28, 97, 96, 160, @@ -18251,8 +18338,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 0, + 78, + 128, 130, 1, 81, @@ -18361,38 +18448,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 118, - 199, - 241, - 84, - 247, - 3, - 103, - 42, + 37, + 99, + 43, + 200, + 1, + 44, + 108, + 188, + 109, 221, - 116, - 255, - 235, - 198, - 255, 166, - 21, - 155, - 78, - 82, - 127, - 10, - 67, + 97, + 169, + 114, + 159, 84, - 182, + 76, + 84, + 98, + 7, + 0, + 195, + 132, + 12, 1, - 250, - 205, + 202, + 91, 87, - 255, - 26, + 230, 26, + 31, + 254, 97, 97, 96, @@ -18400,38 +18487,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 39, - 193, - 2, - 144, - 247, - 48, - 237, - 173, - 155, - 203, - 37, - 56, - 5, - 111, - 117, - 94, - 254, - 169, - 36, - 176, - 166, - 157, - 134, - 213, - 201, - 200, - 51, - 113, - 126, - 115, - 14, + 43, + 165, + 118, + 76, + 102, + 58, + 75, 40, + 146, + 52, + 60, + 48, + 61, + 160, + 245, + 102, + 78, + 63, + 98, + 13, + 214, + 184, + 81, + 167, + 17, + 120, + 23, + 4, + 41, + 47, + 209, + 26, 97, 97, 128, @@ -18439,8 +18526,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 32, + 78, + 160, 130, 1, 81, @@ -18550,37 +18637,37 @@ pub mod inclusion_verifier { 80, 127, 7, - 67, - 234, - 64, - 241, - 64, - 132, - 219, - 38, - 115, - 33, - 114, - 131, - 170, - 5, - 63, - 152, - 104, + 207, + 228, + 243, + 21, + 43, + 25, 150, - 238, - 124, - 24, - 31, - 82, - 17, + 232, + 234, + 253, + 113, 132, - 66, - 233, - 156, - 69, - 41, - 116, + 81, + 53, + 108, + 32, + 68, + 228, + 194, + 57, + 252, + 194, + 158, + 179, + 168, + 29, + 57, + 46, + 27, + 68, + 173, 97, 98, 64, @@ -18588,38 +18675,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 2, - 3, - 227, - 73, - 58, 37, + 86, + 115, + 226, + 36, + 165, 148, - 236, 229, - 125, - 34, - 204, - 117, - 221, - 8, + 63, + 213, + 177, + 180, + 220, + 212, + 99, + 41, + 231, + 42, + 4, + 225, + 96, + 86, + 222, + 163, + 213, + 161, + 126, + 49, + 41, 26, - 198, - 130, - 113, - 236, - 124, - 117, - 129, - 83, - 207, - 210, - 21, - 43, - 251, - 92, - 25, - 227, + 153, + 96, 97, 98, 96, @@ -18627,8 +18714,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 64, + 78, + 192, 130, 1, 81, @@ -18737,76 +18824,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 30, - 135, - 235, - 136, - 87, - 119, - 149, - 201, - 242, - 140, - 66, + 19, + 108, + 177, + 75, + 53, + 31, 59, - 77, - 44, - 62, - 193, - 232, + 67, + 181, + 230, + 24, + 197, + 196, 144, - 22, - 68, - 102, - 234, - 151, + 34, + 88, + 142, + 221, + 72, + 85, + 15, + 78, + 125, + 105, + 48, + 148, 66, - 217, - 153, - 106, - 229, - 195, + 232, 184, - 10, - 42, + 61, + 13, + 34, 97, 99, 32, 131, 1, 82, - 126, - 176, - 4, - 129, - 75, - 36, - 199, - 199, - 169, - 220, - 86, - 255, - 160, - 61, - 79, - 43, - 126, - 15, - 86, - 5, - 243, + 127, + 14, + 233, 187, - 24, - 222, - 221, - 249, - 230, - 57, - 120, - 171, + 223, + 206, + 147, + 129, + 94, + 121, + 170, + 191, + 197, + 236, + 146, + 165, + 35, + 70, + 196, + 106, + 69, + 225, + 123, + 197, 188, - 86, + 154, + 216, + 21, + 94, + 152, + 44, + 156, + 172, 97, 99, 64, @@ -18814,8 +18902,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 96, + 78, + 224, 130, 1, 81, @@ -18924,38 +19012,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 3, - 167, - 99, - 193, - 198, - 183, - 134, - 103, - 249, - 6, - 182, - 254, - 43, - 74, - 209, - 151, - 181, - 85, - 135, - 201, - 14, - 20, - 232, - 80, - 36, - 70, - 218, - 140, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, + 5, + 63, + 152, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, + 66, + 233, + 156, 69, - 239, - 125, + 41, + 116, 97, 100, 0, @@ -18963,38 +19051,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 19, - 234, - 87, - 152, - 111, - 146, - 149, - 233, - 45, - 239, - 51, + 2, 3, - 174, - 245, - 63, - 43, - 79, - 98, - 91, - 169, - 133, - 83, - 18, - 1, - 171, + 227, + 73, + 58, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, + 113, + 236, + 124, + 117, + 129, 83, - 220, - 115, - 7, - 244, - 107, - 105, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 100, 32, @@ -19002,8 +19090,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 128, + 79, + 0, 130, 1, 81, @@ -19111,24 +19199,78 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 4, - 32, - 130, - 1, - 81, + 127, + 31, + 93, + 105, + 248, + 173, + 199, + 222, + 243, + 83, + 202, + 197, + 48, + 19, + 49, + 246, + 106, + 106, + 161, + 44, + 59, + 220, + 70, + 186, + 133, + 9, + 216, + 28, + 25, + 34, + 148, + 76, + 30, 97, 100, 224, 131, 1, 82, - 97, - 4, - 64, - 130, + 127, + 5, + 10, + 53, + 140, + 142, + 231, + 73, 1, - 81, + 175, + 214, + 190, + 189, + 218, + 53, + 162, + 91, + 233, + 155, + 166, + 49, + 35, + 42, + 190, + 192, + 187, + 125, + 242, + 52, + 40, + 226, + 25, + 235, 97, 101, 0, @@ -19136,8 +19278,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 160, + 79, + 32, 130, 1, 81, @@ -19245,24 +19387,78 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 4, - 96, - 130, - 1, - 81, + 127, + 29, + 219, + 249, + 28, + 238, + 237, + 136, + 168, + 198, + 110, + 155, + 248, + 208, + 137, + 179, + 9, + 141, + 192, + 131, + 241, + 87, + 144, + 135, + 7, + 150, + 167, + 38, + 127, + 37, + 207, + 155, + 240, 97, 101, 192, 131, 1, 82, - 97, - 4, - 128, - 130, - 1, - 81, + 127, + 10, + 180, + 232, + 11, + 0, + 145, + 205, + 64, + 7, + 2, + 148, + 247, + 84, + 229, + 75, + 18, + 126, + 32, + 0, + 87, + 44, + 3, + 68, + 194, + 131, + 138, + 238, + 175, + 37, + 30, + 179, + 145, 97, 101, 224, @@ -19270,8 +19466,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 192, + 79, + 64, 130, 1, 81, @@ -19381,7 +19577,7 @@ pub mod inclusion_verifier { 80, 97, 4, - 160, + 96, 130, 1, 81, @@ -19393,7 +19589,7 @@ pub mod inclusion_verifier { 82, 97, 4, - 192, + 128, 130, 1, 81, @@ -19404,8 +19600,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 224, + 79, + 96, 130, 1, 81, @@ -19515,7 +19711,7 @@ pub mod inclusion_verifier { 80, 97, 4, - 224, + 160, 130, 1, 81, @@ -19526,8 +19722,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 5, - 0, + 4, + 192, 130, 1, 81, @@ -19538,8 +19734,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 0, + 79, + 128, 130, 1, 81, @@ -19648,8 +19844,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 5, - 32, + 4, + 224, 130, 1, 81, @@ -19661,7 +19857,7 @@ pub mod inclusion_verifier { 82, 97, 5, - 64, + 0, 130, 1, 81, @@ -19672,8 +19868,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 32, + 79, + 160, 130, 1, 81, @@ -19782,8 +19978,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 3, - 128, + 5, + 32, 130, 1, 81, @@ -19794,8 +19990,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 3, - 160, + 5, + 64, 130, 1, 81, @@ -19806,8 +20002,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 64, + 79, + 192, 130, 1, 81, @@ -19916,8 +20112,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 2, - 192, + 5, + 96, 130, 1, 81, @@ -19928,8 +20124,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 2, - 224, + 5, + 128, 130, 1, 81, @@ -19941,7 +20137,7 @@ pub mod inclusion_verifier { 82, 97, 79, - 64, + 224, 130, 1, 81, @@ -20051,37 +20247,305 @@ pub mod inclusion_verifier { 80, 97, 3, + 192, + 130, + 1, + 81, + 97, + 107, + 0, + 131, + 1, + 82, + 97, + 3, + 224, + 130, + 1, + 81, + 97, + 107, + 32, + 131, + 1, + 82, + 97, + 80, + 0, + 130, + 1, + 81, + 97, + 107, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 0, + 133, + 1, + 96, + 96, + 97, + 107, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 106, + 128, + 130, + 1, + 81, + 97, + 107, + 96, + 131, + 1, + 82, + 97, + 106, + 160, + 130, + 1, + 81, + 97, + 107, + 128, + 131, + 1, + 82, + 97, + 107, + 0, + 130, + 1, + 81, + 97, + 107, + 160, + 131, + 1, + 82, + 97, + 107, + 32, + 130, + 1, + 81, + 97, + 107, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 96, + 133, + 1, + 96, + 128, + 97, + 107, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, 0, 130, 1, 81, 97, 107, + 224, + 131, + 1, + 82, + 97, + 3, + 32, + 130, + 1, + 81, + 97, + 108, + 0, + 131, + 1, + 82, + 97, + 81, + 0, + 130, + 1, + 81, + 97, + 108, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 224, + 133, + 1, + 96, + 96, + 97, + 107, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 107, + 96, + 130, + 1, + 81, + 97, + 108, + 64, + 131, + 1, + 82, + 97, + 107, + 128, + 130, + 1, + 81, + 97, + 108, + 96, + 131, + 1, + 82, + 97, + 107, + 224, + 130, + 1, + 81, + 97, + 108, + 128, + 131, + 1, + 82, + 97, + 108, 0, + 130, + 1, + 81, + 97, + 108, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 64, + 133, + 1, + 96, + 128, + 97, + 108, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 64, + 130, + 1, + 81, + 97, + 108, + 192, 131, 1, 82, 97, 3, - 32, + 96, 130, 1, 81, 97, - 107, - 32, + 108, + 224, 131, 1, 82, 97, - 80, - 224, + 82, + 160, 130, 1, 81, 97, - 107, - 64, + 109, + 0, 131, 1, 82, @@ -20091,15 +20555,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 107, - 0, + 108, + 192, 133, 1, 96, 96, 97, - 107, - 0, + 108, + 192, 135, 1, 96, @@ -20111,50 +20575,50 @@ pub mod inclusion_verifier { 146, 80, 97, - 106, - 128, + 108, + 64, 130, 1, 81, 97, - 107, - 96, + 109, + 32, 131, 1, 82, 97, - 106, - 160, + 108, + 96, 130, 1, 81, 97, - 107, - 128, + 109, + 64, 131, 1, 82, 97, - 107, - 0, + 108, + 192, 130, 1, 81, 97, - 107, - 160, + 109, + 96, 131, 1, 82, 97, - 107, - 32, + 108, + 224, 130, 1, 81, 97, - 107, - 192, + 109, + 128, 131, 1, 82, @@ -20164,15 +20628,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 107, - 96, + 109, + 32, 133, 1, 96, 128, 97, - 107, - 96, + 109, + 32, 135, 1, 96, @@ -20185,37 +20649,37 @@ pub mod inclusion_verifier { 80, 97, 3, - 64, + 128, 130, 1, 81, 97, - 107, - 224, + 109, + 160, 131, 1, 82, 97, 3, - 96, + 160, 130, 1, 81, 97, - 108, - 0, + 109, + 192, 131, 1, 82, 97, - 81, - 0, + 82, + 192, 130, 1, 81, 97, - 108, - 32, + 109, + 224, 131, 1, 82, @@ -20225,15 +20689,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 107, - 224, + 109, + 160, 133, 1, 96, 96, 97, - 107, - 224, + 109, + 160, 135, 1, 96, @@ -20245,50 +20709,50 @@ pub mod inclusion_verifier { 146, 80, 97, - 107, - 96, + 109, + 32, 130, 1, 81, 97, - 108, - 64, + 110, + 0, 131, 1, 82, 97, - 107, - 128, + 109, + 64, 130, 1, 81, 97, - 108, - 96, + 110, + 32, 131, 1, 82, 97, - 107, - 224, + 109, + 160, 130, 1, 81, 97, - 108, - 128, + 110, + 64, 131, 1, 82, 97, - 108, - 0, + 109, + 192, 130, 1, 81, 97, - 108, - 160, + 110, + 96, 131, 1, 82, @@ -20298,15 +20762,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 108, - 64, + 110, + 0, 133, 1, 96, 128, 97, - 108, - 64, + 110, + 0, 135, 1, 96, @@ -20319,37 +20783,37 @@ pub mod inclusion_verifier { 80, 97, 1, - 128, + 192, 130, 1, 81, 97, - 108, - 192, + 110, + 128, 131, 1, 82, 97, 1, - 160, + 224, 130, 1, 81, 97, - 108, - 224, + 110, + 160, 131, 1, 82, 97, - 82, - 0, + 83, + 192, 130, 1, 81, 97, - 109, - 0, + 110, + 192, 131, 1, 82, @@ -20359,15 +20823,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 108, - 192, + 110, + 128, 133, 1, 96, 96, 97, - 108, - 192, + 110, + 128, 135, 1, 96, @@ -20379,50 +20843,50 @@ pub mod inclusion_verifier { 146, 80, 97, - 108, - 64, + 110, + 0, 130, 1, 81, 97, - 109, - 32, + 110, + 224, 131, 1, 82, 97, - 108, - 96, + 110, + 32, 130, 1, 81, 97, - 109, - 64, + 111, + 0, 131, 1, 82, 97, - 108, - 192, + 110, + 128, 130, 1, 81, 97, - 109, - 96, + 111, + 32, 131, 1, 82, 97, - 108, - 224, + 110, + 160, 130, 1, 81, 97, - 109, - 128, + 111, + 64, 131, 1, 82, @@ -20432,15 +20896,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 109, - 32, + 110, + 224, 133, 1, 96, 128, 97, - 109, - 32, + 110, + 224, 135, 1, 96, @@ -20452,40 +20916,40 @@ pub mod inclusion_verifier { 146, 80, 97, - 10, - 224, + 11, + 32, 130, 1, 81, 97, - 109, - 160, + 111, + 96, 131, 1, 82, 97, 11, - 0, + 64, 130, 1, 81, 97, - 109, - 192, + 111, + 128, 131, 1, 82, 97, - 82, - 64, + 84, + 0, 130, 1, 81, 129, 3, 97, - 109, - 224, + 111, + 160, 131, 1, 82, @@ -20496,15 +20960,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 109, - 160, + 111, + 96, 132, 1, 96, 96, 97, - 109, - 160, + 111, + 96, 134, 1, 96, @@ -20516,50 +20980,50 @@ pub mod inclusion_verifier { 145, 80, 97, - 109, - 32, + 110, + 224, 129, 1, 81, 97, - 110, - 0, + 111, + 192, 130, 1, 82, 97, - 109, - 64, + 111, + 0, 129, 1, 81, 97, - 110, - 32, + 111, + 224, 130, 1, 82, 97, - 109, - 160, + 111, + 96, 129, 1, 81, 97, - 110, - 64, + 112, + 0, 130, 1, 82, 97, - 109, - 192, + 111, + 128, 129, 1, 81, 97, - 110, - 96, + 112, + 32, 130, 1, 82, @@ -20569,15 +21033,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 0, + 111, + 192, 132, 1, 96, 128, 97, - 110, - 0, + 111, + 192, 134, 1, 96, @@ -20590,37 +21054,37 @@ pub mod inclusion_verifier { 80, 97, 11, - 128, + 192, 129, 1, 81, 97, - 110, - 128, + 112, + 64, 130, 1, 82, 97, 11, - 160, + 224, 129, 1, 81, 97, - 110, - 160, + 112, + 96, 130, 1, 82, 97, - 82, - 96, + 84, + 32, 129, 1, 81, 97, - 110, - 192, + 112, + 128, 130, 1, 82, @@ -20630,15 +21094,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 128, + 112, + 64, 132, 1, 96, 96, 97, - 110, - 128, + 112, + 64, 134, 1, 96, @@ -20650,50 +21114,50 @@ pub mod inclusion_verifier { 145, 80, 97, - 110, - 0, + 111, + 192, 129, 1, 81, 97, - 110, - 224, + 112, + 160, 130, 1, 82, 97, - 110, - 32, + 111, + 224, 129, 1, 81, 97, - 111, - 0, + 112, + 192, 130, 1, 82, 97, - 110, - 128, + 112, + 64, 129, 1, 81, 97, - 111, - 32, + 112, + 224, 130, 1, 82, 97, - 110, - 160, + 112, + 96, 129, 1, 81, 97, - 111, - 64, + 113, + 0, 130, 1, 82, @@ -20703,15 +21167,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 224, + 112, + 160, 132, 1, 96, 128, 97, - 110, - 224, + 112, + 160, 134, 1, 96, @@ -20723,26 +21187,26 @@ pub mod inclusion_verifier { 145, 80, 97, - 110, - 224, + 112, + 160, 129, 1, 81, 97, - 111, - 96, + 113, + 32, 130, 1, 82, 97, - 111, - 0, + 112, + 192, 129, 1, 81, 97, - 111, - 128, + 113, + 64, 130, 1, 82, @@ -20780,8 +21244,8 @@ pub mod inclusion_verifier { 18, 194, 97, - 111, - 160, + 113, + 96, 130, 1, 82, @@ -20819,8 +21283,8 @@ pub mod inclusion_verifier { 246, 237, 97, - 111, - 192, + 113, + 128, 130, 1, 82, @@ -20858,8 +21322,8 @@ pub mod inclusion_verifier { 151, 91, 97, - 111, - 224, + 113, + 160, 130, 1, 82, @@ -20897,32 +21361,32 @@ pub mod inclusion_verifier { 125, 170, 97, - 112, - 0, + 113, + 192, 130, 1, 82, 97, 11, - 128, + 192, 129, 1, 81, 97, - 112, - 32, + 113, + 224, 130, 1, 82, 97, 11, - 160, + 224, 129, 1, 81, 97, - 112, - 64, + 114, + 0, 130, 1, 82, @@ -20960,8 +21424,8 @@ pub mod inclusion_verifier { 226, 61, 97, - 112, - 96, + 114, + 32, 130, 1, 82, @@ -20999,8 +21463,8 @@ pub mod inclusion_verifier { 247, 158, 97, - 112, - 128, + 114, + 64, 130, 1, 82, @@ -21038,8 +21502,8 @@ pub mod inclusion_verifier { 193, 69, 97, - 112, - 160, + 114, + 96, 130, 1, 82, @@ -21077,8 +21541,8 @@ pub mod inclusion_verifier { 222, 255, 97, - 112, - 192, + 114, + 128, 130, 1, 82, @@ -21088,16 +21552,16 @@ pub mod inclusion_verifier { 96, 32, 97, - 111, - 96, + 113, + 32, 132, 1, 97, 1, 128, 97, - 111, - 96, + 113, + 32, 134, 1, 96, @@ -21105,8 +21569,8 @@ pub mod inclusion_verifier { 90, 250, 97, - 111, - 96, + 113, + 32, 147, 144, 147, @@ -21133,8 +21597,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 112, - 192, + 114, + 128, 1, 96, 64, @@ -21142,7 +21606,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 134, + 148, 144, 96, 32, @@ -21212,15 +21676,15 @@ pub mod inclusion_verifier { 23, 21, 97, - 82, - 177, + 84, + 128, 87, 97, - 82, - 177, + 84, + 128, 97, - 82, - 114, + 84, + 65, 86, 91, 96, @@ -21240,8 +21704,8 @@ pub mod inclusion_verifier { 1, 18, 97, - 82, - 202, + 84, + 153, 87, 96, 0, @@ -21263,20 +21727,20 @@ pub mod inclusion_verifier { 17, 21, 97, - 82, - 228, + 84, + 179, 87, 97, - 82, - 228, + 84, + 179, 97, - 82, - 114, + 84, + 65, 86, 91, 97, - 82, - 247, + 84, + 198, 96, 31, 130, @@ -21289,8 +21753,8 @@ pub mod inclusion_verifier { 32, 1, 97, - 82, - 136, + 84, + 87, 86, 91, 129, @@ -21306,8 +21770,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 12, + 84, + 219, 87, 96, 0, @@ -21354,8 +21818,8 @@ pub mod inclusion_verifier { 18, 21, 97, - 83, - 60, + 85, + 11, 87, 96, 0, @@ -21378,8 +21842,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 84, + 85, + 35, 87, 96, 0, @@ -21398,8 +21862,8 @@ pub mod inclusion_verifier { 1, 18, 97, - 83, - 104, + 85, + 55, 87, 96, 0, @@ -21415,15 +21879,15 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 124, + 85, + 75, 87, 97, - 83, - 124, + 85, + 75, 97, - 82, - 114, + 84, + 65, 86, 91, 129, @@ -21431,14 +21895,14 @@ pub mod inclusion_verifier { 5, 27, 97, - 83, - 139, + 85, + 90, 130, 130, 1, 97, - 82, - 136, + 84, + 87, 86, 91, 146, @@ -21459,8 +21923,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 165, + 85, + 116, 87, 96, 0, @@ -21477,8 +21941,8 @@ pub mod inclusion_verifier { 16, 21, 97, - 83, - 195, + 85, + 146, 87, 134, 53, @@ -21493,8 +21957,8 @@ pub mod inclusion_verifier { 1, 144, 97, - 83, - 170, + 85, + 121, 86, 91, 151, @@ -21512,8 +21976,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 218, + 85, + 169, 87, 96, 0, @@ -21522,15 +21986,15 @@ pub mod inclusion_verifier { 91, 80, 97, - 83, - 231, + 85, + 182, 133, 130, 134, 1, 97, - 82, - 185, + 84, + 136, 86, 91, 145, @@ -21617,38 +22081,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 143, - 15, - 8, - 193, - 19, - 215, - 30, - 154, - 255, + 67, + 61, + 67, + 155, + 97, + 108, + 155, + 9, + 132, + 170, + 39, + 61, + 101, 208, - 74, - 147, + 59, + 188, + 145, 10, - 12, - 207, - 255, - 244, - 28, - 199, - 158, - 53, - 137, - 50, - 207, - 167, - 172, - 19, - 149, - 194, - 66, - 68, - 5, + 87, + 92, + 63, + 198, + 42, + 156, + 80, + 151, + 87, + 123, + 27, + 175, + 252, + 213, 100, 115, 111, @@ -21726,8 +22190,8 @@ pub mod inclusion_verifier { 96, 4, 97, - 83, - 41, + 84, + 248, 86, 91, 97, @@ -21763,8 +22227,8 @@ pub mod inclusion_verifier { 0, 99, 97, - 82, - 82, + 84, + 33, 86, 91, 96, @@ -21774,8 +22238,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -21794,8 +22258,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -21820,8 +22284,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -21838,8 +22302,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -21858,8 +22322,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 83, - 242, + 85, + 193, 131, 57, 129, @@ -21909,39 +22373,63 @@ pub mod inclusion_verifier { 131, 1, 82, - 127, - 45, - 241, - 98, - 24, - 168, - 45, - 57, + 128, + 96, + 96, + 135, + 1, + 81, + 6, + 96, + 96, 131, - 16, - 113, - 228, - 105, - 86, - 194, - 51, - 238, - 154, - 167, - 155, - 176, - 101, - 178, - 101, + 1, + 82, + 128, + 96, + 128, 135, - 16, + 1, + 81, + 6, + 96, 128, - 216, - 100, - 63, - 47, + 131, + 1, 82, + 127, + 16, + 30, + 50, + 32, + 159, + 188, + 42, + 253, + 218, + 46, 171, + 8, + 238, + 211, + 227, + 233, + 50, + 62, + 205, + 146, + 229, + 198, + 185, + 80, + 130, + 4, + 185, + 72, + 222, + 26, + 229, + 243, 96, 0, 131, @@ -21954,7 +22442,7 @@ pub mod inclusion_verifier { 81, 128, 96, - 96, + 160, 132, 1, 82, @@ -21965,14 +22453,14 @@ pub mod inclusion_verifier { 81, 128, 96, - 128, + 192, 133, 1, 82, 132, 97, 1, - 56, + 80, 130, 132, 97, @@ -21992,7 +22480,7 @@ pub mod inclusion_verifier { 81, 128, 96, - 160, + 224, 132, 1, 82, @@ -22002,15 +22490,16 @@ pub mod inclusion_verifier { 1, 81, 128, - 96, - 192, + 97, + 1, + 0, 133, 1, 82, 132, 97, 1, - 94, + 119, 130, 132, 97, @@ -22029,8 +22518,9 @@ pub mod inclusion_verifier { 1, 81, 128, - 96, - 224, + 97, + 1, + 32, 132, 1, 82, @@ -22042,14 +22532,14 @@ pub mod inclusion_verifier { 128, 97, 1, - 0, + 64, 133, 1, 82, 132, 97, 1, - 133, + 159, 130, 132, 97, @@ -22064,7 +22554,7 @@ pub mod inclusion_verifier { 80, 97, 1, - 32, + 96, 96, 0, 131, @@ -22072,13 +22562,13 @@ pub mod inclusion_verifier { 32, 97, 1, - 32, + 96, 131, 1, 82, 97, 1, - 32, + 96, 130, 1, 81, @@ -22087,14 +22577,14 @@ pub mod inclusion_verifier { 6, 97, 1, - 64, + 128, 132, 1, 82, 128, 97, 1, - 96, + 160, 132, 1, 82, @@ -22107,7 +22597,7 @@ pub mod inclusion_verifier { 128, 97, 1, - 128, + 192, 132, 1, 82, @@ -22120,14 +22610,14 @@ pub mod inclusion_verifier { 128, 97, 1, - 160, + 224, 133, 1, 82, 132, 97, 1, - 211, + 237, 130, 132, 97, @@ -22148,8 +22638,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 1, - 192, + 2, + 0, 132, 1, 82, @@ -22161,15 +22651,15 @@ pub mod inclusion_verifier { 81, 128, 97, - 1, - 224, + 2, + 32, 133, 1, 82, 132, 97, - 1, - 253, + 2, + 23, 130, 132, 97, @@ -22181,13 +22671,13 @@ pub mod inclusion_verifier { 160, 97, 1, - 96, + 160, 135, 1, 32, 97, 2, - 0, + 64, 135, 1, 129, @@ -22198,13 +22688,13 @@ pub mod inclusion_verifier { 6, 97, 2, - 32, + 96, 136, 1, 82, 97, 2, - 64, + 128, 135, 1, 82, @@ -22218,7 +22708,7 @@ pub mod inclusion_verifier { 80, 97, 2, - 96, + 160, 131, 1, 83, @@ -22226,13 +22716,13 @@ pub mod inclusion_verifier { 33, 97, 2, - 64, + 128, 131, 1, 32, 97, 2, - 96, + 160, 131, 1, 129, @@ -22243,13 +22733,13 @@ pub mod inclusion_verifier { 6, 97, 2, - 128, + 192, 132, 1, 82, 97, 2, - 160, + 224, 131, 1, 82, @@ -22260,8 +22750,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 2, - 192, + 3, + 0, 131, 1, 129, @@ -22274,8 +22764,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 2, - 224, + 3, + 32, 132, 1, 129, @@ -22284,7 +22774,7 @@ pub mod inclusion_verifier { 132, 97, 2, - 112, + 138, 130, 132, 97, @@ -22306,7 +22796,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 0, + 64, 132, 1, 82, @@ -22319,14 +22809,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 32, + 96, 133, 1, 82, 132, 97, 2, - 154, + 180, 130, 132, 97, @@ -22348,7 +22838,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 64, + 128, 132, 1, 82, @@ -22361,14 +22851,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 96, + 160, 133, 1, 82, 132, 97, 2, - 196, + 222, 130, 132, 97, @@ -22390,7 +22880,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 128, + 192, 132, 1, 82, @@ -22403,14 +22893,14 @@ pub mod inclusion_verifier { 128, 97, 3, - 160, + 224, 133, 1, 82, 132, 97, - 2, - 238, + 3, + 8, 130, 132, 97, @@ -22428,19 +22918,19 @@ pub mod inclusion_verifier { 32, 97, 2, - 160, + 224, 131, 1, 32, 97, - 3, - 192, + 4, + 0, 131, 1, 82, 97, - 3, - 192, + 4, + 0, 130, 1, 81, @@ -22448,15 +22938,15 @@ pub mod inclusion_verifier { 129, 6, 97, - 3, - 224, + 4, + 32, 132, 1, 82, 128, 97, 4, - 0, + 64, 132, 1, 82, @@ -22470,7 +22960,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 32, + 96, 132, 1, 82, @@ -22483,14 +22973,14 @@ pub mod inclusion_verifier { 128, 97, 4, - 64, + 128, 133, 1, 82, 132, 97, 3, - 62, + 88, 130, 132, 97, @@ -22512,7 +23002,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 96, + 160, 132, 1, 82, @@ -22525,14 +23015,14 @@ pub mod inclusion_verifier { 128, 97, 4, - 128, + 192, 133, 1, 82, 132, 97, 3, - 104, + 130, 130, 132, 97, @@ -22554,7 +23044,7 @@ pub mod inclusion_verifier { 128, 97, 4, - 160, + 224, 132, 1, 82, @@ -22566,15 +23056,15 @@ pub mod inclusion_verifier { 81, 128, 97, - 4, - 192, + 5, + 0, 133, 1, 82, 132, 97, 3, - 146, + 172, 130, 132, 97, @@ -22595,8 +23085,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 4, - 224, + 5, + 32, 132, 1, 82, @@ -22609,14 +23099,14 @@ pub mod inclusion_verifier { 128, 97, 5, - 0, + 64, 133, 1, 82, 132, 97, 3, - 188, + 214, 130, 132, 97, @@ -22638,7 +23128,7 @@ pub mod inclusion_verifier { 128, 97, 5, - 32, + 96, 132, 1, 82, @@ -22651,14 +23141,14 @@ pub mod inclusion_verifier { 128, 97, 5, - 64, + 128, 133, 1, 82, 132, 97, - 3, - 230, + 4, + 0, 130, 132, 97, @@ -22676,19 +23166,19 @@ pub mod inclusion_verifier { 96, 97, 4, - 0, + 64, 131, 1, 32, 97, 5, - 96, + 160, 131, 1, 82, 97, 5, - 96, + 160, 130, 1, 81, @@ -22697,14 +23187,14 @@ pub mod inclusion_verifier { 6, 97, 5, - 128, + 192, 132, 1, 82, 128, 97, 5, - 160, + 224, 132, 1, 82, @@ -22718,8 +23208,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 5, - 192, + 6, + 0, 131, 1, 82, @@ -22732,8 +23222,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 5, - 224, + 6, + 32, 131, 1, 82, @@ -22747,7 +23237,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 0, + 64, 131, 1, 82, @@ -22761,7 +23251,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 32, + 96, 131, 1, 82, @@ -22775,7 +23265,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 64, + 128, 131, 1, 82, @@ -22789,7 +23279,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 96, + 160, 131, 1, 82, @@ -22803,7 +23293,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 128, + 192, 131, 1, 82, @@ -22817,7 +23307,7 @@ pub mod inclusion_verifier { 6, 97, 6, - 160, + 224, 131, 1, 82, @@ -22830,8 +23320,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 6, - 192, + 7, + 0, 131, 1, 82, @@ -22844,8 +23334,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 6, - 224, + 7, + 32, 131, 1, 82, @@ -22859,7 +23349,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 0, + 64, 131, 1, 82, @@ -22873,7 +23363,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 32, + 96, 131, 1, 82, @@ -22887,7 +23377,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 64, + 128, 131, 1, 82, @@ -22901,7 +23391,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 96, + 160, 131, 1, 82, @@ -22915,7 +23405,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 128, + 192, 131, 1, 82, @@ -22929,7 +23419,7 @@ pub mod inclusion_verifier { 6, 97, 7, - 160, + 224, 131, 1, 82, @@ -22942,8 +23432,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 7, - 192, + 8, + 0, 131, 1, 82, @@ -22956,8 +23446,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 7, - 224, + 8, + 32, 131, 1, 82, @@ -22971,7 +23461,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 0, + 64, 131, 1, 82, @@ -22985,7 +23475,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 32, + 96, 131, 1, 82, @@ -22999,7 +23489,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 64, + 128, 131, 1, 82, @@ -23013,7 +23503,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 96, + 160, 131, 1, 82, @@ -23027,7 +23517,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 128, + 192, 131, 1, 82, @@ -23041,7 +23531,7 @@ pub mod inclusion_verifier { 6, 97, 8, - 160, + 224, 131, 1, 82, @@ -23054,8 +23544,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 8, - 192, + 9, + 0, 131, 1, 82, @@ -23068,8 +23558,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 8, - 224, + 9, + 32, 131, 1, 82, @@ -23083,7 +23573,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 0, + 64, 131, 1, 82, @@ -23097,7 +23587,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 32, + 96, 131, 1, 82, @@ -23111,7 +23601,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 64, + 128, 131, 1, 82, @@ -23125,7 +23615,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 96, + 160, 131, 1, 82, @@ -23139,7 +23629,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 128, + 192, 131, 1, 82, @@ -23153,7 +23643,7 @@ pub mod inclusion_verifier { 6, 97, 9, - 160, + 224, 131, 1, 82, @@ -23166,8 +23656,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 9, - 192, + 10, + 0, 131, 1, 82, @@ -23180,8 +23670,8 @@ pub mod inclusion_verifier { 81, 6, 97, - 9, - 224, + 10, + 32, 131, 1, 82, @@ -23195,7 +23685,7 @@ pub mod inclusion_verifier { 6, 97, 10, - 0, + 64, 131, 1, 82, @@ -23204,19 +23694,19 @@ pub mod inclusion_verifier { 128, 97, 5, - 160, + 224, 131, 1, 32, 97, 10, - 32, + 96, 131, 1, 82, 97, 10, - 32, + 96, 130, 1, 81, @@ -23225,14 +23715,14 @@ pub mod inclusion_verifier { 6, 97, 10, - 64, + 128, 132, 1, 82, 128, 97, 10, - 96, + 160, 132, 1, 82, @@ -23241,7 +23731,7 @@ pub mod inclusion_verifier { 1, 97, 10, - 128, + 192, 131, 1, 83, @@ -23249,13 +23739,13 @@ pub mod inclusion_verifier { 33, 97, 10, - 96, + 160, 131, 1, 32, 97, 10, - 128, + 192, 131, 1, 129, @@ -23266,13 +23756,13 @@ pub mod inclusion_verifier { 6, 97, 10, - 160, + 224, 132, 1, 82, 97, - 10, - 192, + 11, + 0, 131, 1, 82, @@ -23283,8 +23773,8 @@ pub mod inclusion_verifier { 1, 81, 97, - 10, - 224, + 11, + 32, 131, 1, 129, @@ -23298,7 +23788,7 @@ pub mod inclusion_verifier { 81, 97, 11, - 0, + 64, 132, 1, 129, @@ -23307,7 +23797,7 @@ pub mod inclusion_verifier { 132, 97, 6, - 111, + 137, 130, 132, 97, @@ -23323,20 +23813,20 @@ pub mod inclusion_verifier { 96, 96, 97, - 10, - 192, + 11, + 0, 131, 1, 32, 97, 11, - 32, + 96, 131, 1, 82, 97, 11, - 32, + 96, 130, 1, 81, @@ -23345,14 +23835,14 @@ pub mod inclusion_verifier { 6, 97, 11, - 64, + 128, 132, 1, 82, 128, 97, 11, - 96, + 160, 132, 1, 82, @@ -23366,7 +23856,7 @@ pub mod inclusion_verifier { 128, 97, 11, - 128, + 192, 132, 1, 82, @@ -23379,14 +23869,14 @@ pub mod inclusion_verifier { 128, 97, 11, - 160, + 224, 133, 1, 82, 132, 97, 6, - 190, + 216, 130, 132, 97, @@ -23402,20 +23892,20 @@ pub mod inclusion_verifier { 128, 97, 5, - 128, + 192, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 11, - 192, + 12, + 0, 131, 1, 129, @@ -23426,8 +23916,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 11, - 224, + 12, + 32, 131, 1, 129, @@ -23439,7 +23929,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 0, + 64, 131, 1, 129, @@ -23451,7 +23941,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 32, + 96, 131, 1, 129, @@ -23463,7 +23953,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 64, + 128, 131, 1, 129, @@ -23475,7 +23965,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 96, + 160, 131, 1, 129, @@ -23487,7 +23977,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 128, + 192, 131, 1, 129, @@ -23499,7 +23989,7 @@ pub mod inclusion_verifier { 9, 97, 12, - 160, + 224, 131, 1, 129, @@ -23510,8 +24000,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 12, - 192, + 13, + 0, 131, 1, 129, @@ -23522,8 +24012,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 12, - 224, + 13, + 32, 131, 1, 129, @@ -23535,7 +24025,7 @@ pub mod inclusion_verifier { 9, 97, 13, - 0, + 64, 131, 1, 82, @@ -23575,14 +24065,14 @@ pub mod inclusion_verifier { 0, 97, 13, - 0, + 64, 132, 1, 81, 8, 97, 13, - 32, + 96, 131, 1, 82, @@ -23622,14 +24112,14 @@ pub mod inclusion_verifier { 1, 97, 13, - 32, + 96, 132, 1, 81, 9, 97, 13, - 64, + 128, 131, 1, 82, @@ -23669,14 +24159,14 @@ pub mod inclusion_verifier { 2, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 13, - 96, + 160, 131, 1, 82, @@ -23716,14 +24206,14 @@ pub mod inclusion_verifier { 255, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 13, - 128, + 192, 131, 1, 82, @@ -23763,14 +24253,14 @@ pub mod inclusion_verifier { 81, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 13, - 160, + 224, 131, 1, 82, @@ -23810,14 +24300,14 @@ pub mod inclusion_verifier { 176, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, - 13, - 192, + 14, + 0, 131, 1, 82, @@ -23857,14 +24347,14 @@ pub mod inclusion_verifier { 53, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, - 13, - 224, + 14, + 32, 131, 1, 82, @@ -23904,14 +24394,14 @@ pub mod inclusion_verifier { 204, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 0, + 64, 131, 1, 82, @@ -23951,14 +24441,14 @@ pub mod inclusion_verifier { 37, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 32, + 96, 131, 1, 82, @@ -23998,14 +24488,14 @@ pub mod inclusion_verifier { 220, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 64, + 128, 131, 1, 82, @@ -24045,14 +24535,14 @@ pub mod inclusion_verifier { 227, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 96, + 160, 131, 1, 82, @@ -24092,14 +24582,14 @@ pub mod inclusion_verifier { 30, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 14, - 128, + 192, 131, 1, 82, @@ -24139,14 +24629,14 @@ pub mod inclusion_verifier { 26, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 14, - 160, + 224, 131, 1, 82, @@ -24186,14 +24676,14 @@ pub mod inclusion_verifier { 231, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, - 14, - 192, + 15, + 0, 131, 1, 82, @@ -24202,14 +24692,14 @@ pub mod inclusion_verifier { 1, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, - 14, - 224, + 15, + 32, 131, 1, 82, @@ -24249,14 +24739,14 @@ pub mod inclusion_verifier { 0, 97, 5, - 128, + 192, 132, 1, 81, 8, 97, 15, - 0, + 64, 131, 1, 82, @@ -24296,14 +24786,14 @@ pub mod inclusion_verifier { 95, 97, 13, - 64, + 128, 132, 1, 81, 9, 97, 15, - 32, + 96, 131, 1, 82, @@ -24343,28 +24833,216 @@ pub mod inclusion_verifier { 162, 97, 5, + 192, + 132, + 1, + 81, + 8, + 97, + 15, + 128, + 131, + 1, + 82, + 128, + 127, + 42, + 217, + 2, + 30, + 208, + 124, + 66, + 171, + 25, + 247, + 124, + 92, + 242, + 203, + 210, + 222, + 177, + 53, + 234, + 51, + 15, + 27, + 21, + 115, + 189, + 8, + 217, + 147, + 9, + 196, + 187, + 125, + 97, + 13, 128, 132, 1, 81, + 9, + 97, + 15, + 160, + 131, + 1, + 82, + 128, + 127, + 5, + 139, + 76, + 84, + 16, + 181, + 93, + 126, + 158, + 88, + 201, + 89, + 142, + 181, + 133, + 126, + 118, + 253, + 254, + 21, + 106, + 158, + 91, + 29, + 134, + 217, + 28, + 0, + 230, + 59, + 68, + 132, + 97, + 5, + 192, + 132, + 1, + 81, 8, 97, 15, - 64, + 192, 131, 1, 82, + 128, + 127, + 25, + 8, + 89, + 125, + 47, + 195, + 188, + 29, + 163, + 18, + 239, + 163, + 68, + 224, + 252, + 138, + 112, + 121, + 48, + 2, + 56, + 242, + 238, + 53, + 119, + 79, + 17, + 126, + 102, + 253, + 68, + 103, 97, 13, 128, + 132, + 1, + 81, + 9, + 97, + 15, + 224, + 131, + 1, + 82, + 128, + 127, + 23, + 91, + 244, + 245, + 177, + 109, + 228, + 12, + 21, + 61, + 86, + 19, + 60, + 160, + 91, + 210, + 183, + 186, + 184, + 70, + 64, + 198, 130, + 91, + 204, + 146, + 228, + 21, + 137, + 2, + 187, + 154, + 97, + 5, + 192, + 132, 1, 81, - 129, - 129, + 8, + 97, + 16, + 0, + 131, + 1, + 82, 97, 13, 192, + 130, + 1, + 81, + 129, + 129, + 97, + 14, + 0, 133, 1, 81, @@ -24373,8 +25051,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 96, + 16, + 32, 132, 1, 82, @@ -24382,7 +25060,7 @@ pub mod inclusion_verifier { 129, 97, 14, - 0, + 64, 133, 1, 81, @@ -24391,8 +25069,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 128, + 16, + 64, 132, 1, 82, @@ -24400,7 +25078,7 @@ pub mod inclusion_verifier { 129, 97, 14, - 64, + 128, 133, 1, 81, @@ -24409,8 +25087,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, - 160, + 16, + 96, 132, 1, 82, @@ -24418,7 +25096,25 @@ pub mod inclusion_verifier { 129, 97, 14, + 192, + 133, + 1, + 81, + 9, + 144, + 80, 128, + 97, + 16, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 0, 133, 1, 81, @@ -24427,7 +25123,25 @@ pub mod inclusion_verifier { 80, 128, 97, + 16, + 160, + 132, + 1, + 82, + 129, + 129, + 97, 15, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, 192, 132, 1, @@ -24435,8 +25149,8 @@ pub mod inclusion_verifier { 129, 129, 97, - 14, - 192, + 15, + 128, 133, 1, 81, @@ -24445,7 +25159,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 15, + 16, 224, 132, 1, @@ -24454,7 +25168,7 @@ pub mod inclusion_verifier { 129, 97, 15, - 0, + 192, 133, 1, 81, @@ -24463,7 +25177,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 0, 132, 1, @@ -24471,8 +25185,8 @@ pub mod inclusion_verifier { 129, 129, 97, - 15, - 64, + 16, + 0, 133, 1, 81, @@ -24481,7 +25195,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 32, 132, 1, @@ -24490,7 +25204,7 @@ pub mod inclusion_verifier { 129, 97, 13, - 32, + 96, 133, 1, 81, @@ -24499,7 +25213,7 @@ pub mod inclusion_verifier { 80, 128, 97, - 16, + 17, 64, 132, 1, @@ -24508,7 +25222,7 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 128, 131, 1, @@ -24516,7 +25230,7 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 160, 131, 1, @@ -24524,19 +25238,19 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 192, 131, 1, 82, 97, - 16, + 17, 64, 130, 1, 81, 97, - 16, + 17, 224, 131, 1, @@ -24575,7 +25289,7 @@ pub mod inclusion_verifier { 255, 255, 97, - 17, + 18, 0, 131, 1, @@ -24587,8 +25301,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -24596,7 +25310,7 @@ pub mod inclusion_verifier { 145, 82, 97, - 17, + 18, 32, 131, 1, @@ -24607,14 +25321,14 @@ pub mod inclusion_verifier { 96, 32, 97, - 16, + 17, 96, 133, 1, 96, 192, 97, - 16, + 17, 128, 135, 1, @@ -24627,7 +25341,7 @@ pub mod inclusion_verifier { 146, 80, 97, - 16, + 17, 96, 130, 1, @@ -24636,7 +25350,7 @@ pub mod inclusion_verifier { 0, 97, 13, - 32, + 96, 132, 1, 81, @@ -24645,7 +25359,7 @@ pub mod inclusion_verifier { 130, 130, 97, - 16, + 17, 32, 134, 1, @@ -24653,7 +25367,94 @@ pub mod inclusion_verifier { 9, 97, 13, - 32, + 96, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 16, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 17, + 0, + 134, + 1, + 81, + 9, + 97, + 16, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 224, + 134, + 1, + 81, + 9, + 97, + 15, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 192, + 134, + 1, + 81, + 9, + 97, + 15, + 128, 133, 1, 82, @@ -24675,7 +25476,7 @@ pub mod inclusion_verifier { 130, 97, 16, - 0, + 160, 134, 1, 81, @@ -24703,8 +25504,8 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, - 224, + 16, + 128, 134, 1, 81, @@ -24732,8 +25533,8 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, - 192, + 16, + 96, 134, 1, 81, @@ -24761,8 +25562,8 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, - 160, + 16, + 64, 134, 1, 81, @@ -24790,8 +25591,8 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, - 128, + 16, + 32, 134, 1, 81, @@ -24819,8 +25620,8 @@ pub mod inclusion_verifier { 130, 130, 97, - 15, - 96, + 13, + 192, 134, 1, 81, @@ -24835,46 +25636,17 @@ pub mod inclusion_verifier { 130, 130, 9, - 145, - 80, - 97, - 13, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 13, - 128, - 134, - 1, - 81, - 9, 97, 13, 192, 133, 1, - 82, - 130, - 130, - 130, - 9, - 97, - 13, - 128, - 133, - 1, 129, 144, 82, 97, 13, - 96, + 160, 133, 1, 81, @@ -24886,27 +25658,27 @@ pub mod inclusion_verifier { 80, 9, 97, - 17, + 18, 64, 131, 1, 82, 128, 97, - 13, - 192, + 14, + 0, 131, 1, 81, 97, 13, - 160, + 224, 132, 1, 81, 9, 97, - 17, + 18, 96, 131, 1, @@ -24914,19 +25686,19 @@ pub mod inclusion_verifier { 128, 97, 14, - 0, + 64, 131, 1, 81, 97, - 13, - 224, + 14, + 32, 132, 1, 81, 9, 97, - 17, + 18, 128, 131, 1, @@ -24934,19 +25706,19 @@ pub mod inclusion_verifier { 128, 97, 14, - 64, + 128, 131, 1, 81, 97, 14, - 32, + 96, 132, 1, 81, 9, 97, - 17, + 18, 160, 131, 1, @@ -24954,39 +25726,39 @@ pub mod inclusion_verifier { 128, 97, 14, - 128, + 192, 131, 1, 81, 97, 14, - 96, + 160, 132, 1, 81, 9, 97, - 17, + 18, 192, 131, 1, 82, 128, 97, - 14, - 192, + 15, + 0, 131, 1, 81, 97, 14, - 160, + 224, 132, 1, 81, 9, 97, - 17, + 18, 224, 131, 1, @@ -24994,19 +25766,19 @@ pub mod inclusion_verifier { 128, 97, 15, - 0, + 64, 131, 1, 81, 97, - 14, - 224, + 15, + 32, 132, 1, 81, 9, 97, - 18, + 19, 0, 131, 1, @@ -25014,31 +25786,71 @@ pub mod inclusion_verifier { 128, 97, 15, - 64, + 128, 131, 1, 81, 97, 15, - 32, + 96, 132, 1, 81, 9, 97, - 18, + 19, 32, 131, 1, 82, 128, + 97, + 15, + 192, + 131, + 1, + 81, + 97, + 15, + 160, + 132, + 1, + 81, + 9, + 97, + 19, + 64, + 131, + 1, + 82, + 128, + 97, + 16, + 0, + 131, + 1, + 81, + 97, + 15, + 224, + 132, + 1, + 81, + 9, + 97, + 19, + 96, + 131, + 1, + 82, + 128, 96, 32, 131, 1, 81, 97, - 18, + 19, 0, 132, 1, @@ -25053,29 +25865,65 @@ pub mod inclusion_verifier { 1, 81, 97, - 18, + 19, 32, 135, 1, 81, 9, 8, + 144, + 80, + 129, + 129, + 131, + 96, + 96, + 134, + 1, + 81, 97, - 18, + 19, 64, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 96, + 128, + 134, + 1, + 81, + 97, + 19, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 19, + 128, 132, 1, 82, 80, 97, - 6, - 224, + 7, + 32, 130, 1, 81, 97, - 5, - 192, + 6, + 0, 131, 1, 81, @@ -25084,8 +25932,8 @@ pub mod inclusion_verifier { 144, 8, 97, - 18, - 96, + 19, + 160, 131, 1, 129, @@ -25096,8 +25944,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 18, - 128, + 19, + 192, 131, 1, 129, @@ -25108,28 +25956,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 18, - 160, + 19, + 224, 131, 1, 82, 128, 97, - 18, - 160, + 19, + 224, 131, 1, 81, 97, - 18, - 96, + 19, + 160, 132, 1, 81, 9, 97, - 18, - 192, + 20, + 0, 131, 1, 82, @@ -25168,35 +26016,35 @@ pub mod inclusion_verifier { 122, 213, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 9, 97, - 18, - 224, + 20, + 32, 131, 1, 82, 128, 97, 7, - 0, + 64, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, 8, 97, - 19, - 0, + 20, + 64, 131, 1, 129, @@ -25207,8 +26055,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 19, - 32, + 20, + 96, 131, 1, 129, @@ -25219,28 +26067,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 19, - 64, + 20, + 128, 131, 1, 82, 128, 97, - 19, - 64, + 20, + 128, 131, 1, 81, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 19, - 96, + 20, + 160, 131, 1, 82, @@ -25279,57 +26127,57 @@ pub mod inclusion_verifier { 177, 232, 97, - 19, - 96, + 20, + 160, 132, 1, 81, 9, 97, - 19, - 128, + 20, + 192, 131, 1, 82, 128, 97, - 19, - 128, + 20, + 192, 131, 1, 81, 97, - 18, - 224, + 20, + 32, 132, 1, 81, 8, 97, - 19, - 160, + 20, + 224, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, 130, 3, 97, - 19, - 160, + 20, + 224, 132, 1, 81, 8, 97, - 19, - 192, + 21, + 0, 131, 1, 129, @@ -25337,7 +26185,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 128, + 192, 131, 1, 81, @@ -25345,28 +26193,28 @@ pub mod inclusion_verifier { 145, 9, 97, - 19, - 224, + 21, + 32, 131, 1, 82, 128, 97, - 19, - 224, + 21, + 32, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 20, - 0, + 21, + 64, 131, 1, 82, @@ -25405,15 +26253,15 @@ pub mod inclusion_verifier { 143, 249, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 9, 97, - 20, - 32, + 21, + 96, 131, 1, 82, @@ -25452,57 +26300,57 @@ pub mod inclusion_verifier { 3, 200, 97, - 19, - 96, + 20, + 160, 132, 1, 81, 9, 97, - 20, - 64, + 21, + 128, 131, 1, 82, 128, 97, - 20, - 64, + 21, + 128, 131, 1, 81, 97, - 20, - 32, + 21, + 96, 132, 1, 81, 8, 97, - 20, - 96, + 21, + 160, 131, 1, 82, 128, 97, 6, - 32, + 96, 131, 1, 81, 130, 3, 97, - 20, - 96, + 21, + 160, 132, 1, 81, 8, 97, - 20, - 128, + 21, + 192, 131, 1, 129, @@ -25510,7 +26358,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 128, + 192, 131, 1, 81, @@ -25518,70 +26366,70 @@ pub mod inclusion_verifier { 145, 9, 97, - 20, - 160, + 21, + 224, 131, 1, 82, 128, 97, - 20, - 160, + 21, + 224, 131, 1, 81, 97, - 20, - 0, + 21, + 64, 132, 1, 81, 8, 97, - 20, - 192, + 22, + 0, 131, 1, 82, 128, 97, - 20, - 192, + 22, + 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 20, - 224, + 22, + 32, 131, 1, 82, 128, 97, 6, - 64, + 128, 131, 1, 81, 130, 3, 97, - 18, - 192, + 20, + 0, 132, 1, 81, 8, 97, - 21, - 0, + 22, + 64, 131, 1, 129, @@ -25589,7 +26437,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -25597,48 +26445,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 21, - 32, + 22, + 96, 131, 1, 82, 128, 97, - 21, - 32, + 22, + 96, 131, 1, 81, 97, - 20, - 224, + 22, + 32, 132, 1, 81, 8, 97, - 21, - 64, + 22, + 128, 131, 1, 82, 128, 97, - 21, - 64, + 22, + 128, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 21, - 96, + 22, + 160, 131, 1, 82, @@ -25678,14 +26526,14 @@ pub mod inclusion_verifier { 213, 97, 6, - 64, + 128, 132, 1, 81, 9, 97, - 21, - 128, + 22, + 192, 131, 1, 82, @@ -25724,35 +26572,35 @@ pub mod inclusion_verifier { 177, 232, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 21, - 160, + 22, + 224, 131, 1, 82, 128, 97, - 21, - 160, + 22, + 224, 131, 1, 81, 97, - 21, - 128, + 22, + 192, 132, 1, 81, 8, 97, - 21, - 192, + 23, + 0, 131, 1, 129, @@ -25760,7 +26608,7 @@ pub mod inclusion_verifier { 82, 97, 6, - 160, + 224, 131, 1, 81, @@ -25768,8 +26616,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 21, - 224, + 23, + 32, 131, 1, 129, @@ -25780,8 +26628,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 22, - 0, + 23, + 64, 131, 1, 129, @@ -25792,28 +26640,28 @@ pub mod inclusion_verifier { 128, 9, 97, - 22, - 32, + 23, + 96, 131, 1, 82, 128, 97, - 22, - 32, + 23, + 96, 131, 1, 81, 97, - 21, - 224, + 23, + 32, 132, 1, 81, 9, 97, - 22, - 64, + 23, + 128, 131, 1, 82, @@ -25853,14 +26701,14 @@ pub mod inclusion_verifier { 102, 97, 6, - 0, + 64, 132, 1, 81, 9, 97, - 22, - 96, + 23, + 160, 131, 1, 82, @@ -25900,56 +26748,56 @@ pub mod inclusion_verifier { 254, 97, 6, - 32, + 96, 132, 1, 81, 9, 97, - 22, - 128, + 23, + 192, 131, 1, 82, 128, 97, - 22, - 128, + 23, + 192, 131, 1, 81, 97, - 22, - 96, + 23, + 160, 132, 1, 81, 8, 97, - 22, - 160, + 23, + 224, 131, 1, 82, 128, 97, - 22, - 160, + 23, + 224, 131, 1, 81, 130, 3, 97, - 22, - 64, + 23, + 128, 132, 1, 81, 8, 97, - 22, - 192, + 24, + 0, 131, 1, 129, @@ -25957,7 +26805,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -25965,48 +26813,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 22, - 224, + 24, + 32, 131, 1, 82, 128, 97, - 22, - 224, + 24, + 32, 131, 1, 81, 97, - 21, - 96, + 22, + 160, 132, 1, 81, 8, 97, - 23, - 0, + 24, + 64, 131, 1, 82, 128, 97, - 23, - 0, + 24, + 64, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 23, - 32, + 24, + 96, 131, 1, 82, @@ -26046,14 +26894,14 @@ pub mod inclusion_verifier { 249, 97, 6, - 64, + 128, 132, 1, 81, 9, 97, - 23, - 64, + 24, + 128, 131, 1, 82, @@ -26092,43 +26940,43 @@ pub mod inclusion_verifier { 3, 200, 97, - 19, - 0, + 20, + 64, 132, 1, 81, 9, 97, - 23, - 96, + 24, + 160, 131, 1, 82, 128, 97, - 23, - 96, + 24, + 160, 131, 1, 81, 97, - 23, - 64, + 24, + 128, 132, 1, 81, 8, 97, - 23, - 128, + 24, + 192, 131, 1, 129, 144, 82, 97, - 6, - 192, + 7, + 0, 131, 1, 81, @@ -26136,8 +26984,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 23, - 160, + 24, + 224, 131, 1, 82, @@ -26177,14 +27025,14 @@ pub mod inclusion_verifier { 2, 97, 6, - 0, + 64, 132, 1, 81, 9, 97, - 23, - 192, + 25, + 0, 131, 1, 82, @@ -26224,56 +27072,56 @@ pub mod inclusion_verifier { 190, 97, 6, - 32, + 96, 132, 1, 81, 9, 97, - 23, - 224, + 25, + 32, 131, 1, 82, 128, 97, - 23, - 224, + 25, + 32, 131, 1, 81, 97, - 23, - 192, + 25, + 0, 132, 1, 81, 8, 97, - 24, - 0, + 25, + 64, 131, 1, 82, 128, 97, - 24, - 0, + 25, + 64, 131, 1, 81, 130, 3, 97, - 23, - 160, + 24, + 224, 132, 1, 81, 8, 97, - 24, - 32, + 25, + 96, 131, 1, 129, @@ -26281,7 +27129,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 160, + 224, 131, 1, 81, @@ -26289,55 +27137,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 24, - 64, + 25, + 128, 131, 1, 82, 128, 97, - 24, - 64, + 25, + 128, 131, 1, 81, 97, - 23, - 32, + 24, + 96, 132, 1, 81, 8, 97, - 24, - 96, + 25, + 160, 131, 1, 82, 128, 97, - 24, - 96, + 25, + 160, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 24, - 128, + 25, + 192, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -26347,8 +27195,8 @@ pub mod inclusion_verifier { 1, 8, 97, - 24, - 160, + 25, + 224, 131, 1, 129, @@ -26356,7 +27204,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 96, + 160, 131, 1, 81, @@ -26364,15 +27212,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 24, - 192, + 26, + 0, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -26382,16 +27230,16 @@ pub mod inclusion_verifier { 2, 8, 97, - 24, - 224, + 26, + 32, 131, 1, 129, 144, 82, 97, - 24, - 192, + 26, + 0, 131, 1, 81, @@ -26399,15 +27247,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 0, + 26, + 64, 131, 1, 82, 128, 97, 7, - 96, + 160, 131, 1, 81, @@ -26417,16 +27265,16 @@ pub mod inclusion_verifier { 4, 8, 97, - 25, - 32, + 26, + 96, 131, 1, 129, 144, 82, 97, - 25, - 0, + 26, + 64, 131, 1, 81, @@ -26434,58 +27282,58 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 64, + 26, + 128, 131, 1, 82, 128, 97, - 5, - 192, + 6, + 0, 131, 1, 81, 97, 6, - 128, + 192, 132, 1, 81, 8, 97, - 25, - 96, + 26, + 160, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, 130, 3, 97, - 25, - 96, + 26, + 160, 132, 1, 81, 8, 97, - 25, - 128, + 26, + 192, 131, 1, 129, 144, 82, 97, - 25, - 64, + 26, + 128, 131, 1, 81, @@ -26493,306 +27341,426 @@ pub mod inclusion_verifier { 145, 9, 97, - 25, - 160, + 26, + 224, 131, 1, 82, 128, 97, + 26, + 224, + 131, + 1, + 81, + 97, 25, + 192, + 132, + 1, + 81, + 8, + 97, + 27, + 0, + 131, + 1, + 82, + 128, + 97, + 27, + 0, + 131, + 1, + 81, + 97, + 4, + 32, + 132, + 1, + 81, + 9, + 97, + 27, + 32, + 131, + 1, + 82, + 128, + 97, + 6, + 96, + 131, + 1, + 81, + 130, + 3, + 97, + 6, 160, + 132, + 1, + 81, + 8, + 97, + 27, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 26, + 128, 131, 1, 81, + 130, + 145, + 9, 97, - 24, + 27, + 96, + 131, + 1, + 82, 128, + 97, + 27, + 96, + 131, + 1, + 81, + 97, + 27, + 32, 132, 1, 81, 8, 97, - 25, + 27, + 128, + 131, + 1, + 82, + 128, + 97, + 27, + 128, + 131, + 1, + 81, + 97, + 4, + 32, + 132, + 1, + 81, + 9, + 97, + 27, + 160, + 131, + 1, + 82, + 128, + 97, + 8, + 0, + 131, + 1, + 81, + 97, + 21, + 0, + 132, + 1, + 81, + 9, + 97, + 27, 192, 131, 1, 82, 128, 97, - 25, + 27, 192, 131, 1, 81, 97, - 3, - 224, + 27, + 160, 132, 1, 81, - 9, + 8, 97, - 25, + 27, 224, 131, 1, 82, 128, 97, - 6, - 32, + 27, + 224, 131, 1, 81, - 130, - 3, 97, - 6, - 96, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 26, + 28, 0, 131, 1, - 129, - 144, 82, + 128, 97, - 25, - 64, + 8, + 0, 131, 1, 81, - 130, - 145, + 97, + 21, + 192, + 132, + 1, + 81, 9, 97, - 26, + 28, 32, 131, 1, 82, 128, 97, - 26, + 28, 32, 131, 1, 81, 97, - 25, - 224, + 28, + 0, 132, 1, 81, 8, 97, - 26, + 28, 64, 131, 1, 82, 128, 97, - 26, + 28, 64, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 26, + 28, 96, 131, 1, 82, 128, 97, - 7, - 192, + 8, + 32, 131, 1, 81, 97, - 19, - 192, + 22, + 64, 132, 1, 81, 9, 97, - 26, + 28, 128, 131, 1, 82, 128, 97, - 26, + 28, 128, 131, 1, 81, 97, - 26, + 28, 96, 132, 1, 81, 8, 97, - 26, + 28, 160, 131, 1, 82, 128, 97, - 26, + 28, 160, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 26, + 28, 192, 131, 1, 82, 128, 97, - 7, - 192, + 8, + 32, 131, 1, 81, 97, - 20, - 128, + 24, + 0, 132, 1, 81, 9, 97, - 26, + 28, 224, 131, 1, 82, 128, 97, - 26, + 28, 224, 131, 1, 81, 97, - 26, + 28, 192, 132, 1, 81, 8, 97, - 27, + 29, 0, 131, 1, 82, 128, 97, - 27, + 29, 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 27, + 29, 32, 131, 1, 82, 128, 97, - 7, - 224, + 8, + 32, 131, 1, 81, 97, - 21, - 0, + 25, + 96, 132, 1, 81, 9, 97, - 27, + 29, 64, 131, 1, 82, 128, 97, - 27, + 29, 64, 131, 1, 81, 97, - 27, + 29, 32, 132, 1, 81, 8, 97, - 27, + 29, 96, 131, 1, 82, 128, 97, - 27, + 29, 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 27, + 29, 128, 131, 1, @@ -26800,492 +27768,455 @@ pub mod inclusion_verifier { 128, 97, 7, - 224, + 160, 131, 1, 81, + 130, + 3, + 96, + 3, + 8, 97, - 22, - 192, - 132, - 1, - 81, - 9, - 97, - 27, + 29, 160, 131, 1, + 129, + 144, 82, - 128, 97, - 27, - 160, + 26, + 64, 131, 1, 81, + 130, + 145, + 9, 97, - 27, - 128, - 132, - 1, - 81, - 8, - 97, - 27, + 29, 192, 131, 1, 82, 128, 97, - 27, + 29, 192, 131, 1, 81, 97, - 3, - 224, + 26, + 192, 132, 1, 81, 9, 97, - 27, + 29, 224, 131, 1, 82, 128, 97, - 7, + 29, 224, 131, 1, 81, 97, - 24, - 32, + 29, + 128, 132, 1, 81, - 9, + 8, 97, - 28, + 30, 0, 131, 1, 82, 128, 97, - 28, + 30, 0, 131, 1, 81, 97, - 27, - 224, + 4, + 32, 132, 1, 81, - 8, + 9, 97, - 28, + 30, 32, 131, 1, 82, 128, 97, - 28, - 32, + 29, + 192, 131, 1, 81, 97, - 3, - 224, + 27, + 64, 132, 1, 81, 9, 97, - 28, + 30, 64, 131, 1, 82, 128, 97, - 7, - 96, + 30, + 64, 131, 1, 81, - 130, - 3, - 96, - 3, + 97, + 30, + 32, + 132, + 1, + 81, 8, 97, - 28, + 30, 96, 131, 1, - 129, - 144, 82, + 128, 97, - 25, - 0, + 30, + 96, 131, 1, 81, - 130, - 145, + 97, + 4, + 32, + 132, + 1, + 81, 9, 97, - 28, + 30, 128, 131, 1, 82, 128, 97, - 28, - 128, + 7, + 160, 131, 1, 81, 97, - 25, - 128, + 26, + 32, 132, 1, 81, 9, 97, - 28, + 30, 160, 131, 1, 82, 128, 97, - 28, + 30, 160, 131, 1, 81, 97, - 28, - 64, + 29, + 160, 132, 1, 81, - 8, + 9, 97, - 28, + 30, 192, 131, 1, 82, 128, 97, - 28, + 30, 192, 131, 1, 81, 97, - 3, - 224, + 26, + 96, 132, 1, 81, 9, 97, - 28, + 30, 224, 131, 1, 82, 128, 97, - 28, - 128, + 30, + 224, 131, 1, 81, 97, - 26, - 0, + 6, + 128, 132, 1, 81, 9, 97, - 29, + 31, 0, 131, 1, 82, 128, 97, - 29, - 0, + 6, + 128, 131, 1, 81, - 97, - 28, - 224, - 132, + 130, + 3, + 96, 1, - 81, 8, 97, - 29, + 31, 32, 131, 1, + 129, + 144, 82, - 128, 97, - 29, - 32, + 31, + 0, 131, 1, 81, - 97, - 3, - 224, - 132, - 1, - 81, + 130, + 145, 9, 97, - 29, + 31, 64, 131, 1, 82, 128, 97, - 7, - 96, + 31, + 64, 131, 1, 81, 97, - 24, - 224, + 30, + 128, 132, 1, 81, - 9, + 8, 97, - 29, + 31, 96, 131, 1, 82, 128, 97, - 29, + 31, 96, 131, 1, 81, 97, - 28, - 96, + 4, + 32, 132, 1, 81, 9, 97, - 29, + 31, 128, 131, 1, 82, 128, 97, - 29, - 128, + 6, + 0, 131, 1, 81, + 130, + 3, 97, - 25, + 6, 32, 132, 1, 81, - 9, + 8, 97, - 29, + 31, 160, 131, 1, 82, 128, 97, - 29, + 31, 160, 131, 1, 81, 97, 6, - 64, + 128, 132, 1, 81, 9, 97, - 29, + 31, 192, 131, 1, + 129, + 144, 82, - 128, 97, 6, - 64, + 0, 131, 1, 81, 130, - 3, - 96, - 1, + 145, 8, 97, - 29, + 31, 224, 131, 1, - 129, - 144, 82, + 128, 97, - 29, - 192, + 6, + 64, 131, 1, 81, 130, - 145, - 9, + 3, 97, - 30, + 31, + 224, + 132, + 1, + 81, + 8, + 97, + 32, 0, 131, 1, + 129, + 144, 82, - 128, 97, 30, - 0, + 224, 131, 1, 81, + 130, + 145, + 9, 97, - 29, - 64, - 132, - 1, - 81, - 8, - 97, - 30, + 32, 32, 131, 1, 82, 128, 97, - 30, + 32, 32, 131, 1, 81, 97, - 3, - 224, + 31, + 128, 132, 1, 81, - 9, + 8, 97, - 30, + 32, 64, 131, 1, 82, 128, 97, - 6, + 32, 64, 131, 1, 81, - 96, - 2, - 9, - 97, - 30, - 96, - 131, - 1, - 82, - 128, - 97, - 5, - 192, - 131, - 1, - 81, - 130, - 3, 97, - 5, - 224, + 4, + 32, 132, 1, 81, - 8, - 97, - 30, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 30, - 96, - 131, - 1, - 81, - 130, - 145, 9, 97, - 30, - 160, + 32, + 96, 131, 1, 82, 128, 97, - 5, - 192, + 6, + 32, 131, 1, 81, @@ -27299,34 +28230,33 @@ pub mod inclusion_verifier { 81, 8, 97, - 30, - 192, + 32, + 128, 131, 1, 82, 128, 97, - 30, - 192, + 32, + 128, 131, 1, 81, - 130, - 3, 97, - 30, - 160, + 6, + 128, 132, 1, 81, - 8, + 9, 97, - 30, - 224, + 32, + 160, 131, 1, + 129, + 144, 82, - 128, 97, 6, 32, @@ -27334,47 +28264,41 @@ pub mod inclusion_verifier { 1, 81, 130, - 3, - 97, - 5, - 224, - 132, - 1, - 81, + 145, 8, 97, - 31, - 0, + 32, + 192, 131, 1, 82, 128, 97, - 31, - 0, + 6, + 96, 131, 1, 81, 130, 3, 97, - 30, - 224, + 32, + 192, 132, 1, 81, 8, 97, - 31, 32, + 224, 131, 1, 129, 144, 82, 97, - 29, - 160, + 30, + 224, 131, 1, 81, @@ -27382,138 +28306,138 @@ pub mod inclusion_verifier { 145, 9, 97, - 31, - 64, + 33, + 0, 131, 1, 82, 128, 97, - 31, - 64, + 33, + 0, 131, 1, 81, 97, - 30, - 64, + 32, + 96, 132, 1, 81, 8, 97, - 31, - 96, + 33, + 32, 131, 1, 82, 128, 97, - 31, - 96, + 33, + 32, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 31, - 128, + 33, + 64, 131, 1, 82, 128, 97, - 24, - 192, + 26, + 0, 131, 1, 81, 97, - 28, - 96, + 29, + 160, 132, 1, 81, 9, 97, - 31, - 160, + 33, + 96, 131, 1, 82, 128, 97, - 31, - 160, + 33, + 96, 131, 1, 81, 97, - 25, - 32, + 26, + 96, 132, 1, 81, 9, 97, - 31, - 192, + 33, + 128, 131, 1, 82, 128, 97, - 5, - 224, + 6, + 32, 131, 1, 81, 97, - 5, - 192, + 6, + 0, 132, 1, 81, 8, 97, - 31, - 224, + 33, + 160, 131, 1, 82, 128, 97, 6, - 64, + 128, 131, 1, 81, 130, 3, 97, - 31, - 224, + 33, + 160, 132, 1, 81, 8, 97, - 32, - 0, + 33, + 192, 131, 1, 129, 144, 82, 97, - 31, - 192, + 33, + 128, 131, 1, 81, @@ -27521,56 +28445,56 @@ pub mod inclusion_verifier { 145, 9, 97, - 32, - 32, + 33, + 224, 131, 1, 82, 128, 97, - 32, - 32, + 33, + 224, 131, 1, 81, 97, - 31, - 128, + 33, + 64, 132, 1, 81, 8, 97, - 32, - 64, + 34, + 0, 131, 1, 82, 128, 97, - 32, - 64, + 34, + 0, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, + 34, 32, - 96, 131, 1, 129, 144, 82, 97, - 32, - 32, + 33, + 224, 131, 1, 81, @@ -27578,35 +28502,35 @@ pub mod inclusion_verifier { 145, 8, 97, - 32, - 128, + 34, + 64, 131, 1, 82, 128, 97, - 32, - 128, + 34, + 64, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 32, - 160, + 34, + 96, 131, 1, 82, 128, 97, - 8, - 224, + 9, + 32, 131, 1, 81, @@ -27616,15 +28540,15 @@ pub mod inclusion_verifier { 1, 8, 97, - 32, - 192, + 34, + 128, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -27633,54 +28557,54 @@ pub mod inclusion_verifier { 145, 9, 97, - 32, - 224, + 34, + 160, 131, 1, 82, 128, 97, - 32, - 224, + 34, + 160, 131, 1, 81, 97, - 32, - 160, + 34, + 96, 132, 1, 81, 8, 97, - 33, - 0, + 34, + 192, 131, 1, 82, 128, 97, - 33, - 0, + 34, + 192, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 33, - 32, + 34, + 224, 131, 1, 82, 97, 9, - 64, + 128, 130, 1, 81, @@ -27689,37 +28613,37 @@ pub mod inclusion_verifier { 128, 9, 97, - 33, - 64, + 35, + 0, 131, 1, 82, 128, 97, 9, - 64, + 128, 131, 1, 81, 130, 3, 97, - 33, - 64, + 35, + 0, 132, 1, 81, 8, 97, - 33, - 96, + 35, + 32, 131, 1, 129, 144, 82, 97, - 17, + 18, 64, 131, 1, @@ -27728,55 +28652,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 33, - 128, + 35, + 64, 131, 1, 82, 128, 97, - 33, - 128, + 35, + 64, 131, 1, 81, 97, - 33, - 32, + 34, + 224, 132, 1, 81, 8, 97, - 33, - 160, + 35, + 96, 131, 1, 82, 128, 97, - 33, - 160, + 35, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 33, - 192, + 35, + 128, 131, 1, 82, 128, 97, 9, - 32, + 96, 131, 1, 81, @@ -27784,21 +28708,21 @@ pub mod inclusion_verifier { 3, 97, 9, - 64, + 128, 132, 1, 81, 8, 97, - 33, - 224, + 35, + 160, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -27807,54 +28731,54 @@ pub mod inclusion_verifier { 145, 9, 97, - 34, - 0, + 35, + 192, 131, 1, 82, 128, 97, - 34, - 0, + 35, + 192, 131, 1, 81, 97, - 33, - 192, + 35, + 128, 132, 1, 81, 8, 97, - 34, - 32, + 35, + 224, 131, 1, 82, 128, 97, - 34, - 32, + 35, + 224, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 34, - 64, + 36, + 0, 131, 1, 82, 128, 97, - 17, + 18, 64, 131, 1, @@ -27865,35 +28789,35 @@ pub mod inclusion_verifier { 1, 8, 97, - 34, - 96, + 36, + 32, 131, 1, 82, 128, 97, - 17, + 18, 128, 131, 1, 81, 97, - 17, + 18, 96, 132, 1, 81, 8, 97, - 34, - 128, + 36, + 64, 131, 1, 129, 144, 82, 97, - 17, + 18, 160, 131, 1, @@ -27902,15 +28826,15 @@ pub mod inclusion_verifier { 145, 8, 97, - 34, - 160, + 36, + 96, 131, 1, 129, 144, 82, 97, - 17, + 18, 192, 131, 1, @@ -27919,15 +28843,15 @@ pub mod inclusion_verifier { 145, 8, 97, - 34, - 192, + 36, + 128, 131, 1, 129, 144, 82, 97, - 17, + 18, 224, 131, 1, @@ -27936,70 +28860,70 @@ pub mod inclusion_verifier { 145, 8, 97, - 34, - 224, + 36, + 160, 131, 1, 82, 128, 97, - 34, - 224, + 36, + 160, 131, 1, 81, 130, 3, 97, - 34, - 96, + 36, + 32, 132, 1, 81, 8, 97, - 35, - 0, + 36, + 192, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, 8, - 32, + 96, 132, 1, 81, 9, 97, - 35, - 32, + 36, + 224, 131, 1, 82, 128, 97, - 35, - 32, + 36, + 224, 131, 1, 81, 97, 6, - 160, + 224, 132, 1, 81, 8, 97, - 35, - 64, + 37, + 0, 131, 1, 129, @@ -28007,7 +28931,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28015,48 +28939,48 @@ pub mod inclusion_verifier { 145, 8, 97, - 35, - 96, + 37, + 32, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, 8, - 64, + 128, 132, 1, 81, 9, 97, - 35, - 128, + 37, + 64, 131, 1, 82, 128, 97, - 35, - 128, + 37, + 64, 131, 1, 81, 97, - 5, - 192, + 6, + 0, 132, 1, 81, 8, 97, - 35, - 160, + 37, + 96, 131, 1, 129, @@ -28064,7 +28988,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28072,16 +28996,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 35, - 192, + 37, + 128, 131, 1, 129, 144, 82, 97, - 35, - 96, + 37, + 32, 131, 1, 81, @@ -28089,48 +29013,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 35, - 224, + 37, + 160, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, 8, - 96, + 160, 132, 1, 81, 9, 97, - 36, - 0, + 37, + 192, 131, 1, 82, 128, 97, - 36, - 0, + 37, + 192, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, 8, 97, - 36, - 32, + 37, + 224, 131, 1, 129, @@ -28138,7 +29062,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28146,16 +29070,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 36, - 64, + 38, + 0, 131, 1, 129, 144, 82, 97, - 35, - 224, + 37, + 160, 131, 1, 81, @@ -28163,48 +29087,48 @@ pub mod inclusion_verifier { 145, 9, 97, - 36, - 96, + 38, + 32, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, 8, - 128, + 192, 132, 1, 81, 9, 97, - 36, - 128, + 38, + 64, 131, 1, 82, 128, 97, - 36, - 128, + 38, + 64, 131, 1, 81, 97, - 6, - 192, + 7, + 0, 132, 1, 81, 8, 97, - 36, - 160, + 38, + 96, 131, 1, 129, @@ -28212,7 +29136,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28220,16 +29144,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 36, - 192, + 38, + 128, 131, 1, 129, 144, 82, 97, - 36, - 96, + 38, + 32, 131, 1, 81, @@ -28237,8 +29161,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 36, - 224, + 38, + 160, 131, 1, 129, @@ -28246,7 +29170,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 0, + 64, 131, 1, 81, @@ -28254,15 +29178,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 37, - 0, + 38, + 192, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -28270,48 +29194,48 @@ pub mod inclusion_verifier { 1, 9, 97, - 37, - 32, + 38, + 224, 131, 1, 82, 128, 97, - 37, - 32, + 38, + 224, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 37, - 64, + 39, + 0, 131, 1, 82, 128, 97, - 37, - 64, + 39, + 0, 131, 1, 81, 97, 6, - 160, + 224, 132, 1, 81, 8, 97, - 37, - 96, + 39, + 32, 131, 1, 129, @@ -28319,7 +29243,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28327,15 +29251,15 @@ pub mod inclusion_verifier { 145, 8, 97, - 37, - 128, + 39, + 64, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -28374,48 +29298,48 @@ pub mod inclusion_verifier { 162, 9, 97, - 37, - 160, + 39, + 96, 131, 1, 82, 128, 97, - 37, - 160, + 39, + 96, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 37, - 192, + 39, + 128, 131, 1, 82, 128, 97, - 37, - 192, + 39, + 128, 131, 1, 81, 97, - 5, - 192, + 6, + 0, 132, 1, 81, 8, 97, - 37, - 224, + 39, + 160, 131, 1, 129, @@ -28423,7 +29347,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28431,16 +29355,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 38, - 0, + 39, + 192, 131, 1, 129, 144, 82, 97, - 37, - 128, + 39, + 64, 131, 1, 81, @@ -28448,15 +29372,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 38, - 32, + 39, + 224, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -28495,48 +29419,48 @@ pub mod inclusion_verifier { 43, 9, 97, - 38, - 64, + 40, + 0, 131, 1, 82, 128, 97, - 38, - 64, + 40, + 0, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 38, - 96, + 40, + 32, 131, 1, 82, 128, 97, - 38, - 96, + 40, + 32, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, 8, 97, - 38, - 128, + 40, + 64, 131, 1, 129, @@ -28544,7 +29468,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28552,16 +29476,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 38, - 160, + 40, + 96, 131, 1, 129, 144, 82, 97, - 38, - 32, + 39, + 224, 131, 1, 81, @@ -28569,15 +29493,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 38, - 192, + 40, + 128, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -28616,48 +29540,48 @@ pub mod inclusion_verifier { 82, 9, 97, - 38, - 224, + 40, + 160, 131, 1, 82, 128, 97, - 38, - 224, + 40, + 160, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 39, - 0, + 40, + 192, 131, 1, 82, 128, 97, - 39, - 0, + 40, + 192, 131, 1, 81, 97, - 6, - 192, + 7, + 0, 132, 1, 81, 8, 97, - 39, - 32, + 40, + 224, 131, 1, 129, @@ -28665,7 +29589,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28673,16 +29597,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 39, - 64, + 41, + 0, 131, 1, 129, 144, 82, 97, - 38, - 192, + 40, + 128, 131, 1, 81, @@ -28690,16 +29614,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 39, - 96, + 41, + 32, 131, 1, 129, 144, 82, 97, - 8, - 224, + 9, + 32, 131, 1, 81, @@ -28707,38 +29631,38 @@ pub mod inclusion_verifier { 145, 9, 97, - 39, - 128, + 41, + 64, 131, 1, 82, 128, 97, - 39, - 128, + 41, + 64, 131, 1, 81, 130, 3, 97, - 37, - 0, + 38, + 192, 132, 1, 81, 8, 97, - 39, - 160, + 41, + 96, 131, 1, 129, 144, 82, 97, - 35, - 0, + 36, + 192, 131, 1, 81, @@ -28746,88 +29670,88 @@ pub mod inclusion_verifier { 145, 9, 97, - 39, - 192, + 41, + 128, 131, 1, 82, 128, 97, - 39, - 192, + 41, + 128, 131, 1, 81, 97, - 34, - 64, + 36, + 0, 132, 1, 81, 8, 97, - 39, - 224, + 41, + 160, 131, 1, 82, 128, 97, - 39, - 224, + 41, + 160, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 40, - 0, + 41, + 192, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, 8, - 160, + 224, 132, 1, 81, 9, 97, - 40, - 32, + 41, + 224, 131, 1, 82, 128, 97, - 40, - 32, + 41, + 224, 131, 1, 81, 97, 6, - 64, + 128, 132, 1, 81, 8, 97, - 40, - 64, + 42, + 0, 131, 1, 129, @@ -28835,7 +29759,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28843,48 +29767,48 @@ pub mod inclusion_verifier { 145, 8, 97, - 40, - 96, + 42, + 32, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, - 8, - 192, + 9, + 0, 132, 1, 81, 9, 97, - 40, - 128, + 42, + 64, 131, 1, 82, 128, 97, - 40, - 128, + 42, + 64, 131, 1, 81, 97, - 18, - 64, + 19, + 128, 132, 1, 81, 8, 97, - 40, - 160, + 42, + 96, 131, 1, 129, @@ -28892,7 +29816,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -28900,16 +29824,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 40, - 192, + 42, + 128, 131, 1, 129, 144, 82, 97, - 40, - 96, + 42, + 32, 131, 1, 81, @@ -28917,8 +29841,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 40, - 224, + 42, + 160, 131, 1, 129, @@ -28926,7 +29850,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 96, + 160, 131, 1, 81, @@ -28934,15 +29858,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 41, - 0, + 42, + 192, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -28980,48 +29904,48 @@ pub mod inclusion_verifier { 66, 9, 97, - 41, - 32, + 42, + 224, 131, 1, 82, 128, 97, - 41, - 32, + 42, + 224, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 41, - 64, + 43, + 0, 131, 1, 82, 128, 97, - 41, - 64, + 43, + 0, 131, 1, 81, 97, 6, - 64, + 128, 132, 1, 81, 8, 97, - 41, - 96, + 43, + 32, 131, 1, 129, @@ -29029,7 +29953,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -29037,15 +29961,15 @@ pub mod inclusion_verifier { 145, 8, 97, - 41, - 128, + 43, + 64, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, @@ -29084,48 +30008,48 @@ pub mod inclusion_verifier { 157, 9, 97, - 41, - 160, + 43, + 96, 131, 1, 82, 128, 97, - 41, - 160, + 43, + 96, 131, 1, 81, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 41, - 192, + 43, + 128, 131, 1, 82, 128, 97, - 41, - 192, + 43, + 128, 131, 1, 81, 97, - 18, - 64, + 19, + 128, 132, 1, 81, 8, 97, - 41, - 224, + 43, + 160, 131, 1, 129, @@ -29133,7 +30057,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 128, + 192, 131, 1, 81, @@ -29141,16 +30065,16 @@ pub mod inclusion_verifier { 145, 8, 97, - 42, - 0, + 43, + 192, 131, 1, 129, 144, 82, 97, - 41, - 128, + 43, + 64, 131, 1, 81, @@ -29158,8 +30082,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 32, + 43, + 224, 131, 1, 129, @@ -29167,7 +30091,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 64, + 128, 131, 1, 81, @@ -29175,38 +30099,38 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 64, + 44, + 0, 131, 1, 82, 128, 97, - 42, - 64, + 44, + 0, 131, 1, 81, 130, 3, 97, - 41, - 0, + 42, + 192, 132, 1, 81, 8, 97, - 42, - 96, + 44, + 32, 131, 1, 129, 144, 82, 97, - 35, - 0, + 36, + 192, 131, 1, 81, @@ -29214,55 +30138,55 @@ pub mod inclusion_verifier { 145, 9, 97, - 42, - 128, + 44, + 64, 131, 1, 82, 128, 97, - 42, - 128, + 44, + 64, 131, 1, 81, 97, - 40, - 0, + 41, + 192, 132, 1, 81, 8, 97, - 42, - 160, + 44, + 96, 131, 1, 82, 128, 97, - 42, - 160, + 44, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 42, - 192, + 44, + 128, 131, 1, 82, 128, 97, 9, - 128, + 192, 131, 1, 81, @@ -29272,15 +30196,15 @@ pub mod inclusion_verifier { 1, 8, 97, - 42, - 224, + 44, + 160, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -29289,54 +30213,54 @@ pub mod inclusion_verifier { 145, 9, 97, - 43, - 0, + 44, + 192, 131, 1, 82, 128, 97, - 43, - 0, + 44, + 192, 131, 1, 81, 97, - 42, - 192, + 44, + 128, 132, 1, 81, 8, 97, - 43, - 32, + 44, + 224, 131, 1, 82, 128, 97, - 43, - 32, + 44, + 224, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 43, - 64, + 45, + 0, 131, 1, 82, 97, 9, - 128, + 192, 130, 1, 81, @@ -29345,37 +30269,37 @@ pub mod inclusion_verifier { 128, 9, 97, - 43, - 96, + 45, + 32, 131, 1, 82, 128, 97, 9, - 128, + 192, 131, 1, 81, 130, 3, 97, - 43, - 96, + 45, + 32, 132, 1, 81, 8, 97, - 43, - 128, + 45, + 64, 131, 1, 129, 144, 82, 97, - 17, + 18, 64, 131, 1, @@ -29384,68 +30308,68 @@ pub mod inclusion_verifier { 145, 9, 97, - 43, - 160, + 45, + 96, 131, 1, 82, 128, 97, - 43, - 160, + 45, + 96, 131, 1, 81, 97, - 43, - 64, + 45, + 0, 132, 1, 81, 8, 97, - 43, - 192, + 45, + 128, 131, 1, 82, 128, 97, - 43, - 192, + 45, + 128, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 43, - 224, + 45, + 160, 131, 1, 82, 128, 97, 2, - 32, + 96, 131, 1, 81, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 44, - 0, + 45, + 192, 131, 1, 129, @@ -29453,7 +30377,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 160, + 224, 131, 1, 81, @@ -29461,36 +30385,36 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 32, + 45, + 224, 131, 1, 82, 128, 97, 2, - 128, + 192, 131, 1, 81, 97, 10, - 0, + 64, 132, 1, 81, 8, 97, - 44, - 64, + 46, + 0, 131, 1, 129, 144, 82, 97, - 44, - 32, + 45, + 224, 131, 1, 81, @@ -29498,15 +30422,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 96, + 46, + 32, 131, 1, 82, 128, 97, 6, - 0, + 64, 131, 1, 81, @@ -29515,30 +30439,30 @@ pub mod inclusion_verifier { 0, 9, 97, - 44, - 128, + 46, + 64, 131, 1, 82, 128, 97, - 44, - 128, + 46, + 64, 131, 1, 81, 130, 3, 97, - 5, - 192, + 6, + 0, 132, 1, 81, 8, 97, - 44, - 160, + 46, + 96, 131, 1, 129, @@ -29546,7 +30470,7 @@ pub mod inclusion_verifier { 82, 97, 7, - 64, + 128, 131, 1, 81, @@ -29554,8 +30478,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 44, - 192, + 46, + 128, 131, 1, 129, @@ -29563,7 +30487,7 @@ pub mod inclusion_verifier { 82, 97, 2, - 32, + 96, 131, 1, 81, @@ -29571,8 +30495,8 @@ pub mod inclusion_verifier { 145, 8, 97, - 44, - 224, + 46, + 160, 131, 1, 129, @@ -29580,7 +30504,7 @@ pub mod inclusion_verifier { 82, 97, 9, - 128, + 192, 131, 1, 81, @@ -29588,36 +30512,36 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 0, + 46, + 192, 131, 1, 82, 128, 97, 2, - 128, + 192, 131, 1, 81, 97, 7, - 32, + 96, 132, 1, 81, 8, 97, - 45, - 32, + 46, + 224, 131, 1, 129, 144, 82, 97, - 45, - 0, + 46, + 192, 131, 1, 81, @@ -29625,38 +30549,38 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 64, + 47, + 0, 131, 1, 82, 128, 97, - 45, - 64, + 47, + 0, 131, 1, 81, 130, 3, 97, - 44, - 96, + 46, + 32, 132, 1, 81, 8, 97, - 45, - 96, + 47, + 32, 131, 1, 129, 144, 82, 97, - 35, - 0, + 36, + 192, 131, 1, 81, @@ -29664,77 +30588,77 @@ pub mod inclusion_verifier { 145, 9, 97, - 45, - 128, + 47, + 64, 131, 1, 82, 128, 97, - 45, - 128, + 47, + 64, 131, 1, 81, 97, - 43, - 224, + 45, + 160, 132, 1, 81, 8, 97, - 45, - 160, + 47, + 96, 131, 1, 82, 128, 97, - 45, - 160, + 47, + 96, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 45, - 192, + 47, + 128, 131, 1, 82, 128, 97, 10, - 0, + 64, 131, 1, 81, 130, 3, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 45, - 224, + 47, + 160, 131, 1, 129, 144, 82, 97, - 18, + 19, 0, 131, 1, @@ -29743,98 +30667,98 @@ pub mod inclusion_verifier { 145, 9, 97, - 46, - 0, + 47, + 192, 131, 1, 82, 128, 97, - 46, - 0, + 47, + 192, 131, 1, 81, 97, - 45, - 192, + 47, + 128, 132, 1, 81, 8, 97, - 46, - 32, + 47, + 224, 131, 1, 82, 128, 97, - 46, - 32, + 47, + 224, 131, 1, 81, 97, - 3, - 224, + 4, + 32, 132, 1, 81, 9, 97, - 46, - 64, + 48, + 0, 131, 1, 82, 128, 97, - 35, - 0, + 36, + 192, 131, 1, 81, 97, - 45, - 224, + 47, + 160, 132, 1, 81, 9, 97, - 46, - 96, + 48, + 32, 131, 1, 82, 128, 97, - 9, - 224, + 10, + 32, 131, 1, 81, 130, 3, 97, - 9, - 192, + 10, + 0, 132, 1, 81, 8, 97, - 46, - 128, + 48, + 64, 131, 1, 129, 144, 82, 97, - 46, - 96, + 48, + 32, 131, 1, 81, @@ -29842,34 +30766,34 @@ pub mod inclusion_verifier { 145, 9, 97, - 46, - 160, + 48, + 96, 131, 1, 82, 128, 97, - 46, - 160, + 48, + 96, 131, 1, 81, 97, - 46, - 64, + 48, + 0, 132, 1, 81, 8, 97, - 46, - 192, + 48, + 128, 131, 1, 82, 97, 13, - 0, + 64, 130, 1, 81, @@ -29878,8 +30802,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 46, - 224, + 48, + 160, 131, 1, 129, @@ -29887,7 +30811,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -29895,8 +30819,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 0, + 48, + 192, 131, 1, 129, @@ -29904,7 +30828,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -29912,8 +30836,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 32, + 48, + 224, 131, 1, 129, @@ -29921,7 +30845,7 @@ pub mod inclusion_verifier { 82, 97, 13, - 0, + 64, 131, 1, 81, @@ -29929,15 +30853,15 @@ pub mod inclusion_verifier { 145, 9, 97, - 47, - 64, + 49, + 0, 131, 1, 82, 128, 97, 13, - 0, + 64, 131, 1, 81, @@ -29945,15 +30869,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 96, + 49, + 32, 131, 1, 82, 128, 97, - 46, - 224, + 48, + 160, 131, 1, 81, @@ -29961,15 +30885,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 128, + 49, + 64, 131, 1, 82, 128, 97, - 47, - 0, + 48, + 192, 131, 1, 81, @@ -29977,15 +30901,15 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 160, + 49, + 96, 131, 1, 82, 128, 97, - 47, - 32, + 48, + 224, 131, 1, 81, @@ -29993,48 +30917,48 @@ pub mod inclusion_verifier { 1, 9, 97, - 47, - 192, + 49, + 128, 131, 1, 82, 128, 97, 13, - 32, + 96, 131, 1, 81, 97, - 46, - 192, + 48, + 128, 132, 1, 81, 9, 97, - 47, - 224, + 49, + 160, 131, 1, 82, 128, 97, 5, - 128, + 192, 131, 1, 81, 97, - 11, - 192, + 12, + 0, 132, 1, 81, 9, 97, - 48, - 0, + 49, + 192, 131, 1, 82, @@ -30043,21 +30967,21 @@ pub mod inclusion_verifier { 1, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 32, + 49, + 224, 131, 1, 82, 128, 97, - 48, - 32, + 49, + 224, 131, 1, 81, @@ -30065,14 +30989,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 64, + 50, + 0, 131, 1, 82, @@ -30112,21 +31036,21 @@ pub mod inclusion_verifier { 95, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 96, + 50, + 32, 131, 1, 82, 128, 97, - 48, - 96, + 50, + 32, 131, 1, 81, @@ -30134,14 +31058,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 128, + 50, + 64, 131, 1, 82, @@ -30181,21 +31105,21 @@ pub mod inclusion_verifier { 2, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 160, + 50, + 96, 131, 1, 82, 128, 97, - 48, - 160, + 50, + 96, 131, 1, 81, @@ -30203,14 +31127,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 48, - 192, + 50, + 128, 131, 1, 82, @@ -30250,21 +31174,21 @@ pub mod inclusion_verifier { 26, 97, 5, - 128, + 192, 132, 1, 81, 9, 97, - 48, - 224, + 50, + 160, 131, 1, 82, 128, 97, - 48, - 224, + 50, + 160, 131, 1, 81, @@ -30272,14 +31196,14 @@ pub mod inclusion_verifier { 3, 97, 11, - 64, + 128, 132, 1, 81, 8, 97, - 49, - 0, + 50, + 192, 131, 1, 82, @@ -30319,15 +31243,15 @@ pub mod inclusion_verifier { 121, 139, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -30370,15 +31294,15 @@ pub mod inclusion_verifier { 134, 118, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -30388,8 +31312,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 32, + 50, + 224, 132, 1, 82, @@ -30430,15 +31354,15 @@ pub mod inclusion_verifier { 97, 54, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -30481,15 +31405,15 @@ pub mod inclusion_verifier { 231, 116, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -30499,8 +31423,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 64, + 51, + 0, 132, 1, 82, @@ -30541,15 +31465,15 @@ pub mod inclusion_verifier { 12, 40, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -30592,30 +31516,30 @@ pub mod inclusion_verifier { 239, 215, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 49, - 96, + 51, + 32, 132, 1, 82, 80, 97, - 48, - 64, + 50, + 0, 130, 1, 81, @@ -30625,16 +31549,16 @@ pub mod inclusion_verifier { 1, 9, 97, - 49, - 128, + 51, + 64, 131, 1, 129, 144, 82, 97, - 48, - 128, + 50, + 64, 131, 1, 81, @@ -30642,16 +31566,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 49, - 160, + 51, + 96, 131, 1, 129, 144, 82, 97, - 49, - 0, + 50, + 192, 131, 1, 81, @@ -30659,8 +31583,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 49, - 192, + 51, + 128, 131, 1, 82, @@ -30669,7 +31593,7 @@ pub mod inclusion_verifier { 1, 97, 11, - 64, + 128, 132, 1, 81, @@ -30712,7 +31636,7 @@ pub mod inclusion_verifier { 0, 97, 5, - 128, + 192, 135, 1, 81, @@ -30722,8 +31646,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 49, - 224, + 51, + 160, 132, 1, 82, @@ -30764,15 +31688,15 @@ pub mod inclusion_verifier { 76, 242, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -30815,15 +31739,15 @@ pub mod inclusion_verifier { 179, 15, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -30833,8 +31757,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 0, + 51, + 192, 132, 1, 82, @@ -30875,15 +31799,15 @@ pub mod inclusion_verifier { 141, 207, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -30926,15 +31850,15 @@ pub mod inclusion_verifier { 38, 251, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -30944,8 +31868,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 32, + 51, + 224, 132, 1, 82, @@ -30986,15 +31910,15 @@ pub mod inclusion_verifier { 8, 51, 97, - 11, - 192, + 12, + 0, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -31037,36 +31961,36 @@ pub mod inclusion_verifier { 46, 39, 97, - 11, - 192, + 12, + 0, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 50, - 64, + 52, + 0, 132, 1, 82, 80, 97, - 48, - 192, + 50, + 128, 130, 1, 81, 97, - 49, - 160, + 51, + 96, 131, 1, 81, @@ -31075,8 +31999,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 50, - 96, + 52, + 32, 131, 1, 82, @@ -31117,14 +32041,14 @@ pub mod inclusion_verifier { 163, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -31168,14 +32092,14 @@ pub mod inclusion_verifier { 94, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -31185,8 +32109,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 128, + 52, + 64, 132, 1, 82, @@ -31228,14 +32152,14 @@ pub mod inclusion_verifier { 94, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -31279,14 +32203,14 @@ pub mod inclusion_verifier { 227, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -31296,8 +32220,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 160, + 52, + 96, 132, 1, 82, @@ -31339,14 +32263,14 @@ pub mod inclusion_verifier { 232, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -31390,14 +32314,14 @@ pub mod inclusion_verifier { 25, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, @@ -31407,8 +32331,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 50, - 192, + 52, + 128, 132, 1, 82, @@ -31450,14 +32374,14 @@ pub mod inclusion_verifier { 25, 97, 5, - 128, + 192, 133, 1, 81, 9, 97, 11, - 64, + 128, 132, 1, 81, @@ -31501,35 +32425,35 @@ pub mod inclusion_verifier { 55, 97, 5, - 128, + 192, 136, 1, 81, 9, 97, 5, - 128, + 192, 135, 1, 81, 9, 8, 97, - 50, - 224, + 52, + 160, 132, 1, 82, 80, 97, - 49, - 0, + 50, + 192, 130, 1, 81, 97, - 49, - 128, + 51, + 64, 131, 1, 81, @@ -31538,22 +32462,22 @@ pub mod inclusion_verifier { 144, 9, 97, - 51, - 0, + 52, + 192, 131, 1, 82, 97, - 49, - 32, + 50, + 224, 130, 1, 81, 129, 129, 97, - 49, - 64, + 51, + 0, 133, 1, 81, @@ -31562,16 +32486,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 32, + 52, + 224, 132, 1, 82, 129, 129, 97, - 49, - 96, + 51, + 32, 133, 1, 81, @@ -31580,16 +32504,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 64, + 53, + 0, 132, 1, 82, 129, 129, 97, - 49, - 224, + 51, + 160, 133, 1, 81, @@ -31598,16 +32522,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 96, + 53, + 32, 132, 1, 82, 129, 129, 97, - 49, - 128, + 51, + 64, 133, 1, 81, @@ -31616,16 +32540,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 128, + 53, + 64, 132, 1, 82, 129, 129, 97, - 50, - 0, + 51, + 192, 133, 1, 81, @@ -31634,16 +32558,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 160, + 53, + 96, 132, 1, 82, 129, 129, 97, - 50, - 32, + 51, + 224, 133, 1, 81, @@ -31652,16 +32576,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 192, + 53, + 128, 132, 1, 82, 129, 129, 97, - 50, - 64, + 52, + 0, 133, 1, 81, @@ -31670,16 +32594,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 51, - 224, + 53, + 160, 132, 1, 82, 129, 129, 97, - 50, - 96, + 52, + 32, 133, 1, 81, @@ -31688,16 +32612,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 0, + 53, + 192, 132, 1, 82, 129, 129, 97, - 50, - 128, + 52, + 64, 133, 1, 81, @@ -31706,16 +32630,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 32, + 53, + 224, 132, 1, 82, 129, 129, 97, - 50, - 160, + 52, + 96, 133, 1, 81, @@ -31724,16 +32648,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 64, + 54, + 0, 132, 1, 82, 129, 129, 97, - 49, - 160, + 51, + 96, 133, 1, 81, @@ -31742,16 +32666,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 96, + 54, + 32, 132, 1, 82, 129, 129, 97, - 50, - 192, + 52, + 128, 133, 1, 81, @@ -31760,16 +32684,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 128, + 54, + 64, 132, 1, 82, 129, 129, 97, - 50, - 224, + 52, + 160, 133, 1, 81, @@ -31778,16 +32702,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 160, + 54, + 96, 132, 1, 82, 129, 129, 97, - 51, - 0, + 52, + 192, 133, 1, 81, @@ -31796,8 +32720,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 52, - 192, + 54, + 128, 132, 1, 82, @@ -31805,36 +32729,36 @@ pub mod inclusion_verifier { 96, 32, 97, - 53, - 0, + 54, + 192, 131, 1, 82, 96, 32, 97, - 53, - 32, + 54, + 224, 131, 1, 82, 96, 32, 97, - 53, - 64, + 55, + 0, 131, 1, 82, 97, - 52, - 192, + 54, + 128, 130, 1, 81, 97, - 53, - 96, + 55, + 32, 131, 1, 82, @@ -31872,8 +32796,8 @@ pub mod inclusion_verifier { 255, 255, 97, - 53, - 128, + 55, + 64, 131, 1, 82, @@ -31884,8 +32808,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -31893,8 +32817,8 @@ pub mod inclusion_verifier { 145, 82, 97, - 53, - 160, + 55, + 96, 131, 1, 82, @@ -31904,15 +32828,15 @@ pub mod inclusion_verifier { 96, 32, 97, - 52, - 224, + 54, + 160, 133, 1, 96, 192, 97, - 53, - 0, + 54, + 192, 135, 1, 96, @@ -31924,16 +32848,16 @@ pub mod inclusion_verifier { 146, 80, 97, - 52, - 224, + 54, + 160, 130, 1, 81, 96, 0, 97, - 51, - 0, + 52, + 192, 132, 1, 81, @@ -31942,15 +32866,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 160, + 54, + 96, 134, 1, 81, 9, 97, - 51, - 0, + 52, + 192, 133, 1, 82, @@ -31961,8 +32885,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 224, + 52, + 160, 132, 1, 81, @@ -31971,15 +32895,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 128, + 54, + 64, 134, 1, 81, 9, 97, - 50, - 224, + 52, + 160, 133, 1, 82, @@ -31990,8 +32914,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 192, + 52, + 128, 132, 1, 81, @@ -32000,15 +32924,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 96, + 54, + 32, 134, 1, 81, 9, 97, - 50, - 192, + 52, + 128, 133, 1, 82, @@ -32018,9 +32942,9 @@ pub mod inclusion_verifier { 9, 145, 80, - 97, - 49, - 160, + 97, + 51, + 96, 132, 1, 81, @@ -32029,15 +32953,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 64, + 54, + 0, 134, 1, 81, 9, 97, - 49, - 160, + 51, + 96, 133, 1, 82, @@ -32048,8 +32972,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 160, + 52, + 96, 132, 1, 81, @@ -32058,15 +32982,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 32, + 53, + 224, 134, 1, 81, 9, 97, - 50, - 160, + 52, + 96, 133, 1, 82, @@ -32077,8 +33001,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 128, + 52, + 64, 132, 1, 81, @@ -32087,15 +33011,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 52, - 0, + 53, + 192, 134, 1, 81, 9, 97, - 50, - 128, + 52, + 64, 133, 1, 82, @@ -32106,8 +33030,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 96, + 52, + 32, 132, 1, 81, @@ -32116,15 +33040,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 224, + 53, + 160, 134, 1, 81, 9, 97, - 50, - 96, + 52, + 32, 133, 1, 82, @@ -32135,8 +33059,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 64, + 52, + 0, 132, 1, 81, @@ -32145,15 +33069,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 192, + 53, + 128, 134, 1, 81, 9, 97, - 50, - 64, + 52, + 0, 133, 1, 82, @@ -32164,8 +33088,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 32, + 51, + 224, 132, 1, 81, @@ -32174,15 +33098,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 160, + 53, + 96, 134, 1, 81, 9, 97, - 50, - 32, + 51, + 224, 133, 1, 82, @@ -32193,8 +33117,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 50, - 0, + 51, + 192, 132, 1, 81, @@ -32203,15 +33127,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 128, + 53, + 64, 134, 1, 81, 9, 97, - 50, - 0, + 51, + 192, 133, 1, 82, @@ -32222,8 +33146,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 128, + 51, + 64, 132, 1, 81, @@ -32232,15 +33156,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 96, + 53, + 32, 134, 1, 81, 9, 97, - 49, - 128, + 51, + 64, 133, 1, 82, @@ -32251,8 +33175,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 224, + 51, + 160, 132, 1, 81, @@ -32261,15 +33185,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 64, + 53, + 0, 134, 1, 81, 9, 97, - 49, - 224, + 51, + 160, 133, 1, 82, @@ -32280,8 +33204,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 96, + 51, + 32, 132, 1, 81, @@ -32290,15 +33214,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 51, - 32, + 52, + 224, 134, 1, 81, 9, 97, - 49, - 96, + 51, + 32, 133, 1, 82, @@ -32309,8 +33233,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 49, - 64, + 51, + 0, 132, 1, 81, @@ -32319,15 +33243,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 49, - 32, + 50, + 224, 134, 1, 81, 9, 97, - 49, - 64, + 51, + 0, 133, 1, 82, @@ -32336,16 +33260,16 @@ pub mod inclusion_verifier { 130, 9, 97, - 49, - 32, + 50, + 224, 133, 1, 129, 144, 82, 97, - 49, - 64, + 51, + 0, 133, 1, 81, @@ -32363,28 +33287,28 @@ pub mod inclusion_verifier { 129, 129, 97, - 49, - 96, + 51, + 32, 133, 1, 81, 8, 97, - 53, - 192, + 55, + 128, 132, 1, 82, 80, 97, - 49, - 128, + 51, + 64, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -32393,56 +33317,56 @@ pub mod inclusion_verifier { 144, 9, 97, - 53, - 224, + 55, + 160, 131, 1, 82, 97, - 49, - 224, + 51, + 160, 130, 1, 81, 128, 97, - 54, - 0, + 55, + 192, 132, 1, 82, 80, 128, 97, - 50, - 96, + 52, + 32, 131, 1, 81, 97, - 49, - 192, + 51, + 128, 132, 1, 81, 9, 97, - 54, - 32, + 55, + 224, 131, 1, 82, 97, - 50, - 0, + 51, + 192, 130, 1, 81, 129, 129, 97, - 50, - 32, + 51, + 224, 133, 1, 81, @@ -32452,28 +33376,28 @@ pub mod inclusion_verifier { 129, 129, 97, - 50, - 64, + 52, + 0, 133, 1, 81, 8, 97, - 54, - 64, + 56, + 0, 132, 1, 82, 80, 97, - 49, - 160, + 51, + 96, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -32482,42 +33406,42 @@ pub mod inclusion_verifier { 144, 9, 97, - 54, - 96, + 56, + 32, 131, 1, 82, 97, - 50, - 128, + 52, + 64, 130, 1, 81, 129, 129, 97, - 50, - 160, + 52, + 96, 133, 1, 81, 8, 97, - 54, - 128, + 56, + 64, 132, 1, 82, 80, 97, - 51, - 0, + 52, + 192, 130, 1, 81, 97, - 49, - 192, + 51, + 128, 131, 1, 81, @@ -32526,42 +33450,42 @@ pub mod inclusion_verifier { 144, 9, 97, - 54, - 160, + 56, + 96, 131, 1, 82, 97, - 50, - 192, + 52, + 128, 130, 1, 81, 129, 129, 97, - 50, - 224, + 52, + 160, 133, 1, 81, 8, 97, - 54, - 192, + 56, + 128, 132, 1, 82, 80, 97, - 53, - 192, + 55, + 128, 130, 1, 81, 97, - 54, - 0, + 55, + 192, 131, 1, 81, @@ -32574,16 +33498,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 54, - 224, + 56, + 160, 132, 1, 82, 129, 129, 97, - 54, - 64, + 56, + 0, 133, 1, 81, @@ -32592,16 +33516,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 0, + 56, + 192, 132, 1, 82, 129, 129, 97, - 54, - 128, + 56, + 64, 133, 1, 81, @@ -32610,16 +33534,16 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 32, + 56, + 224, 132, 1, 82, 129, 129, 97, - 54, - 192, + 56, + 128, 133, 1, 81, @@ -32628,8 +33552,8 @@ pub mod inclusion_verifier { 80, 128, 97, - 55, - 64, + 57, + 0, 132, 1, 82, @@ -32637,36 +33561,36 @@ pub mod inclusion_verifier { 96, 32, 97, - 55, - 128, + 57, + 64, 131, 1, 82, 96, 32, 97, - 55, - 160, + 57, + 96, 131, 1, 82, 96, 32, 97, - 55, - 192, + 57, + 128, 131, 1, 82, 97, - 55, - 64, + 57, + 0, 130, 1, 81, 97, - 55, - 224, + 57, + 160, 131, 1, 82, @@ -32704,8 +33628,8 @@ pub mod inclusion_verifier { 255, 255, 97, - 56, - 0, + 57, + 192, 131, 1, 82, @@ -32716,8 +33640,8 @@ pub mod inclusion_verifier { 96, 32, 97, - 84, - 18, + 85, + 225, 131, 57, 129, @@ -32725,8 +33649,8 @@ pub mod inclusion_verifier { 145, 82, 97, - 56, - 32, + 57, + 224, 131, 1, 82, @@ -32736,15 +33660,15 @@ pub mod inclusion_verifier { 96, 32, 97, - 55, - 96, + 57, + 32, 133, 1, 96, 192, 97, - 55, - 128, + 57, + 64, 135, 1, 96, @@ -32756,16 +33680,16 @@ pub mod inclusion_verifier { 146, 80, 97, - 55, - 96, + 57, + 32, 130, 1, 81, 96, 0, 97, - 54, - 192, + 56, + 128, 132, 1, 81, @@ -32774,15 +33698,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 55, - 32, + 56, + 224, 134, 1, 81, 9, 97, - 54, - 192, + 56, + 128, 133, 1, 82, @@ -32793,8 +33717,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 128, + 56, + 64, 132, 1, 81, @@ -32803,15 +33727,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 55, - 0, + 56, + 192, 134, 1, 81, 9, 97, - 54, - 128, + 56, + 64, 133, 1, 82, @@ -32822,8 +33746,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 64, + 56, + 0, 132, 1, 81, @@ -32832,15 +33756,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 54, - 224, + 56, + 160, 134, 1, 81, 9, 97, - 54, - 64, + 56, + 0, 133, 1, 82, @@ -32851,8 +33775,8 @@ pub mod inclusion_verifier { 145, 80, 97, - 54, - 0, + 55, + 192, 132, 1, 81, @@ -32861,15 +33785,15 @@ pub mod inclusion_verifier { 130, 130, 97, - 53, - 192, + 55, + 128, 134, 1, 81, 9, 97, - 54, - 0, + 55, + 192, 133, 1, 82, @@ -32878,22 +33802,22 @@ pub mod inclusion_verifier { 130, 9, 97, - 53, - 192, + 55, + 128, 133, 1, 82, 80, 80, 97, - 54, - 0, + 55, + 192, 130, 1, 81, 97, - 53, - 224, + 55, + 160, 131, 1, 81, @@ -32902,74 +33826,74 @@ pub mod inclusion_verifier { 144, 9, 97, - 56, - 64, + 58, + 0, 131, 1, 82, 128, 97, - 54, - 64, + 56, + 0, 131, 1, 81, 97, - 54, - 32, + 55, + 224, 132, 1, 81, 9, 97, - 56, - 96, + 58, + 32, 131, 1, 82, 128, 97, - 54, - 128, + 56, + 64, 131, 1, 81, 97, - 54, - 96, + 56, + 32, 132, 1, 81, 9, 97, - 56, - 128, + 58, + 64, 131, 1, 82, 128, 97, - 54, - 192, + 56, + 128, 131, 1, 81, 97, - 54, - 160, + 56, + 96, 132, 1, 81, 9, 97, - 56, - 160, + 58, + 96, 131, 1, 82, 97, 10, - 64, + 128, 130, 1, 81, @@ -32978,8 +33902,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 56, - 192, + 58, + 128, 131, 1, 129, @@ -32987,7 +33911,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -32995,8 +33919,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 56, - 224, + 58, + 160, 131, 1, 129, @@ -33004,7 +33928,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33012,8 +33936,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 0, + 58, + 192, 131, 1, 129, @@ -33021,7 +33945,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33029,8 +33953,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 32, + 58, + 224, 131, 1, 129, @@ -33038,7 +33962,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33046,8 +33970,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 64, + 59, + 0, 131, 1, 129, @@ -33055,7 +33979,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33063,8 +33987,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 96, + 59, + 32, 131, 1, 129, @@ -33072,7 +33996,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33080,8 +34004,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 128, + 59, + 64, 131, 1, 129, @@ -33089,7 +34013,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33097,8 +34021,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 160, + 59, + 96, 131, 1, 129, @@ -33106,7 +34030,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33114,8 +34038,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 192, + 59, + 128, 131, 1, 129, @@ -33123,7 +34047,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33131,8 +34055,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 57, - 224, + 59, + 160, 131, 1, 129, @@ -33140,7 +34064,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33148,8 +34072,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 0, + 59, + 192, 131, 1, 129, @@ -33157,7 +34081,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33165,8 +34089,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 32, + 59, + 224, 131, 1, 129, @@ -33174,7 +34098,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33182,8 +34106,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 64, + 60, + 0, 131, 1, 129, @@ -33191,7 +34115,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33199,8 +34123,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 96, + 60, + 32, 131, 1, 129, @@ -33208,7 +34132,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33216,8 +34140,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 128, + 60, + 64, 131, 1, 129, @@ -33225,7 +34149,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33233,8 +34157,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 160, + 60, + 96, 131, 1, 129, @@ -33242,7 +34166,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33250,8 +34174,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 192, + 60, + 128, 131, 1, 129, @@ -33259,7 +34183,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33267,8 +34191,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 58, - 224, + 60, + 160, 131, 1, 129, @@ -33276,7 +34200,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33284,8 +34208,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 0, + 60, + 192, 131, 1, 129, @@ -33293,7 +34217,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33301,14 +34225,14 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 32, + 60, + 224, 131, 1, 82, 97, 10, - 160, + 224, 130, 1, 81, @@ -33317,8 +34241,8 @@ pub mod inclusion_verifier { 128, 9, 97, - 59, - 64, + 61, + 0, 131, 1, 129, @@ -33326,7 +34250,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -33334,8 +34258,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 96, + 61, + 32, 131, 1, 129, @@ -33343,7 +34267,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -33351,8 +34275,8 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 128, + 61, + 64, 131, 1, 129, @@ -33360,7 +34284,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 160, + 224, 131, 1, 81, @@ -33368,21 +34292,21 @@ pub mod inclusion_verifier { 145, 9, 97, - 59, - 160, + 61, + 96, 131, 1, 82, 128, 97, - 49, - 32, + 50, + 224, 131, 1, 81, 97, - 5, - 192, + 6, + 0, 132, 1, 81, @@ -33391,14 +34315,14 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 64, + 51, + 0, 134, 1, 81, 97, 6, - 0, + 64, 135, 1, 81, @@ -33410,30 +34334,30 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 96, + 51, + 32, 134, 1, 81, 97, 6, - 128, + 192, 135, 1, 81, 9, 8, 97, - 59, - 192, + 61, + 128, 132, 1, 129, 144, 82, 97, - 53, - 192, + 55, + 128, 132, 1, 81, @@ -33443,8 +34367,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 59, - 224, + 61, + 160, 131, 1, 82, @@ -33452,8 +34376,8 @@ pub mod inclusion_verifier { 96, 1, 97, - 59, - 224, + 61, + 160, 132, 1, 81, @@ -33461,21 +34385,21 @@ pub mod inclusion_verifier { 3, 9, 97, - 60, - 0, + 61, + 192, 131, 1, 82, 128, 97, - 49, - 32, + 50, + 224, 131, 1, 81, 97, - 5, - 224, + 6, + 32, 132, 1, 81, @@ -33484,14 +34408,14 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 64, + 51, + 0, 134, 1, 81, 97, 6, - 32, + 96, 135, 1, 81, @@ -33503,30 +34427,30 @@ pub mod inclusion_verifier { 129, 131, 97, - 49, - 96, + 51, + 32, 134, 1, 81, 97, 6, - 96, + 160, 135, 1, 81, 9, 8, 97, - 60, - 32, + 61, + 224, 132, 1, 129, 144, 82, 97, - 53, - 192, + 55, + 128, 132, 1, 81, @@ -33536,8 +34460,8 @@ pub mod inclusion_verifier { 144, 9, 97, - 60, - 64, + 62, + 0, 131, 1, 129, @@ -33545,7 +34469,7 @@ pub mod inclusion_verifier { 82, 97, 10, - 64, + 128, 131, 1, 81, @@ -33555,311 +34479,56 @@ pub mod inclusion_verifier { 3, 9, 97, - 60, - 96, + 62, + 32, 131, 1, 82, 128, 97, 10, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 60, - 128, - 131, - 1, - 82, - 128, - 97, - 60, - 96, - 131, - 1, - 81, - 97, - 60, - 0, - 132, - 1, - 81, - 8, - 97, - 60, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 60, - 160, - 132, - 1, - 81, - 9, - 97, - 60, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 60, - 128, - 132, - 1, - 81, - 9, - 97, - 60, - 224, - 131, - 1, - 82, - 128, - 97, - 53, - 224, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 61, - 0, - 131, - 1, - 82, 128, - 97, - 49, - 224, - 131, - 1, - 81, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 61, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 61, - 64, 131, 1, - 82, - 128, - 96, - 1, - 97, - 61, - 64, - 132, - 1, 81, - 131, - 3, - 9, - 97, - 61, - 96, - 131, - 1, - 82, - 128, 96, 1, - 97, - 61, - 0, - 132, - 1, - 81, - 9, - 97, - 61, - 128, - 131, - 1, - 82, - 128, - 97, - 49, - 224, - 131, - 1, - 81, - 97, - 10, - 0, - 132, - 1, - 81, - 9, - 97, - 61, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, 9, 97, - 61, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, + 62, 64, 131, 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 61, - 224, - 131, - 1, 82, 128, 97, - 10, - 64, - 131, - 1, - 81, - 97, - 61, - 0, - 132, - 1, - 81, - 9, - 97, 62, - 0, - 131, - 1, - 82, - 128, - 97, - 61, - 224, + 32, 131, 1, 81, 97, 61, - 96, + 192, 132, 1, 81, 8, 97, 62, - 32, + 96, 131, 1, 82, 128, - 97, - 49, - 224, - 131, - 1, - 81, - 97, - 6, - 160, - 132, - 1, - 81, - 9, - 97, - 62, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, + 96, 1, - 81, - 130, - 145, - 9, 97, 62, 96, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 192, - 131, + 132, 1, 81, - 130, - 145, - 130, - 3, 9, 97, 62, @@ -33868,15 +34537,11 @@ pub mod inclusion_verifier { 1, 82, 128, - 97, - 56, - 192, - 131, + 96, 1, - 81, 97, - 61, - 0, + 62, + 64, 132, 1, 81, @@ -33889,18 +34554,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 62, - 128, + 55, + 160, 131, 1, 81, - 97, - 62, - 32, - 132, + 96, 1, - 81, - 8, + 9, 97, 62, 192, @@ -33909,14 +34570,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 6, - 192, + 128, 132, 1, 81, @@ -33930,104 +34591,79 @@ pub mod inclusion_verifier { 144, 82, 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 63, + 58, 0, 131, 1, - 129, - 144, - 82, - 97, - 56, - 224, - 131, - 1, 81, 130, 145, - 130, - 3, 9, 97, 63, - 32, + 0, 131, 1, 82, 128, - 97, - 56, - 224, - 131, + 96, 1, - 81, 97, - 61, + 63, 0, 132, 1, 81, + 131, + 3, 9, 97, 63, - 64, + 32, 131, 1, 82, 128, - 97, - 63, - 32, - 131, + 96, 1, - 81, 97, 62, 192, 132, 1, 81, - 8, + 9, 97, 63, - 96, + 64, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 6, - 224, + 10, + 64, 132, 1, 81, 9, 97, 63, - 128, + 96, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34036,15 +34672,15 @@ pub mod inclusion_verifier { 9, 97, 63, - 160, + 128, 131, 1, 129, 144, 82, 97, - 57, - 0, + 10, + 128, 131, 1, 81, @@ -34055,75 +34691,75 @@ pub mod inclusion_verifier { 9, 97, 63, - 192, + 160, 131, 1, 82, 128, 97, - 57, - 0, + 10, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 63, - 224, + 192, 131, 1, 82, 128, 97, 63, - 192, + 160, 131, 1, 81, 97, 63, - 96, + 32, 132, 1, 81, 8, - 97, - 64, - 0, + 97, + 63, + 224, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 7, - 0, + 6, + 224, 132, 1, 81, 9, 97, 64, - 32, + 0, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34132,15 +34768,15 @@ pub mod inclusion_verifier { 9, 97, 64, - 64, + 32, 131, 1, 129, 144, 82, 97, - 57, - 32, + 58, + 128, 131, 1, 81, @@ -34151,75 +34787,75 @@ pub mod inclusion_verifier { 9, 97, 64, - 96, + 64, 131, 1, 82, 128, 97, - 57, - 32, + 58, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 64, - 128, + 96, 131, 1, 82, 128, 97, 64, - 96, + 64, 131, 1, 81, 97, - 64, - 0, + 63, + 224, 132, 1, 81, 8, 97, 64, - 160, + 128, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 32, + 0, 132, 1, 81, 9, 97, 64, - 192, + 160, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34228,15 +34864,15 @@ pub mod inclusion_verifier { 9, 97, 64, - 224, + 192, 131, 1, 129, 144, 82, 97, - 57, - 64, + 58, + 160, 131, 1, 81, @@ -34246,76 +34882,76 @@ pub mod inclusion_verifier { 3, 9, 97, - 65, - 0, + 64, + 224, 131, 1, 82, 128, 97, - 57, - 64, + 58, + 160, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 65, - 32, + 0, 131, 1, 82, 128, 97, - 65, - 0, + 64, + 224, 131, 1, 81, 97, 64, - 160, + 128, 132, 1, 81, 8, 97, 65, - 64, + 32, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 64, + 32, 132, 1, 81, 9, 97, 65, - 96, + 64, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34324,15 +34960,15 @@ pub mod inclusion_verifier { 9, 97, 65, - 128, + 96, 131, 1, 129, 144, 82, 97, - 57, - 96, + 58, + 192, 131, 1, 81, @@ -34343,75 +34979,75 @@ pub mod inclusion_verifier { 9, 97, 65, - 160, + 128, 131, 1, 82, 128, 97, - 57, - 96, + 58, + 192, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 65, - 192, + 160, 131, 1, 82, 128, 97, 65, - 160, + 128, 131, 1, 81, 97, 65, - 64, + 32, 132, 1, 81, 8, 97, 65, - 224, + 192, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 96, + 64, 132, 1, 81, 9, 97, - 66, - 0, + 65, + 224, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34420,15 +35056,15 @@ pub mod inclusion_verifier { 9, 97, 66, - 32, + 0, 131, 1, 129, 144, 82, 97, - 57, - 128, + 58, + 224, 131, 1, 81, @@ -34439,75 +35075,75 @@ pub mod inclusion_verifier { 9, 97, 66, - 64, + 32, 131, 1, 82, 128, 97, - 57, - 128, + 58, + 224, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 66, - 96, + 64, 131, 1, 82, 128, 97, 66, - 64, + 32, 131, 1, 81, 97, 65, - 224, + 192, 132, 1, 81, 8, 97, 66, - 128, + 96, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 128, + 96, 132, 1, 81, 9, 97, 66, - 160, + 128, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34516,15 +35152,15 @@ pub mod inclusion_verifier { 9, 97, 66, - 192, + 160, 131, 1, 129, 144, 82, 97, - 57, - 160, + 59, + 0, 131, 1, 81, @@ -34535,75 +35171,75 @@ pub mod inclusion_verifier { 9, 97, 66, - 224, + 192, 131, 1, 82, 128, 97, - 57, - 160, + 59, + 0, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 67, - 0, + 66, + 224, 131, 1, 82, 128, 97, 66, - 224, + 192, 131, 1, 81, 97, 66, - 128, + 96, 132, 1, 81, 8, 97, 67, - 32, + 0, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 160, + 128, 132, 1, 81, 9, 97, 67, - 64, + 32, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34612,15 +35248,15 @@ pub mod inclusion_verifier { 9, 97, 67, - 96, + 64, 131, 1, 129, 144, 82, 97, - 57, - 192, + 59, + 32, 131, 1, 81, @@ -34631,75 +35267,75 @@ pub mod inclusion_verifier { 9, 97, 67, - 128, + 96, 131, 1, 82, 128, 97, - 57, - 192, + 59, + 32, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 67, - 160, + 128, 131, 1, 82, 128, 97, 67, - 128, + 96, 131, 1, 81, 97, 67, - 32, + 0, 132, 1, 81, 8, 97, 67, - 192, + 160, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 192, + 160, 132, 1, 81, 9, 97, 67, - 224, + 192, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34707,16 +35343,16 @@ pub mod inclusion_verifier { 145, 9, 97, - 68, - 0, + 67, + 224, 131, 1, 129, 144, 82, 97, - 57, - 224, + 59, + 64, 131, 1, 81, @@ -34727,75 +35363,75 @@ pub mod inclusion_verifier { 9, 97, 68, - 32, + 0, 131, 1, 82, 128, 97, - 57, - 224, + 59, + 64, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 68, - 64, + 32, 131, 1, 82, 128, 97, 68, - 32, + 0, 131, 1, 81, 97, 67, - 192, + 160, 132, 1, 81, 8, 97, 68, - 96, + 64, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 7, - 224, + 192, 132, 1, 81, 9, 97, 68, - 128, + 96, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34804,15 +35440,15 @@ pub mod inclusion_verifier { 9, 97, 68, - 160, + 128, 131, 1, 129, 144, 82, 97, - 58, - 0, + 59, + 96, 131, 1, 81, @@ -34823,75 +35459,75 @@ pub mod inclusion_verifier { 9, 97, 68, - 192, + 160, 131, 1, 82, 128, 97, - 58, - 0, + 59, + 96, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 68, - 224, + 192, 131, 1, 82, 128, 97, 68, - 192, + 160, 131, 1, 81, 97, 68, - 96, + 64, 132, 1, 81, 8, 97, - 69, - 0, + 68, + 224, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 8, - 32, + 7, + 224, 132, 1, 81, 9, 97, 69, - 32, + 0, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34900,15 +35536,15 @@ pub mod inclusion_verifier { 9, 97, 69, - 64, + 32, 131, 1, 129, 144, 82, 97, - 58, - 32, + 59, + 128, 131, 1, 81, @@ -34919,75 +35555,75 @@ pub mod inclusion_verifier { 9, 97, 69, - 96, + 64, 131, 1, 82, 128, 97, - 58, - 32, + 59, + 128, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 69, - 128, + 96, 131, 1, 82, 128, 97, 69, - 96, + 64, 131, 1, 81, 97, - 69, - 0, + 68, + 224, 132, 1, 81, 8, 97, 69, - 160, + 128, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 64, + 0, 132, 1, 81, 9, 97, 69, - 192, + 160, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -34996,15 +35632,15 @@ pub mod inclusion_verifier { 9, 97, 69, - 224, + 192, 131, 1, 129, 144, 82, 97, - 58, - 64, + 59, + 160, 131, 1, 81, @@ -35014,76 +35650,76 @@ pub mod inclusion_verifier { 3, 9, 97, - 70, - 0, + 69, + 224, 131, 1, 82, 128, 97, - 58, - 64, + 59, + 160, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 70, - 32, + 0, 131, 1, 82, 128, 97, - 70, - 0, + 69, + 224, 131, 1, 81, 97, 69, - 160, + 128, 132, 1, 81, 8, 97, 70, - 64, + 32, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 96, + 32, 132, 1, 81, 9, 97, 70, - 96, + 64, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -35092,15 +35728,15 @@ pub mod inclusion_verifier { 9, 97, 70, - 128, + 96, 131, 1, 129, 144, 82, 97, - 58, - 96, + 59, + 192, 131, 1, 81, @@ -35111,75 +35747,75 @@ pub mod inclusion_verifier { 9, 97, 70, - 160, + 128, 131, 1, 82, 128, 97, - 58, - 96, + 59, + 192, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 70, - 192, + 160, 131, 1, 82, 128, 97, 70, - 160, + 128, 131, 1, 81, 97, 70, - 64, + 32, 132, 1, 81, 8, 97, 70, - 224, + 192, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 128, + 96, 132, 1, 81, 9, 97, - 71, - 0, + 70, + 224, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -35188,15 +35824,15 @@ pub mod inclusion_verifier { 9, 97, 71, - 32, + 0, 131, 1, 129, 144, 82, 97, - 58, - 128, + 59, + 224, 131, 1, 81, @@ -35207,75 +35843,75 @@ pub mod inclusion_verifier { 9, 97, 71, - 64, + 32, 131, 1, 82, 128, 97, - 58, - 128, + 59, + 224, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 71, - 96, + 64, 131, 1, 82, 128, 97, 71, - 64, + 32, 131, 1, 81, 97, 70, - 224, + 192, 132, 1, 81, 8, 97, 71, - 128, + 96, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 160, + 128, 132, 1, 81, 9, 97, 71, - 160, + 128, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -35284,15 +35920,15 @@ pub mod inclusion_verifier { 9, 97, 71, - 192, + 160, 131, 1, 129, 144, 82, 97, - 58, - 160, + 60, + 0, 131, 1, 81, @@ -35303,75 +35939,75 @@ pub mod inclusion_verifier { 9, 97, 71, - 224, + 192, 131, 1, 82, 128, 97, - 58, - 160, + 60, + 0, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, - 72, - 0, + 71, + 224, 131, 1, 82, 128, 97, 71, - 224, + 192, 131, 1, 81, 97, 71, - 128, + 96, 132, 1, 81, 8, 97, 72, - 32, + 0, 131, 1, 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, 8, - 192, + 160, 132, 1, 81, 9, 97, 72, - 64, + 32, 131, 1, 129, 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -35380,15 +36016,15 @@ pub mod inclusion_verifier { 9, 97, 72, - 96, + 64, 131, 1, 129, 144, 82, 97, - 58, - 192, + 60, + 32, 131, 1, 81, @@ -35399,83 +36035,99 @@ pub mod inclusion_verifier { 9, 97, 72, - 128, + 96, 131, 1, 82, 128, 97, - 58, - 192, + 60, + 32, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, 9, 97, 72, - 160, + 128, 131, 1, 82, 128, 97, 72, - 128, + 96, 131, 1, 81, 97, 72, - 32, + 0, 132, 1, 81, 8, 97, 72, - 192, + 160, 131, 1, 82, 128, 97, - 53, - 224, + 51, + 160, 131, 1, 81, 97, - 47, - 96, + 8, + 192, 132, 1, 81, 9, 97, 72, - 224, + 192, 131, 1, + 129, + 144, 82, - 128, 97, - 53, - 224, + 58, + 0, 131, 1, 81, + 130, + 145, + 9, 97, - 47, - 128, - 132, + 72, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 60, + 64, + 131, 1, 81, + 130, + 145, + 130, + 3, 9, 97, 73, @@ -35485,14 +36137,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 53, - 224, + 60, + 64, 131, 1, 81, 97, - 47, - 160, + 62, + 192, 132, 1, 81, @@ -35505,18 +36157,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 53, - 224, + 73, + 0, 131, 1, 81, 97, - 47, - 192, + 72, + 160, 132, 1, 81, - 9, + 8, 97, 73, 64, @@ -35525,13 +36177,13 @@ pub mod inclusion_verifier { 82, 128, 97, - 49, - 224, + 51, + 160, 131, 1, 81, 97, - 47, + 8, 224, 132, 1, @@ -35546,8 +36198,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 56, - 64, + 58, + 0, 131, 1, 81, @@ -35563,8 +36215,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 58, - 224, + 60, + 96, 131, 1, 81, @@ -35581,14 +36233,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 58, - 224, + 60, + 96, 131, 1, 81, 97, - 61, - 0, + 62, + 192, 132, 1, 81, @@ -35601,18 +36253,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 58, - 224, + 73, + 160, 131, 1, 81, 97, - 72, - 224, + 73, + 64, 132, 1, 81, - 9, + 8, 97, 73, 224, @@ -35621,13 +36273,13 @@ pub mod inclusion_verifier { 82, 128, 97, - 58, - 224, + 51, + 160, 131, 1, 81, 97, - 73, + 9, 0, 132, 1, @@ -35638,40 +36290,36 @@ pub mod inclusion_verifier { 0, 131, 1, + 129, + 144, 82, - 128, 97, 58, - 224, + 0, 131, 1, 81, - 97, - 73, - 32, - 132, - 1, - 81, + 130, + 145, 9, 97, 74, 32, 131, 1, + 129, + 144, 82, - 128, 97, - 58, - 224, + 60, + 128, 131, 1, 81, - 97, - 73, - 64, - 132, - 1, - 81, + 130, + 145, + 130, + 3, 9, 97, 74, @@ -35681,18 +36329,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 73, - 160, + 60, + 128, 131, 1, 81, 97, - 72, + 62, 192, 132, 1, 81, - 8, + 9, 97, 74, 96, @@ -35701,53 +36349,57 @@ pub mod inclusion_verifier { 82, 128, 97, - 49, - 224, + 74, + 64, 131, 1, 81, 97, - 8, - 0, + 73, + 224, 132, 1, 81, - 9, + 8, 97, 74, 128, 131, 1, - 129, - 144, 82, + 128, 97, - 56, - 64, + 55, + 160, 131, 1, 81, - 130, - 145, + 97, + 49, + 32, + 132, + 1, + 81, 9, 97, 74, 160, 131, 1, - 129, - 144, 82, + 128, 97, - 59, - 0, + 55, + 160, 131, 1, 81, - 130, - 145, - 130, - 3, + 97, + 49, + 64, + 132, + 1, + 81, 9, 97, 74, @@ -35757,14 +36409,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 0, + 55, + 160, 131, 1, 81, 97, - 61, - 0, + 49, + 96, 132, 1, 81, @@ -35777,74 +36429,73 @@ pub mod inclusion_verifier { 82, 128, 97, - 74, - 192, + 55, + 160, 131, 1, 81, 97, - 74, - 96, + 49, + 128, 132, 1, 81, - 8, + 9, 97, 75, 0, 131, 1, - 129, - 144, 82, + 128, 97, - 10, + 51, 160, 131, 1, 81, - 130, - 145, + 97, + 49, + 160, + 132, + 1, + 81, 9, 97, 75, 32, 131, 1, + 129, + 144, 82, - 128, 97, - 10, - 160, + 58, + 0, 131, 1, 81, - 97, - 61, - 128, - 132, - 1, - 81, + 130, + 145, 9, 97, 75, 64, 131, 1, + 129, + 144, 82, - 128, 97, - 10, + 60, 160, 131, 1, 81, - 97, - 62, - 0, - 132, - 1, - 81, + 130, + 145, + 130, + 3, 9, 97, 75, @@ -35854,14 +36505,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, 62, - 160, + 192, 132, 1, 81, @@ -35874,14 +36525,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 63, - 64, + 74, + 160, 132, 1, 81, @@ -35894,14 +36545,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 63, - 224, + 74, + 192, 132, 1, 81, @@ -35914,14 +36565,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 64, - 128, + 74, + 224, 132, 1, 81, @@ -35934,14 +36585,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 60, 160, 131, 1, 81, 97, - 65, - 32, + 75, + 0, 132, 1, 81, @@ -35954,18 +36605,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, - 160, + 75, + 96, 131, 1, 81, 97, - 65, - 192, + 74, + 128, 132, 1, 81, - 9, + 8, 97, 76, 32, @@ -35974,14 +36625,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, + 51, 160, 131, 1, 81, 97, - 66, - 96, + 8, + 64, 132, 1, 81, @@ -35991,40 +36642,36 @@ pub mod inclusion_verifier { 64, 131, 1, + 129, + 144, 82, - 128, - 97, - 10, - 160, - 131, - 1, - 81, 97, - 67, + 58, 0, - 132, + 131, 1, 81, + 130, + 145, 9, 97, 76, 96, 131, 1, + 129, + 144, 82, - 128, 97, - 10, - 160, + 60, + 192, 131, 1, 81, - 97, - 67, - 160, - 132, - 1, - 81, + 130, + 145, + 130, + 3, 9, 97, 76, @@ -36034,14 +36681,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, - 160, + 60, + 192, 131, 1, 81, 97, - 68, - 64, + 62, + 192, 132, 1, 81, @@ -36054,37 +36701,34 @@ pub mod inclusion_verifier { 82, 128, 97, - 10, - 160, + 76, + 128, 131, 1, 81, 97, - 68, - 224, + 76, + 32, 132, 1, 81, - 9, + 8, 97, 76, 192, 131, 1, + 129, + 144, 82, - 128, 97, 10, - 160, + 224, 131, 1, 81, - 97, - 69, - 128, - 132, - 1, - 81, + 130, + 145, 9, 97, 76, @@ -36095,13 +36739,13 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 70, - 32, + 63, + 64, 132, 1, 81, @@ -36115,12 +36759,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 70, + 63, 192, 132, 1, @@ -36135,12 +36779,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 71, + 64, 96, 132, 1, @@ -36155,12 +36799,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 72, + 65, 0, 132, 1, @@ -36175,12 +36819,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 72, + 65, 160, 132, 1, @@ -36195,13 +36839,13 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 73, - 192, + 66, + 64, 132, 1, 81, @@ -36215,12 +36859,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 73, + 66, 224, 132, 1, @@ -36235,13 +36879,13 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, - 0, + 67, + 128, 132, 1, 81, @@ -36255,12 +36899,12 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, + 68, 32, 132, 1, @@ -36275,13 +36919,13 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, - 64, + 68, + 192, 132, 1, 81, @@ -36295,13 +36939,13 @@ pub mod inclusion_verifier { 128, 97, 10, - 160, + 224, 131, 1, 81, 97, - 74, - 224, + 69, + 96, 132, 1, 81, @@ -36314,18 +36958,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 75, - 32, + 10, + 224, 131, 1, 81, 97, - 60, - 192, + 70, + 0, 132, 1, 81, - 8, + 9, 97, 78, 96, @@ -36334,13 +36978,17 @@ pub mod inclusion_verifier { 82, 128, 97, - 54, - 32, + 10, + 224, 131, 1, 81, - 96, + 97, + 70, + 160, + 132, 1, + 81, 9, 97, 78, @@ -36350,72 +36998,37 @@ pub mod inclusion_verifier { 82, 128, 97, - 50, - 0, - 131, - 1, - 81, - 97, - 8, + 10, 224, - 132, - 1, - 81, - 9, - 129, - 129, 131, - 97, - 50, - 32, - 134, - 1, - 81, - 97, - 9, - 0, - 135, 1, 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, 97, - 50, + 71, 64, - 134, - 1, - 81, - 97, - 9, - 32, - 135, + 132, 1, 81, 9, - 8, 97, 78, 160, - 132, + 131, 1, - 129, - 144, 82, + 128, 97, - 56, - 96, + 10, + 224, + 131, + 1, + 81, + 97, + 71, + 224, 132, 1, 81, - 131, - 146, - 80, - 144, 9, 97, 78, @@ -36424,16 +37037,18 @@ pub mod inclusion_verifier { 1, 82, 128, - 96, + 97, + 10, + 224, + 131, 1, + 81, 97, - 78, - 192, + 72, + 128, 132, 1, 81, - 131, - 3, 9, 97, 78, @@ -36442,11 +37057,15 @@ pub mod inclusion_verifier { 1, 82, 128, - 96, + 97, + 10, + 224, + 131, 1, + 81, 97, - 78, - 128, + 73, + 32, 132, 1, 81, @@ -36459,14 +37078,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 64, + 10, + 224, 131, 1, 81, 97, - 78, - 224, + 73, + 192, 132, 1, 81, @@ -36479,14 +37098,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 64, + 10, + 224, 131, 1, 81, 97, - 79, - 0, + 74, + 96, 132, 1, 81, @@ -36499,18 +37118,18 @@ pub mod inclusion_verifier { 82, 128, 97, - 79, - 32, + 10, + 224, 131, 1, 81, 97, - 78, - 96, + 75, + 128, 132, 1, 81, - 8, + 9, 97, 79, 96, @@ -36519,13 +37138,17 @@ pub mod inclusion_verifier { 82, 128, 97, - 54, - 96, + 10, + 224, 131, 1, 81, - 96, + 97, + 75, + 160, + 132, 1, + 81, 9, 97, 79, @@ -36535,104 +37158,130 @@ pub mod inclusion_verifier { 82, 128, 97, - 50, - 128, + 10, + 224, 131, 1, 81, 97, - 9, - 64, + 75, + 192, 132, 1, 81, 9, - 129, - 129, - 131, 97, - 50, + 79, 160, - 134, + 131, + 1, + 82, + 128, + 97, + 10, + 224, + 131, 1, 81, 97, - 9, - 96, - 135, + 75, + 224, + 132, 1, 81, 9, - 8, 97, 79, - 160, - 132, + 192, + 131, 1, - 129, - 144, 82, - 97, - 56, 128, + 97, + 10, + 224, + 131, + 1, + 81, + 97, + 76, + 0, 132, 1, 81, - 131, - 146, - 80, - 144, 9, 97, 79, - 192, + 224, 131, 1, 82, 128, - 96, + 97, + 10, + 224, + 131, 1, + 81, 97, - 79, - 192, + 76, + 160, 132, 1, 81, - 131, - 3, 9, 97, - 79, - 224, + 80, + 0, 131, 1, 82, 128, - 96, + 97, + 76, + 224, + 131, 1, + 81, 97, - 79, + 62, 128, 132, 1, 81, - 9, + 8, 97, 80, - 0, + 32, 131, 1, 82, 128, 97, - 50, + 55, + 224, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 80, + 64, + 131, + 1, + 82, 128, + 97, + 51, + 192, 131, 1, 81, 97, 9, - 128, + 32, 132, 1, 81, @@ -36641,76 +37290,56 @@ pub mod inclusion_verifier { 129, 131, 97, - 50, - 160, + 51, + 224, 134, 1, 81, 97, 9, - 160, + 64, 135, 1, 81, 9, 8, - 97, + 144, 80, - 32, - 132, - 1, 129, - 144, - 82, - 97, - 56, - 128, - 132, - 1, - 81, + 129, 131, - 146, - 80, - 144, - 9, 97, - 80, - 64, - 131, + 52, + 0, + 134, 1, - 129, - 144, - 82, + 81, 97, - 10, - 64, - 131, + 9, + 96, + 135, 1, 81, - 130, - 145, - 130, - 3, 9, + 8, 97, 80, 96, - 131, + 132, 1, + 129, + 144, 82, - 128, - 97, - 10, - 64, - 131, - 1, - 81, 97, - 79, - 128, + 58, + 32, 132, 1, 81, + 131, + 146, + 80, + 144, 9, 97, 80, @@ -36719,35 +37348,32 @@ pub mod inclusion_verifier { 1, 82, 128, - 97, - 80, 96, - 131, 1, - 81, 97, - 79, - 224, + 80, + 128, 132, 1, 81, - 8, + 131, + 3, + 9, 97, 80, 160, 131, 1, - 129, - 144, 82, - 97, - 59, + 128, 96, - 131, + 1, + 97, + 80, + 64, + 132, 1, 81, - 130, - 145, 9, 97, 80, @@ -36757,14 +37383,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 96, + 61, + 0, 131, 1, 81, 97, 80, - 0, + 160, 132, 1, 81, @@ -36777,14 +37403,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 96, + 61, + 0, 131, 1, 81, 97, 80, - 128, + 192, 132, 1, 81, @@ -36798,13 +37424,13 @@ pub mod inclusion_verifier { 128, 97, 80, - 192, + 224, 131, 1, 81, 97, - 79, - 96, + 80, + 32, 132, 1, 81, @@ -36817,8 +37443,8 @@ pub mod inclusion_verifier { 82, 128, 97, - 54, - 160, + 56, + 32, 131, 1, 81, @@ -36833,14 +37459,14 @@ pub mod inclusion_verifier { 82, 128, 97, - 50, - 192, + 52, + 64, 131, 1, 81, 97, 9, - 192, + 128, 132, 1, 81, @@ -36849,14 +37475,14 @@ pub mod inclusion_verifier { 129, 131, 97, - 50, - 224, + 52, + 96, 134, 1, 81, 97, 9, - 224, + 160, 135, 1, 81, @@ -36871,8 +37497,8 @@ pub mod inclusion_verifier { 144, 82, 97, - 56, - 160, + 58, + 64, 132, 1, 81, @@ -36923,58 +37549,73 @@ pub mod inclusion_verifier { 82, 128, 97, - 59, - 128, + 52, + 64, 131, 1, 81, 97, - 81, - 160, + 9, + 192, 132, 1, 81, 9, - 97, - 81, - 224, + 129, + 129, 131, + 97, + 52, + 96, + 134, 1, - 82, - 128, + 81, 97, - 59, - 128, - 131, + 9, + 224, + 135, 1, 81, + 9, + 8, 97, 81, - 192, + 224, + 132, + 1, + 129, + 144, + 82, + 97, + 58, + 64, 132, 1, 81, + 131, + 146, + 80, + 144, 9, 97, 82, 0, 131, 1, + 129, + 144, 82, - 128, 97, - 81, - 224, + 10, + 128, 131, 1, 81, - 97, - 81, - 32, - 132, - 1, - 81, - 8, + 130, + 145, + 130, + 3, + 9, 97, 82, 32, @@ -36983,13 +37624,17 @@ pub mod inclusion_verifier { 82, 128, 97, - 49, - 192, + 10, + 128, 131, 1, 81, - 96, + 97, + 81, + 64, + 132, 1, + 81, 9, 97, 82, @@ -36999,322 +37644,338 @@ pub mod inclusion_verifier { 82, 128, 97, - 11, - 64, + 82, + 32, 131, 1, 81, - 96, + 97, + 81, + 160, + 132, 1, - 9, + 81, + 8, 97, 82, 96, 131, 1, + 129, + 144, 82, - 96, + 97, + 61, + 32, + 131, 1, + 81, + 130, + 145, + 9, 97, 82, 128, 131, 1, - 129, - 129, 82, - 96, - 2, + 128, + 97, + 61, + 32, + 131, + 1, + 81, + 97, + 81, + 192, + 132, + 1, + 81, + 9, 97, 82, 160, - 133, + 131, 1, 82, + 128, 97, - 82, + 61, 32, + 131, + 1, + 81, + 97, + 82, + 64, 132, 1, 81, + 9, 97, 82, 192, - 133, + 131, 1, 82, - 132, - 145, - 144, - 96, - 64, - 144, - 96, - 96, - 129, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, + 128, 97, 82, 128, - 130, + 131, + 1, + 81, + 97, + 81, + 32, + 132, 1, 81, + 8, 97, 82, 224, 131, 1, 82, + 128, 97, - 82, - 160, - 130, + 56, + 96, + 131, 1, 81, + 96, + 1, + 9, 97, 83, 0, 131, 1, 82, - 96, - 96, - 130, + 128, + 97, + 52, + 128, + 131, + 1, + 81, + 97, + 10, + 0, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 52, + 160, + 134, + 1, + 81, + 97, + 10, + 32, + 135, 1, 81, + 9, + 8, 97, 83, 32, - 131, + 132, 1, + 129, + 144, 82, + 97, + 58, 96, - 128, - 130, + 132, 1, 81, + 131, + 146, + 80, + 144, + 9, 97, 83, 64, 131, 1, 82, - 130, - 96, - 1, + 128, 96, - 64, - 97, - 82, - 224, - 133, 1, - 96, - 128, 97, - 82, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 96, - 160, - 130, + 83, + 64, + 132, 1, 81, + 131, + 3, + 9, 97, 83, 96, 131, 1, 82, + 128, 96, - 192, - 130, + 1, + 97, + 83, + 0, + 132, 1, 81, + 9, 97, 83, 128, 131, 1, 82, + 128, 97, - 60, - 224, - 130, + 61, + 64, + 131, 1, 81, 97, 83, - 160, - 131, - 1, - 82, - 130, 96, + 132, 1, - 96, - 64, + 81, + 9, 97, 83, - 96, - 133, + 160, + 131, 1, - 96, - 96, + 82, + 128, 97, - 83, - 96, - 135, + 61, + 64, + 131, 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, + 81, 97, - 82, - 224, - 130, + 83, + 128, + 132, 1, 81, + 9, 97, 83, 192, 131, 1, 82, + 128, 97, 83, - 0, - 130, + 160, + 131, + 1, + 81, + 97, + 82, + 224, + 132, 1, 81, + 8, 97, 83, 224, 131, 1, 82, + 128, 97, - 83, - 96, - 130, + 51, + 128, + 131, 1, 81, + 96, + 1, + 9, 97, 84, 0, 131, 1, 82, + 128, 97, - 83, + 11, 128, - 130, + 131, 1, 81, + 96, + 1, + 9, 97, 84, 32, 131, 1, 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 192, - 133, - 1, - 96, - 128, - 97, - 83, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, 96, - 224, - 130, 1, - 81, 97, 84, 64, 131, 1, + 129, + 129, 82, - 97, - 1, - 0, - 130, - 1, - 81, + 96, + 2, 97, 84, 96, - 131, + 133, 1, 82, 97, - 75, - 64, - 130, + 83, + 224, + 132, 1, 81, 97, 84, 128, - 131, + 133, 1, 82, - 130, - 96, - 1, + 132, + 145, + 144, 96, 64, - 97, - 84, - 64, - 133, - 1, + 144, 96, 96, - 97, - 84, - 64, - 135, - 1, + 129, 96, 7, 90, @@ -37324,8 +37985,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 83, - 192, + 84, + 64, 130, 1, 81, @@ -37336,8 +37997,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 83, - 224, + 84, + 96, 130, 1, 81, @@ -37347,9 +38008,8 @@ pub mod inclusion_verifier { 131, 1, 82, - 97, - 84, - 64, + 96, + 160, 130, 1, 81, @@ -37359,9 +38019,8 @@ pub mod inclusion_verifier { 131, 1, 82, - 97, - 84, 96, + 192, 130, 1, 81, @@ -37396,9 +38055,8 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 1, - 192, + 96, + 224, 130, 1, 81, @@ -37410,7 +38068,7 @@ pub mod inclusion_verifier { 82, 97, 1, - 224, + 0, 130, 1, 81, @@ -37421,8 +38079,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 96, + 62, + 160, 130, 1, 81, @@ -37530,78 +38188,24 @@ pub mod inclusion_verifier { 22, 146, 80, - 127, - 41, - 30, - 77, - 180, - 60, - 38, - 7, - 38, - 185, - 28, - 83, - 89, - 23, - 168, + 97, 1, - 189, - 224, - 107, - 231, - 247, - 207, - 69, + 32, + 130, 1, - 9, - 9, - 118, - 35, - 19, - 219, - 66, - 82, - 144, + 81, 97, 86, 0, 131, 1, 82, - 127, - 21, - 78, - 127, - 225, - 88, - 71, - 172, - 77, - 28, - 217, - 63, - 166, - 200, - 32, - 150, - 114, - 207, - 204, - 244, - 90, - 216, - 225, - 58, - 184, - 47, - 198, - 177, - 103, - 186, - 25, - 148, - 252, + 97, + 1, + 64, + 130, + 1, + 81, 97, 86, 32, @@ -37609,8 +38213,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 128, + 77, + 0, 130, 1, 81, @@ -37718,77 +38322,23 @@ pub mod inclusion_verifier { 22, 146, 80, - 127, - 23, - 107, - 16, - 212, + 97, 2, - 250, - 192, - 91, - 252, - 152, - 34, - 52, - 245, - 11, - 48, - 90, - 208, - 103, - 225, - 34, - 241, - 104, - 42, - 75, - 156, - 75, - 217, - 139, - 218, - 145, - 145, - 157, + 0, + 130, + 1, + 81, 97, 86, 224, 131, 1, 82, - 127, - 29, - 98, - 231, - 141, - 101, - 94, - 63, - 199, - 65, - 136, - 102, - 103, - 56, - 252, - 166, - 82, - 74, - 113, - 47, - 26, - 60, - 76, - 207, - 221, - 15, - 164, - 79, - 62, - 44, - 132, - 156, + 97, + 2, + 32, + 130, + 1, 81, 97, 87, @@ -37797,8 +38347,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 160, + 77, + 32, 130, 1, 81, @@ -37907,38 +38457,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 1, - 157, - 215, - 238, + 41, + 155, + 18, + 230, 83, + 153, + 220, + 234, + 63, + 30, + 12, + 224, + 70, + 207, + 95, + 147, + 206, + 123, + 169, + 247, + 121, + 191, + 163, + 158, + 127, + 12, + 109, + 76, 25, + 98, + 138, 144, - 211, - 53, - 170, - 216, - 246, - 76, - 38, - 161, - 188, - 7, - 43, - 71, - 167, - 239, - 212, - 80, - 68, - 4, - 210, - 233, - 94, - 32, - 37, - 7, - 89, 97, 87, 192, @@ -37946,38 +38496,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 12, - 65, + 33, + 197, + 119, + 18, + 42, 61, - 216, - 229, + 31, + 77, 1, - 137, - 160, - 90, - 55, - 70, - 121, - 186, + 155, + 147, 231, - 47, - 114, - 79, - 123, - 113, - 233, - 86, - 195, - 44, - 8, + 36, + 217, 129, - 234, - 55, - 105, - 66, - 118, - 234, - 131, + 176, + 101, + 62, + 217, + 79, + 73, + 46, + 175, + 236, + 80, + 148, + 82, + 49, + 147, + 95, + 154, + 149, 97, 87, 224, @@ -37985,8 +38535,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 192, + 77, + 64, 130, 1, 81, @@ -38095,38 +38645,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 48, + 25, + 217, + 34, + 1, + 65, + 190, + 242, + 89, + 33, + 212, + 116, + 198, + 230, + 52, + 208, + 109, + 251, + 125, 121, - 157, - 91, - 254, - 193, - 206, - 252, - 90, - 175, - 252, - 255, - 227, - 243, - 221, - 73, - 27, - 43, - 252, - 175, - 159, - 85, - 63, - 148, - 222, - 97, - 69, - 237, - 71, - 66, - 175, + 4, + 229, + 154, + 78, + 196, + 134, + 161, + 72, + 176, + 11, + 253, + 56, + 163, 97, 88, 160, @@ -38134,38 +38684,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, - 173, - 74, - 240, - 130, - 233, - 107, - 20, - 185, - 166, - 218, - 128, - 244, - 250, - 19, - 52, - 242, + 47, + 56, + 81, + 30, 83, - 196, - 88, - 173, - 213, - 49, + 104, + 128, + 86, + 182, + 147, 200, - 217, - 248, - 178, + 78, + 246, + 154, + 122, + 226, + 185, + 171, + 72, + 41, + 6, + 220, + 70, + 174, + 157, + 149, + 34, + 253, 60, - 94, - 203, - 156, - 67, + 224, + 152, + 182, 97, 88, 192, @@ -38173,8 +38723,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 75, - 224, + 77, + 96, 130, 1, 81, @@ -38283,38 +38833,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 34, - 225, - 205, - 191, - 255, - 207, - 207, - 79, - 24, - 207, - 67, - 66, - 237, - 241, - 251, - 38, - 195, - 182, - 229, - 42, + 23, + 231, + 203, + 106, + 48, + 196, 206, + 154, 61, - 95, - 173, - 207, - 92, - 194, - 97, - 67, - 51, - 186, - 164, + 141, + 230, + 4, + 219, + 175, + 81, + 123, + 31, + 35, + 228, + 64, + 172, + 185, + 231, + 52, + 89, + 56, + 255, + 91, + 36, + 90, + 64, + 62, 97, 89, 128, @@ -38322,38 +38872,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 40, - 223, - 114, - 220, - 198, - 156, - 198, - 68, + 28, + 49, + 164, 45, - 114, + 125, + 163, + 96, + 204, + 232, + 38, + 46, + 33, + 251, + 154, + 94, + 242, + 106, + 35, + 235, + 188, 246, - 147, - 102, - 25, - 151, - 72, - 10, - 145, - 58, - 195, - 83, - 137, - 14, - 253, - 99, - 168, - 115, - 149, - 151, - 39, - 192, + 153, + 92, + 202, + 184, + 154, + 238, + 64, + 12, + 46, + 153, + 75, 97, 89, 160, @@ -38361,8 +38911,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 0, + 77, + 128, 130, 1, 81, @@ -38471,38 +39021,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 11, - 48, - 254, + 5, + 89, + 28, + 127, + 170, + 44, + 158, + 175, + 28, 149, - 129, - 166, - 199, - 0, - 100, - 227, - 179, - 84, - 70, - 178, - 67, - 56, - 66, - 219, - 118, - 232, - 250, - 213, - 71, - 251, - 177, - 238, - 105, - 145, - 100, 115, - 247, + 168, + 75, + 221, + 236, + 48, + 50, + 25, + 171, + 244, + 150, + 175, + 8, + 153, 237, + 67, + 136, + 83, + 34, + 125, + 208, + 86, 97, 90, 96, @@ -38510,38 +39060,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 110, - 15, - 135, - 214, - 25, - 227, + 44, + 250, + 36, + 253, + 229, + 118, + 117, + 11, + 64, + 54, + 223, 254, - 218, - 200, - 163, - 215, + 64, + 16, + 94, + 107, + 114, 68, - 46, - 243, - 79, - 182, - 86, - 108, - 233, - 175, - 90, - 49, - 87, - 88, - 192, - 194, - 184, - 0, - 12, - 54, - 207, + 246, + 56, + 67, + 236, + 116, + 217, + 208, + 170, + 212, + 139, + 164, + 19, + 40, + 124, 97, 90, 128, @@ -38549,8 +39099,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 32, + 77, + 160, 130, 1, 81, @@ -38659,38 +39209,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 20, - 230, - 106, - 119, - 30, - 240, - 140, - 202, - 5, - 81, - 194, - 107, - 52, - 57, - 212, - 157, - 57, - 27, - 162, - 29, - 145, - 183, - 6, - 223, - 44, - 75, - 31, - 23, - 125, - 119, - 89, + 34, + 225, + 205, + 191, + 255, + 207, + 207, + 79, + 24, + 207, + 67, + 66, + 237, + 241, + 251, + 38, + 195, + 182, 229, + 42, + 206, + 61, + 95, + 173, + 207, + 92, + 194, + 97, + 67, + 51, + 186, + 164, 97, 91, 64, @@ -38698,38 +39248,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 5, - 50, + 14, + 40, + 223, 114, - 58, - 38, 220, - 146, - 143, - 67, - 3, - 62, - 250, - 239, - 142, - 74, - 162, + 198, + 156, + 198, + 68, + 45, + 114, + 246, + 147, + 102, + 25, + 151, + 72, + 10, + 145, + 58, + 195, + 83, + 137, + 14, + 253, + 99, + 168, 115, + 149, + 151, 39, - 114, - 186, - 65, - 75, - 29, - 173, - 206, - 31, - 231, - 208, - 179, - 13, - 153, - 210, + 192, 97, 91, 96, @@ -38737,8 +39287,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 64, + 77, + 192, 130, 1, 81, @@ -38847,77 +39397,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 116, - 174, - 28, - 66, - 48, - 189, - 205, - 210, - 92, - 228, - 96, - 239, - 115, - 198, - 137, - 228, - 34, - 126, - 223, - 14, - 199, - 194, - 190, - 133, - 239, - 141, - 117, - 89, - 46, - 27, - 54, - 97, - 92, + 25, 32, - 131, - 1, - 82, - 127, - 47, - 216, - 62, - 110, - 7, + 107, + 235, + 197, 204, - 53, - 117, - 90, - 4, - 51, - 127, - 215, - 10, - 248, - 170, - 49, - 252, - 116, - 222, - 7, - 165, + 74, + 91, + 105, + 44, + 88, + 188, + 97, + 231, + 174, + 198, + 211, + 251, + 184, + 52, + 78, 57, - 184, + 161, + 51, + 105, + 159, + 116, + 230, + 244, + 14, + 194, 168, - 117, - 108, - 170, - 96, - 208, - 72, - 144, + 97, + 92, + 32, + 131, + 1, + 82, + 127, + 6, + 120, + 199, + 189, + 209, + 65, + 189, + 38, + 203, + 233, + 51, + 111, + 93, + 207, + 28, + 90, + 140, + 242, + 26, + 89, + 39, + 175, + 209, + 178, + 243, + 147, + 21, + 46, + 224, + 42, + 106, + 120, 97, 92, 64, @@ -38925,8 +39475,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 96, + 77, + 224, 130, 1, 81, @@ -39036,37 +39586,37 @@ pub mod inclusion_verifier { 80, 127, 28, - 111, - 147, - 174, - 247, - 149, - 245, - 37, + 110, + 35, + 67, + 51, + 55, + 131, + 180, + 244, + 138, + 231, + 210, + 104, + 26, + 251, + 60, + 223, + 106, + 77, + 251, 200, - 181, - 27, - 203, - 2, - 52, - 187, - 52, - 89, - 66, - 204, - 49, - 120, - 43, - 247, + 58, 80, - 150, - 255, - 242, - 112, - 127, - 62, - 75, - 159, + 12, + 176, + 109, + 179, + 38, + 90, + 211, + 229, + 213, 97, 93, 0, @@ -39074,38 +39624,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 27, - 248, - 75, - 118, - 24, - 113, - 163, - 49, - 27, - 9, + 26, + 61, + 131, 109, - 135, - 5, - 52, - 176, + 67, + 37, + 255, + 48, + 20, + 76, + 30, + 32, + 56, 164, - 176, - 149, - 51, - 12, 212, + 2, 95, - 190, - 123, - 187, - 245, - 179, - 83, - 169, - 128, - 195, - 157, + 208, + 240, + 26, + 242, + 76, + 253, + 141, + 253, + 84, + 1, + 142, + 100, + 243, + 176, + 152, 97, 93, 32, @@ -39113,8 +39663,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 128, + 78, + 0, 130, 1, 81, @@ -39223,38 +39773,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 96, - 155, - 167, - 145, - 240, - 237, - 93, - 86, - 144, - 145, - 4, - 28, - 128, - 9, - 116, - 184, - 68, - 11, + 32, + 59, + 33, + 166, + 72, + 251, + 251, + 150, + 69, + 150, + 64, + 187, 197, - 192, - 249, - 125, + 180, + 24, + 82, + 221, + 30, + 252, + 18, + 9, + 200, 155, - 98, - 149, - 161, 99, - 33, - 117, - 17, - 108, + 91, + 166, + 56, + 220, + 185, + 41, + 218, + 107, 97, 93, 224, @@ -39262,38 +39812,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 219, 4, - 18, - 243, - 142, - 26, - 25, - 83, + 231, + 0, + 47, + 6, + 242, + 9, 26, - 251, - 209, - 201, - 96, + 68, + 175, + 205, 49, + 30, + 147, + 194, + 47, 70, - 231, - 189, - 28, - 52, - 169, - 61, - 246, - 190, - 76, + 221, + 159, + 50, + 7, + 181, + 188, + 195, + 79, + 12, + 167, 101, - 177, - 38, - 227, - 83, - 123, - 104, + 32, + 152, + 240, + 151, 97, 94, 0, @@ -39301,8 +39851,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 160, + 78, + 32, 130, 1, 81, @@ -39411,38 +39961,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 14, - 149, - 91, - 137, - 236, - 165, - 252, - 52, - 210, - 23, 32, - 34, - 248, - 157, - 196, - 103, - 172, + 171, + 116, + 144, + 180, + 47, + 63, + 123, + 43, + 11, + 190, + 96, + 26, + 9, + 215, 46, - 132, - 201, + 233, + 63, 146, - 158, - 28, - 224, - 194, - 168, - 206, - 131, - 28, - 93, - 215, + 72, 1, + 213, + 151, + 244, + 140, + 242, + 212, + 67, + 117, + 29, + 95, + 145, 97, 94, 192, @@ -39450,38 +40000,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 207, - 146, - 154, - 220, - 230, - 20, - 176, - 136, - 200, + 43, + 202, + 47, + 23, + 98, + 148, + 106, + 5, + 251, + 22, + 50, + 85, + 12, + 108, + 177, 44, - 179, - 147, - 79, - 30, - 183, - 84, - 109, - 210, - 228, - 131, - 150, - 233, - 20, - 180, - 255, - 6, - 236, - 69, - 222, - 158, - 138, + 2, + 209, + 141, + 155, + 238, + 91, + 221, + 66, + 18, + 202, + 115, + 66, + 136, + 135, + 32, + 253, 97, 94, 224, @@ -39489,8 +40039,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 192, + 78, + 64, 130, 1, 81, @@ -39599,38 +40149,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, + 9, + 227, + 48, + 50, 69, - 49, - 164, - 117, - 40, - 230, - 66, - 248, - 246, - 149, - 74, - 63, - 63, - 249, - 246, - 7, - 46, - 56, - 211, - 14, - 46, - 13, - 16, - 141, - 28, - 172, - 32, - 29, - 75, - 104, - 77, + 227, + 176, + 10, + 202, + 137, + 78, + 159, + 186, + 61, + 81, + 132, + 255, + 55, + 57, + 198, + 100, + 227, + 99, + 242, + 5, + 212, + 47, + 238, + 227, + 39, + 182, + 170, 97, 95, 160, @@ -39638,38 +40188,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 21, - 76, - 64, - 155, + 19, + 206, + 146, + 40, + 60, + 198, + 246, + 72, 189, - 23, - 96, - 236, - 85, - 99, - 157, - 50, - 213, - 129, - 124, - 147, - 153, - 229, - 115, - 178, + 218, + 134, + 24, + 45, + 145, + 133, 42, - 143, - 221, - 165, - 247, - 7, - 201, - 185, - 222, - 29, - 76, - 166, + 171, + 92, + 96, + 136, + 171, + 0, + 141, + 156, + 219, + 85, + 34, + 252, + 191, + 92, + 98, + 137, 97, 95, 192, @@ -39677,8 +40227,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 76, - 224, + 78, + 96, 130, 1, 81, @@ -39787,38 +40337,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 36, - 2, + 8, + 165, + 3, + 231, + 161, + 102, + 132, + 168, + 25, + 145, 219, + 252, + 94, + 200, + 76, + 159, 75, - 28, - 119, - 70, - 220, - 217, - 254, - 126, - 171, - 130, - 171, - 63, - 167, - 235, - 177, - 189, - 53, - 42, - 154, - 249, - 78, - 246, - 129, - 27, - 42, - 249, - 171, - 111, - 142, + 15, + 122, + 80, + 109, + 223, + 38, + 182, + 125, + 48, + 94, + 191, + 192, + 248, + 23, + 67, 97, 96, 128, @@ -39826,38 +40376,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 42, - 0, - 71, - 236, 8, 162, - 84, - 117, - 60, - 70, - 102, - 72, - 240, - 220, - 110, - 7, - 126, - 136, - 229, - 73, - 88, - 41, - 195, - 168, - 69, - 135, - 59, - 144, - 88, - 191, - 68, - 7, + 216, + 225, + 118, + 15, + 251, + 22, + 247, + 1, + 71, + 248, + 180, + 78, + 120, + 28, + 237, + 101, + 161, + 230, + 119, + 167, + 134, + 205, + 216, + 188, + 159, + 148, + 123, + 54, + 19, + 28, 97, 96, 160, @@ -39865,8 +40415,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 0, + 78, + 128, 130, 1, 81, @@ -39975,38 +40525,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 118, - 199, - 241, - 84, - 247, - 3, - 103, - 42, + 37, + 99, + 43, + 200, + 1, + 44, + 108, + 188, + 109, 221, - 116, - 255, - 235, - 198, - 255, 166, - 21, - 155, - 78, - 82, - 127, - 10, - 67, + 97, + 169, + 114, + 159, 84, - 182, + 76, + 84, + 98, + 7, + 0, + 195, + 132, + 12, 1, - 250, - 205, + 202, + 91, 87, - 255, - 26, + 230, 26, + 31, + 254, 97, 97, 96, @@ -40014,38 +40564,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 39, - 193, - 2, - 144, - 247, - 48, - 237, - 173, - 155, - 203, - 37, - 56, - 5, - 111, - 117, - 94, - 254, - 169, - 36, - 176, - 166, - 157, - 134, - 213, - 201, - 200, - 51, - 113, - 126, - 115, - 14, + 43, + 165, + 118, + 76, + 102, + 58, + 75, 40, + 146, + 52, + 60, + 48, + 61, + 160, + 245, + 102, + 78, + 63, + 98, + 13, + 214, + 184, + 81, + 167, + 17, + 120, + 23, + 4, + 41, + 47, + 209, + 26, 97, 97, 128, @@ -40053,8 +40603,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 32, + 78, + 160, 130, 1, 81, @@ -40164,37 +40714,37 @@ pub mod inclusion_verifier { 80, 127, 7, - 67, - 234, - 64, - 241, - 64, - 132, - 219, - 38, - 115, - 33, - 114, - 131, - 170, - 5, - 63, - 152, - 104, + 207, + 228, + 243, + 21, + 43, + 25, 150, - 238, - 124, - 24, - 31, - 82, - 17, + 232, + 234, + 253, + 113, 132, - 66, - 233, - 156, - 69, - 41, - 116, + 81, + 53, + 108, + 32, + 68, + 228, + 194, + 57, + 252, + 194, + 158, + 179, + 168, + 29, + 57, + 46, + 27, + 68, + 173, 97, 98, 64, @@ -40202,38 +40752,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 2, - 3, - 227, - 73, - 58, 37, + 86, + 115, + 226, + 36, + 165, 148, - 236, 229, - 125, - 34, - 204, - 117, - 221, - 8, + 63, + 213, + 177, + 180, + 220, + 212, + 99, + 41, + 231, + 42, + 4, + 225, + 96, + 86, + 222, + 163, + 213, + 161, + 126, + 49, + 41, 26, - 198, - 130, - 113, - 236, - 124, - 117, - 129, - 83, - 207, - 210, - 21, - 43, - 251, - 92, - 25, - 227, + 153, + 96, 97, 98, 96, @@ -40241,8 +40791,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 64, + 78, + 192, 130, 1, 81, @@ -40351,76 +40901,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 30, - 135, - 235, - 136, - 87, - 119, - 149, - 201, - 242, - 140, - 66, + 19, + 108, + 177, + 75, + 53, + 31, 59, - 77, - 44, - 62, - 193, - 232, + 67, + 181, + 230, + 24, + 197, + 196, 144, - 22, - 68, - 102, - 234, - 151, + 34, + 88, + 142, + 221, + 72, + 85, + 15, + 78, + 125, + 105, + 48, + 148, 66, - 217, - 153, - 106, - 229, - 195, + 232, 184, - 10, - 42, + 61, + 13, + 34, 97, 99, 32, 131, 1, 82, - 126, - 176, - 4, - 129, - 75, - 36, - 199, - 199, - 169, - 220, - 86, - 255, - 160, - 61, - 79, - 43, - 126, - 15, - 86, - 5, - 243, + 127, + 14, + 233, 187, - 24, - 222, - 221, - 249, - 230, - 57, - 120, - 171, + 223, + 206, + 147, + 129, + 94, + 121, + 170, + 191, + 197, + 236, + 146, + 165, + 35, + 70, + 196, + 106, + 69, + 225, + 123, + 197, 188, - 86, + 154, + 216, + 21, + 94, + 152, + 44, + 156, + 172, 97, 99, 64, @@ -40428,8 +40979,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 96, + 78, + 224, 130, 1, 81, @@ -40538,38 +41089,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 3, - 167, - 99, - 193, - 198, - 183, - 134, - 103, - 249, - 6, - 182, - 254, - 43, - 74, - 209, - 151, - 181, - 85, - 135, - 201, - 14, - 20, - 232, - 80, - 36, - 70, - 218, - 140, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, + 5, + 63, + 152, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, + 66, + 233, + 156, 69, - 239, - 125, + 41, + 116, 97, 100, 0, @@ -40577,38 +41128,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 19, - 234, - 87, - 152, - 111, - 146, - 149, - 233, - 45, - 239, - 51, + 2, 3, - 174, - 245, - 63, - 43, - 79, - 98, - 91, - 169, - 133, - 83, - 18, - 1, - 171, + 227, + 73, + 58, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, + 113, + 236, + 124, + 117, + 129, 83, - 220, - 115, - 7, - 244, - 107, - 105, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 100, 32, @@ -40616,8 +41167,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 128, + 79, + 0, 130, 1, 81, @@ -40725,24 +41276,78 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 4, - 32, - 130, - 1, - 81, + 127, + 31, + 93, + 105, + 248, + 173, + 199, + 222, + 243, + 83, + 202, + 197, + 48, + 19, + 49, + 246, + 106, + 106, + 161, + 44, + 59, + 220, + 70, + 186, + 133, + 9, + 216, + 28, + 25, + 34, + 148, + 76, + 30, 97, 100, 224, 131, 1, 82, - 97, - 4, - 64, - 130, + 127, + 5, + 10, + 53, + 140, + 142, + 231, + 73, 1, - 81, + 175, + 214, + 190, + 189, + 218, + 53, + 162, + 91, + 233, + 155, + 166, + 49, + 35, + 42, + 190, + 192, + 187, + 125, + 242, + 52, + 40, + 226, + 25, + 235, 97, 101, 0, @@ -40750,8 +41355,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 160, + 79, + 32, 130, 1, 81, @@ -40859,24 +41464,78 @@ pub mod inclusion_verifier { 22, 146, 80, - 97, - 4, - 96, - 130, - 1, - 81, + 127, + 29, + 219, + 249, + 28, + 238, + 237, + 136, + 168, + 198, + 110, + 155, + 248, + 208, + 137, + 179, + 9, + 141, + 192, + 131, + 241, + 87, + 144, + 135, + 7, + 150, + 167, + 38, + 127, + 37, + 207, + 155, + 240, 97, 101, 192, 131, 1, 82, - 97, - 4, - 128, - 130, - 1, - 81, + 127, + 10, + 180, + 232, + 11, + 0, + 145, + 205, + 64, + 7, + 2, + 148, + 247, + 84, + 229, + 75, + 18, + 126, + 32, + 0, + 87, + 44, + 3, + 68, + 194, + 131, + 138, + 238, + 175, + 37, + 30, + 179, + 145, 97, 101, 224, @@ -40884,8 +41543,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 192, + 79, + 64, 130, 1, 81, @@ -40995,7 +41654,7 @@ pub mod inclusion_verifier { 80, 97, 4, - 160, + 96, 130, 1, 81, @@ -41007,7 +41666,7 @@ pub mod inclusion_verifier { 82, 97, 4, - 192, + 128, 130, 1, 81, @@ -41018,8 +41677,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 77, - 224, + 79, + 96, 130, 1, 81, @@ -41129,7 +41788,7 @@ pub mod inclusion_verifier { 80, 97, 4, - 224, + 160, 130, 1, 81, @@ -41140,8 +41799,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 5, - 0, + 4, + 192, 130, 1, 81, @@ -41152,8 +41811,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 0, + 79, + 128, 130, 1, 81, @@ -41262,8 +41921,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 5, - 32, + 4, + 224, 130, 1, 81, @@ -41275,7 +41934,7 @@ pub mod inclusion_verifier { 82, 97, 5, - 64, + 0, 130, 1, 81, @@ -41286,8 +41945,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 32, + 79, + 160, 130, 1, 81, @@ -41396,8 +42055,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 3, - 128, + 5, + 32, 130, 1, 81, @@ -41408,8 +42067,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 3, - 160, + 5, + 64, 130, 1, 81, @@ -41420,8 +42079,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 78, - 64, + 79, + 192, 130, 1, 81, @@ -41530,8 +42189,8 @@ pub mod inclusion_verifier { 146, 80, 97, - 2, - 192, + 5, + 96, 130, 1, 81, @@ -41542,8 +42201,8 @@ pub mod inclusion_verifier { 1, 82, 97, - 2, - 224, + 5, + 128, 130, 1, 81, @@ -41555,7 +42214,7 @@ pub mod inclusion_verifier { 82, 97, 79, - 64, + 224, 130, 1, 81, @@ -41665,7 +42324,7 @@ pub mod inclusion_verifier { 80, 97, 3, - 0, + 192, 130, 1, 81, @@ -41677,7 +42336,7 @@ pub mod inclusion_verifier { 82, 97, 3, - 32, + 224, 130, 1, 81, @@ -41689,7 +42348,7 @@ pub mod inclusion_verifier { 82, 97, 80, - 224, + 0, 130, 1, 81, @@ -41785,8 +42444,276 @@ pub mod inclusion_verifier { 96, 128, 97, - 107, - 96, + 107, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 0, + 130, + 1, + 81, + 97, + 107, + 224, + 131, + 1, + 82, + 97, + 3, + 32, + 130, + 1, + 81, + 97, + 108, + 0, + 131, + 1, + 82, + 97, + 81, + 0, + 130, + 1, + 81, + 97, + 108, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 224, + 133, + 1, + 96, + 96, + 97, + 107, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 107, + 96, + 130, + 1, + 81, + 97, + 108, + 64, + 131, + 1, + 82, + 97, + 107, + 128, + 130, + 1, + 81, + 97, + 108, + 96, + 131, + 1, + 82, + 97, + 107, + 224, + 130, + 1, + 81, + 97, + 108, + 128, + 131, + 1, + 82, + 97, + 108, + 0, + 130, + 1, + 81, + 97, + 108, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 64, + 133, + 1, + 96, + 128, + 97, + 108, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 64, + 130, + 1, + 81, + 97, + 108, + 192, + 131, + 1, + 82, + 97, + 3, + 96, + 130, + 1, + 81, + 97, + 108, + 224, + 131, + 1, + 82, + 97, + 82, + 160, + 130, + 1, + 81, + 97, + 109, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 192, + 133, + 1, + 96, + 96, + 97, + 108, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 108, + 64, + 130, + 1, + 81, + 97, + 109, + 32, + 131, + 1, + 82, + 97, + 108, + 96, + 130, + 1, + 81, + 97, + 109, + 64, + 131, + 1, + 82, + 97, + 108, + 192, + 130, + 1, + 81, + 97, + 109, + 96, + 131, + 1, + 82, + 97, + 108, + 224, + 130, + 1, + 81, + 97, + 109, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 109, + 32, + 133, + 1, + 96, + 128, + 97, + 109, + 32, 135, 1, 96, @@ -41799,37 +42726,37 @@ pub mod inclusion_verifier { 80, 97, 3, - 64, + 128, 130, 1, 81, 97, - 107, - 224, + 109, + 160, 131, 1, 82, 97, 3, - 96, + 160, 130, 1, 81, 97, - 108, - 0, + 109, + 192, 131, 1, 82, 97, - 81, - 0, + 82, + 192, 130, 1, 81, 97, - 108, - 32, + 109, + 224, 131, 1, 82, @@ -41839,15 +42766,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 107, - 224, + 109, + 160, 133, 1, 96, 96, 97, - 107, - 224, + 109, + 160, 135, 1, 96, @@ -41859,50 +42786,50 @@ pub mod inclusion_verifier { 146, 80, 97, - 107, - 96, + 109, + 32, 130, 1, 81, 97, - 108, - 64, + 110, + 0, 131, 1, 82, 97, - 107, - 128, + 109, + 64, 130, 1, 81, 97, - 108, - 96, + 110, + 32, 131, 1, 82, 97, - 107, - 224, + 109, + 160, 130, 1, 81, 97, - 108, - 128, + 110, + 64, 131, 1, 82, 97, - 108, - 0, + 109, + 192, 130, 1, 81, 97, - 108, - 160, + 110, + 96, 131, 1, 82, @@ -41912,15 +42839,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 108, - 64, + 110, + 0, 133, 1, 96, 128, 97, - 108, - 64, + 110, + 0, 135, 1, 96, @@ -41933,37 +42860,37 @@ pub mod inclusion_verifier { 80, 97, 1, - 128, + 192, 130, 1, 81, 97, - 108, - 192, + 110, + 128, 131, 1, 82, 97, 1, - 160, + 224, 130, 1, 81, 97, - 108, - 224, + 110, + 160, 131, 1, 82, 97, - 82, - 0, + 83, + 192, 130, 1, 81, 97, - 109, - 0, + 110, + 192, 131, 1, 82, @@ -41973,15 +42900,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 108, - 192, + 110, + 128, 133, 1, 96, 96, 97, - 108, - 192, + 110, + 128, 135, 1, 96, @@ -41993,50 +42920,50 @@ pub mod inclusion_verifier { 146, 80, 97, - 108, - 64, + 110, + 0, 130, 1, 81, 97, - 109, - 32, + 110, + 224, 131, 1, 82, 97, - 108, - 96, + 110, + 32, 130, 1, 81, 97, - 109, - 64, + 111, + 0, 131, 1, 82, 97, - 108, - 192, + 110, + 128, 130, 1, 81, 97, - 109, - 96, + 111, + 32, 131, 1, 82, 97, - 108, - 224, + 110, + 160, 130, 1, 81, 97, - 109, - 128, + 111, + 64, 131, 1, 82, @@ -42046,15 +42973,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 109, - 32, + 110, + 224, 133, 1, 96, 128, 97, - 109, - 32, + 110, + 224, 135, 1, 96, @@ -42066,40 +42993,40 @@ pub mod inclusion_verifier { 146, 80, 97, - 10, - 224, + 11, + 32, 130, 1, 81, 97, - 109, - 160, + 111, + 96, 131, 1, 82, 97, 11, - 0, + 64, 130, 1, 81, 97, - 109, - 192, + 111, + 128, 131, 1, 82, 97, - 82, - 64, + 84, + 0, 130, 1, 81, 129, 3, 97, - 109, - 224, + 111, + 160, 131, 1, 82, @@ -42110,15 +43037,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 109, - 160, + 111, + 96, 132, 1, 96, 96, 97, - 109, - 160, + 111, + 96, 134, 1, 96, @@ -42130,50 +43057,50 @@ pub mod inclusion_verifier { 145, 80, 97, - 109, - 32, + 110, + 224, 129, 1, 81, 97, - 110, - 0, + 111, + 192, 130, 1, 82, 97, - 109, - 64, + 111, + 0, 129, 1, 81, 97, - 110, - 32, + 111, + 224, 130, 1, 82, 97, - 109, - 160, + 111, + 96, 129, 1, 81, 97, - 110, - 64, + 112, + 0, 130, 1, 82, 97, - 109, - 192, + 111, + 128, 129, 1, 81, 97, - 110, - 96, + 112, + 32, 130, 1, 82, @@ -42183,15 +43110,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 0, + 111, + 192, 132, 1, 96, 128, 97, - 110, - 0, + 111, + 192, 134, 1, 96, @@ -42204,37 +43131,37 @@ pub mod inclusion_verifier { 80, 97, 11, - 128, + 192, 129, 1, 81, 97, - 110, - 128, + 112, + 64, 130, 1, 82, 97, 11, - 160, + 224, 129, 1, 81, 97, - 110, - 160, + 112, + 96, 130, 1, 82, 97, - 82, - 96, + 84, + 32, 129, 1, 81, 97, - 110, - 192, + 112, + 128, 130, 1, 82, @@ -42244,15 +43171,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 128, + 112, + 64, 132, 1, 96, 96, 97, - 110, - 128, + 112, + 64, 134, 1, 96, @@ -42264,50 +43191,50 @@ pub mod inclusion_verifier { 145, 80, 97, - 110, - 0, + 111, + 192, 129, 1, 81, 97, - 110, - 224, + 112, + 160, 130, 1, 82, 97, - 110, - 32, + 111, + 224, 129, 1, 81, 97, - 111, - 0, + 112, + 192, 130, 1, 82, 97, - 110, - 128, + 112, + 64, 129, 1, 81, 97, - 111, - 32, + 112, + 224, 130, 1, 82, 97, - 110, - 160, + 112, + 96, 129, 1, 81, 97, - 111, - 64, + 113, + 0, 130, 1, 82, @@ -42317,15 +43244,15 @@ pub mod inclusion_verifier { 96, 64, 97, - 110, - 224, + 112, + 160, 132, 1, 96, 128, 97, - 110, - 224, + 112, + 160, 134, 1, 96, @@ -42337,26 +43264,26 @@ pub mod inclusion_verifier { 145, 80, 97, - 110, - 224, + 112, + 160, 129, 1, 81, 97, - 111, - 96, + 113, + 32, 130, 1, 82, 97, - 111, - 0, + 112, + 192, 129, 1, 81, 97, - 111, - 128, + 113, + 64, 130, 1, 82, @@ -42394,8 +43321,8 @@ pub mod inclusion_verifier { 18, 194, 97, - 111, - 160, + 113, + 96, 130, 1, 82, @@ -42433,8 +43360,8 @@ pub mod inclusion_verifier { 246, 237, 97, - 111, - 192, + 113, + 128, 130, 1, 82, @@ -42472,8 +43399,8 @@ pub mod inclusion_verifier { 151, 91, 97, - 111, - 224, + 113, + 160, 130, 1, 82, @@ -42511,32 +43438,32 @@ pub mod inclusion_verifier { 125, 170, 97, - 112, - 0, + 113, + 192, 130, 1, 82, 97, 11, - 128, + 192, 129, 1, 81, 97, - 112, - 32, + 113, + 224, 130, 1, 82, 97, 11, - 160, + 224, 129, 1, 81, 97, - 112, - 64, + 114, + 0, 130, 1, 82, @@ -42574,8 +43501,8 @@ pub mod inclusion_verifier { 226, 61, 97, - 112, - 96, + 114, + 32, 130, 1, 82, @@ -42613,8 +43540,8 @@ pub mod inclusion_verifier { 247, 158, 97, - 112, - 128, + 114, + 64, 130, 1, 82, @@ -42652,8 +43579,8 @@ pub mod inclusion_verifier { 193, 69, 97, - 112, - 160, + 114, + 96, 130, 1, 82, @@ -42691,8 +43618,8 @@ pub mod inclusion_verifier { 222, 255, 97, - 112, - 192, + 114, + 128, 130, 1, 82, @@ -42702,16 +43629,16 @@ pub mod inclusion_verifier { 96, 32, 97, - 111, - 96, + 113, + 32, 132, 1, 97, 1, 128, 97, - 111, - 96, + 113, + 32, 134, 1, 96, @@ -42719,8 +43646,8 @@ pub mod inclusion_verifier { 90, 250, 97, - 111, - 96, + 113, + 32, 147, 144, 147, @@ -42747,8 +43674,8 @@ pub mod inclusion_verifier { 81, 128, 97, - 112, - 192, + 114, + 128, 1, 96, 64, @@ -42756,7 +43683,7 @@ pub mod inclusion_verifier { 128, 97, 3, - 134, + 148, 144, 96, 32, @@ -42826,15 +43753,15 @@ pub mod inclusion_verifier { 23, 21, 97, - 82, - 177, + 84, + 128, 87, 97, - 82, - 177, + 84, + 128, 97, - 82, - 114, + 84, + 65, 86, 91, 96, @@ -42854,8 +43781,8 @@ pub mod inclusion_verifier { 1, 18, 97, - 82, - 202, + 84, + 153, 87, 96, 0, @@ -42877,20 +43804,20 @@ pub mod inclusion_verifier { 17, 21, 97, - 82, - 228, + 84, + 179, 87, 97, - 82, - 228, + 84, + 179, 97, - 82, - 114, + 84, + 65, 86, 91, 97, - 82, - 247, + 84, + 198, 96, 31, 130, @@ -42903,8 +43830,8 @@ pub mod inclusion_verifier { 32, 1, 97, - 82, - 136, + 84, + 87, 86, 91, 129, @@ -42920,8 +43847,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 12, + 84, + 219, 87, 96, 0, @@ -42968,8 +43895,8 @@ pub mod inclusion_verifier { 18, 21, 97, - 83, - 60, + 85, + 11, 87, 96, 0, @@ -42992,8 +43919,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 84, + 85, + 35, 87, 96, 0, @@ -43012,8 +43939,8 @@ pub mod inclusion_verifier { 1, 18, 97, - 83, - 104, + 85, + 55, 87, 96, 0, @@ -43029,15 +43956,15 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 124, + 85, + 75, 87, 97, - 83, - 124, + 85, + 75, 97, - 82, - 114, + 84, + 65, 86, 91, 129, @@ -43045,14 +43972,14 @@ pub mod inclusion_verifier { 5, 27, 97, - 83, - 139, + 85, + 90, 130, 130, 1, 97, - 82, - 136, + 84, + 87, 86, 91, 146, @@ -43073,8 +44000,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 165, + 85, + 116, 87, 96, 0, @@ -43091,8 +44018,8 @@ pub mod inclusion_verifier { 16, 21, 97, - 83, - 195, + 85, + 146, 87, 134, 53, @@ -43107,8 +44034,8 @@ pub mod inclusion_verifier { 1, 144, 97, - 83, - 170, + 85, + 121, 86, 91, 151, @@ -43126,8 +44053,8 @@ pub mod inclusion_verifier { 17, 21, 97, - 83, - 218, + 85, + 169, 87, 96, 0, @@ -43136,15 +44063,15 @@ pub mod inclusion_verifier { 91, 80, 97, - 83, - 231, + 85, + 182, 133, 130, 134, 1, 97, - 82, - 185, + 84, + 136, 86, 91, 145, @@ -43231,38 +44158,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 143, - 15, - 8, - 193, - 19, - 215, - 30, - 154, - 255, + 67, + 61, + 67, + 155, + 97, + 108, + 155, + 9, + 132, + 170, + 39, + 61, + 101, 208, - 74, - 147, + 59, + 188, + 145, 10, - 12, - 207, - 255, - 244, - 28, - 199, - 158, - 53, - 137, - 50, - 207, - 167, - 172, - 19, - 149, - 194, - 66, - 68, - 5, + 87, + 92, + 63, + 198, + 42, + 156, + 80, + 151, + 87, + 123, + 27, + 175, + 252, + 213, 100, 115, 111, diff --git a/backend/src/contracts/generated/mod.rs b/backend/src/contracts/generated/mod.rs index a944f3aa..467f80f0 100644 --- a/backend/src/contracts/generated/mod.rs +++ b/backend/src/contracts/generated/mod.rs @@ -1,3 +1,2 @@ pub mod summa_contract; -pub mod solvency_verifier; pub mod inclusion_verifier; \ No newline at end of file diff --git a/backend/src/contracts/generated/solvency_verifier.rs b/backend/src/contracts/generated/solvency_verifier.rs deleted file mode 100644 index c4614e1f..00000000 --- a/backend/src/contracts/generated/solvency_verifier.rs +++ /dev/null @@ -1,41185 +0,0 @@ -pub use solvency_verifier::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod solvency_verifier { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"pubInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; - ///The parsed JSON ABI of the contract. - pub static SOLVENCYVERIFIER_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(|| { - ::ethers::core::utils::__serde_json::from_str(__ABI) - .expect("ABI is always valid") - }); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 80, - 18, - 128, - 97, - 0, - 32, - 96, - 0, - 57, - 96, - 0, - 243, - 254, - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 189, - 32, - 90, - 144, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 78, - 212, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 96, - 1, - 97, - 0, - 99, - 97, - 77, - 253, - 86, - 91, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 0, - 217, - 86, - 91, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 128, - 131, - 16, - 129, - 131, - 16, - 22, - 144, - 131, - 128, - 9, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 131, - 132, - 9, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 132, - 130, - 9, - 144, - 80, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 96, - 3, - 130, - 8, - 145, - 144, - 145, - 20, - 145, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 128, - 96, - 32, - 135, - 1, - 81, - 6, - 96, - 32, - 131, - 1, - 82, - 128, - 96, - 64, - 135, - 1, - 81, - 6, - 96, - 64, - 131, - 1, - 82, - 128, - 96, - 96, - 135, - 1, - 81, - 6, - 96, - 96, - 131, - 1, - 82, - 126, - 174, - 153, - 177, - 55, - 145, - 111, - 244, - 34, - 11, - 13, - 167, - 23, - 154, - 70, - 1, - 48, - 28, - 130, - 52, - 111, - 198, - 101, - 205, - 51, - 105, - 165, - 78, - 31, - 2, - 212, - 234, - 96, - 0, - 131, - 1, - 82, - 96, - 32, - 133, - 1, - 81, - 128, - 96, - 128, - 132, - 1, - 82, - 96, - 64, - 134, - 1, - 81, - 128, - 96, - 160, - 133, - 1, - 82, - 132, - 97, - 1, - 67, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 96, - 133, - 1, - 81, - 128, - 96, - 192, - 132, - 1, - 82, - 96, - 128, - 134, - 1, - 81, - 128, - 96, - 224, - 133, - 1, - 82, - 132, - 97, - 1, - 105, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 160, - 133, - 1, - 81, - 128, - 97, - 1, - 0, - 132, - 1, - 82, - 96, - 192, - 134, - 1, - 81, - 128, - 97, - 1, - 32, - 133, - 1, - 82, - 132, - 97, - 1, - 145, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 64, - 96, - 0, - 131, - 1, - 32, - 97, - 1, - 64, - 131, - 1, - 82, - 97, - 1, - 64, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 1, - 96, - 132, - 1, - 82, - 128, - 97, - 1, - 128, - 132, - 1, - 82, - 80, - 96, - 224, - 133, - 1, - 81, - 128, - 97, - 1, - 160, - 132, - 1, - 82, - 97, - 1, - 0, - 134, - 1, - 81, - 128, - 97, - 1, - 192, - 133, - 1, - 82, - 132, - 97, - 1, - 223, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 32, - 133, - 1, - 81, - 128, - 97, - 1, - 224, - 132, - 1, - 82, - 97, - 1, - 64, - 134, - 1, - 81, - 128, - 97, - 2, - 0, - 133, - 1, - 82, - 132, - 97, - 2, - 9, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 96, - 160, - 97, - 1, - 128, - 135, - 1, - 32, - 97, - 2, - 32, - 135, - 1, - 129, - 144, - 82, - 133, - 129, - 6, - 97, - 2, - 64, - 136, - 1, - 82, - 97, - 2, - 96, - 135, - 1, - 82, - 22, - 148, - 80, - 96, - 1, - 145, - 80, - 80, - 97, - 2, - 128, - 131, - 1, - 83, - 96, - 33, - 97, - 2, - 96, - 131, - 1, - 32, - 97, - 2, - 128, - 131, - 1, - 129, - 144, - 82, - 129, - 129, - 6, - 97, - 2, - 160, - 132, - 1, - 82, - 97, - 2, - 192, - 131, - 1, - 82, - 97, - 1, - 96, - 133, - 1, - 81, - 97, - 2, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 1, - 128, - 134, - 1, - 81, - 97, - 3, - 0, - 132, - 1, - 129, - 144, - 82, - 132, - 97, - 2, - 124, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 160, - 133, - 1, - 81, - 128, - 97, - 3, - 32, - 132, - 1, - 82, - 97, - 1, - 192, - 134, - 1, - 81, - 128, - 97, - 3, - 64, - 133, - 1, - 82, - 132, - 97, - 2, - 166, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 224, - 133, - 1, - 81, - 128, - 97, - 3, - 96, - 132, - 1, - 82, - 97, - 2, - 0, - 134, - 1, - 81, - 128, - 97, - 3, - 128, - 133, - 1, - 82, - 132, - 97, - 2, - 208, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 32, - 133, - 1, - 81, - 128, - 97, - 3, - 160, - 132, - 1, - 82, - 97, - 2, - 64, - 134, - 1, - 81, - 128, - 97, - 3, - 192, - 133, - 1, - 82, - 132, - 97, - 2, - 250, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 32, - 97, - 2, - 192, - 131, - 1, - 32, - 97, - 3, - 224, - 131, - 1, - 82, - 97, - 3, - 224, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 4, - 0, - 132, - 1, - 82, - 128, - 97, - 4, - 32, - 132, - 1, - 82, - 80, - 97, - 2, - 96, - 133, - 1, - 81, - 128, - 97, - 4, - 64, - 132, - 1, - 82, - 97, - 2, - 128, - 134, - 1, - 81, - 128, - 97, - 4, - 96, - 133, - 1, - 82, - 132, - 97, - 3, - 74, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 160, - 133, - 1, - 81, - 128, - 97, - 4, - 128, - 132, - 1, - 82, - 97, - 2, - 192, - 134, - 1, - 81, - 128, - 97, - 4, - 160, - 133, - 1, - 82, - 132, - 97, - 3, - 116, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 224, - 133, - 1, - 81, - 128, - 97, - 4, - 192, - 132, - 1, - 82, - 97, - 3, - 0, - 134, - 1, - 81, - 128, - 97, - 4, - 224, - 133, - 1, - 82, - 132, - 97, - 3, - 158, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 3, - 32, - 133, - 1, - 81, - 128, - 97, - 5, - 0, - 132, - 1, - 82, - 97, - 3, - 64, - 134, - 1, - 81, - 128, - 97, - 5, - 32, - 133, - 1, - 82, - 132, - 97, - 3, - 200, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 3, - 96, - 133, - 1, - 81, - 128, - 97, - 5, - 64, - 132, - 1, - 82, - 97, - 3, - 128, - 134, - 1, - 81, - 128, - 97, - 5, - 96, - 133, - 1, - 82, - 132, - 97, - 3, - 242, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 96, - 97, - 4, - 32, - 131, - 1, - 32, - 97, - 5, - 128, - 131, - 1, - 82, - 97, - 5, - 128, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 5, - 160, - 132, - 1, - 82, - 128, - 97, - 5, - 192, - 132, - 1, - 82, - 80, - 128, - 97, - 3, - 160, - 134, - 1, - 81, - 6, - 97, - 5, - 224, - 131, - 1, - 82, - 128, - 97, - 3, - 192, - 134, - 1, - 81, - 6, - 97, - 6, - 0, - 131, - 1, - 82, - 128, - 97, - 3, - 224, - 134, - 1, - 81, - 6, - 97, - 6, - 32, - 131, - 1, - 82, - 128, - 97, - 4, - 0, - 134, - 1, - 81, - 6, - 97, - 6, - 64, - 131, - 1, - 82, - 128, - 97, - 4, - 32, - 134, - 1, - 81, - 6, - 97, - 6, - 96, - 131, - 1, - 82, - 128, - 97, - 4, - 64, - 134, - 1, - 81, - 6, - 97, - 6, - 128, - 131, - 1, - 82, - 128, - 97, - 4, - 96, - 134, - 1, - 81, - 6, - 97, - 6, - 160, - 131, - 1, - 82, - 128, - 97, - 4, - 128, - 134, - 1, - 81, - 6, - 97, - 6, - 192, - 131, - 1, - 82, - 128, - 97, - 4, - 160, - 134, - 1, - 81, - 6, - 97, - 6, - 224, - 131, - 1, - 82, - 128, - 97, - 4, - 192, - 134, - 1, - 81, - 6, - 97, - 7, - 0, - 131, - 1, - 82, - 128, - 97, - 4, - 224, - 134, - 1, - 81, - 6, - 97, - 7, - 32, - 131, - 1, - 82, - 128, - 97, - 5, - 0, - 134, - 1, - 81, - 6, - 97, - 7, - 64, - 131, - 1, - 82, - 128, - 97, - 5, - 32, - 134, - 1, - 81, - 6, - 97, - 7, - 96, - 131, - 1, - 82, - 128, - 97, - 5, - 64, - 134, - 1, - 81, - 6, - 97, - 7, - 128, - 131, - 1, - 82, - 128, - 97, - 5, - 96, - 134, - 1, - 81, - 6, - 97, - 7, - 160, - 131, - 1, - 82, - 128, - 97, - 5, - 128, - 134, - 1, - 81, - 6, - 97, - 7, - 192, - 131, - 1, - 82, - 128, - 97, - 5, - 160, - 134, - 1, - 81, - 6, - 97, - 7, - 224, - 131, - 1, - 82, - 128, - 97, - 5, - 192, - 134, - 1, - 81, - 6, - 97, - 8, - 0, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 134, - 1, - 81, - 6, - 97, - 8, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 134, - 1, - 81, - 6, - 97, - 8, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 134, - 1, - 81, - 6, - 97, - 8, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 134, - 1, - 81, - 6, - 97, - 8, - 128, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 134, - 1, - 81, - 6, - 97, - 8, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 128, - 134, - 1, - 81, - 6, - 97, - 8, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 160, - 134, - 1, - 81, - 6, - 97, - 8, - 224, - 131, - 1, - 82, - 128, - 97, - 6, - 192, - 134, - 1, - 81, - 6, - 97, - 9, - 0, - 131, - 1, - 82, - 128, - 97, - 6, - 224, - 134, - 1, - 81, - 6, - 97, - 9, - 32, - 131, - 1, - 82, - 128, - 97, - 7, - 0, - 134, - 1, - 81, - 6, - 97, - 9, - 64, - 131, - 1, - 82, - 128, - 97, - 7, - 32, - 134, - 1, - 81, - 6, - 97, - 9, - 96, - 131, - 1, - 82, - 128, - 97, - 7, - 64, - 134, - 1, - 81, - 6, - 97, - 9, - 128, - 131, - 1, - 82, - 128, - 97, - 7, - 96, - 134, - 1, - 81, - 6, - 97, - 9, - 160, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 134, - 1, - 81, - 6, - 97, - 9, - 192, - 131, - 1, - 82, - 128, - 97, - 7, - 160, - 134, - 1, - 81, - 6, - 97, - 9, - 224, - 131, - 1, - 82, - 97, - 4, - 64, - 97, - 5, - 192, - 131, - 1, - 32, - 97, - 10, - 0, - 131, - 1, - 82, - 97, - 10, - 0, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 10, - 32, - 132, - 1, - 82, - 128, - 97, - 10, - 64, - 132, - 1, - 82, - 80, - 96, - 1, - 97, - 10, - 96, - 131, - 1, - 83, - 96, - 33, - 97, - 10, - 64, - 131, - 1, - 32, - 97, - 10, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 129, - 6, - 97, - 10, - 128, - 132, - 1, - 82, - 97, - 10, - 160, - 131, - 1, - 82, - 97, - 7, - 192, - 133, - 1, - 81, - 97, - 10, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 224, - 134, - 1, - 81, - 97, - 10, - 224, - 132, - 1, - 129, - 144, - 82, - 132, - 97, - 6, - 95, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 96, - 97, - 10, - 160, - 131, - 1, - 32, - 97, - 11, - 0, - 131, - 1, - 82, - 97, - 11, - 0, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 11, - 32, - 132, - 1, - 82, - 128, - 97, - 11, - 64, - 132, - 1, - 82, - 80, - 97, - 8, - 0, - 133, - 1, - 81, - 128, - 97, - 11, - 96, - 132, - 1, - 82, - 97, - 8, - 32, - 134, - 1, - 81, - 128, - 97, - 11, - 128, - 133, - 1, - 82, - 132, - 97, - 6, - 174, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 128, - 97, - 5, - 160, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 11, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 11, - 192, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 11, - 224, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 0, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 32, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 128, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 192, - 131, - 1, - 82, - 128, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 12, - 192, - 132, - 1, - 81, - 8, - 97, - 12, - 224, - 131, - 1, - 82, - 128, - 127, - 48, - 88, - 53, - 95, - 68, - 121, - 83, - 193, - 173, - 226, - 49, - 165, - 19, - 224, - 248, - 7, - 16, - 233, - 219, - 78, - 103, - 155, - 2, - 53, - 31, - 144, - 253, - 22, - 139, - 4, - 0, - 1, - 97, - 12, - 224, - 132, - 1, - 81, - 9, - 97, - 13, - 0, - 131, - 1, - 82, - 128, - 127, - 21, - 247, - 157, - 185, - 195, - 145, - 129, - 188, - 62, - 49, - 200, - 63, - 146, - 145, - 218, - 118, - 238, - 223, - 27, - 35, - 196, - 16, - 173, - 215, - 233, - 9, - 132, - 100, - 170, - 164, - 251, - 38, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 32, - 131, - 1, - 82, - 128, - 127, - 26, - 108, - 176, - 185, - 29, - 160, - 30, - 109, - 122, - 30, - 125, - 118, - 238, - 239, - 125, - 230, - 57, - 84, - 205, - 36, - 181, - 168, - 194, - 185, - 90, - 216, - 113, - 47, - 69, - 91, - 4, - 219, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 64, - 131, - 1, - 82, - 128, - 127, - 3, - 183, - 67, - 215, - 79, - 217, - 221, - 180, - 31, - 146, - 1, - 121, - 172, - 48, - 224, - 75, - 14, - 189, - 147, - 229, - 128, - 185, - 192, - 181, - 0, - 97, - 8, - 121, - 4, - 17, - 11, - 212, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 96, - 131, - 1, - 82, - 128, - 127, - 44, - 173, - 10, - 155, - 145, - 87, - 194, - 117, - 152, - 190, - 68, - 60, - 213, - 80, - 120, - 18, - 25, - 118, - 84, - 98, - 248, - 255, - 175, - 220, - 67, - 128, - 237, - 26, - 235, - 238, - 244, - 45, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 128, - 131, - 1, - 82, - 128, - 127, - 31, - 77, - 113, - 128, - 223, - 80, - 20, - 132, - 152, - 37, - 243, - 201, - 176, - 232, - 157, - 121, - 67, - 44, - 81, - 244, - 142, - 181, - 132, - 106, - 230, - 59, - 67, - 63, - 40, - 171, - 161, - 11, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 160, - 131, - 1, - 82, - 128, - 127, - 17, - 22, - 220, - 242, - 1, - 225, - 139, - 165, - 32, - 42, - 81, - 236, - 208, - 152, - 186, - 227, - 229, - 7, - 150, - 83, - 235, - 3, - 236, - 38, - 93, - 166, - 178, - 84, - 199, - 84, - 94, - 246, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 192, - 131, - 1, - 82, - 128, - 127, - 34, - 181, - 86, - 3, - 88, - 109, - 95, - 196, - 44, - 108, - 20, - 194, - 252, - 39, - 160, - 40, - 194, - 7, - 218, - 139, - 44, - 113, - 203, - 51, - 213, - 73, - 250, - 74, - 43, - 229, - 211, - 2, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 224, - 131, - 1, - 82, - 128, - 127, - 13, - 174, - 248, - 111, - 136, - 196, - 64, - 101, - 139, - 228, - 48, - 243, - 133, - 89, - 184, - 52, - 102, - 44, - 13, - 189, - 77, - 71, - 165, - 93, - 110, - 151, - 251, - 73, - 196, - 26, - 44, - 255, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 0, - 131, - 1, - 82, - 128, - 127, - 9, - 107, - 159, - 139, - 133, - 152, - 183, - 195, - 135, - 251, - 105, - 171, - 242, - 54, - 176, - 213, - 224, - 78, - 36, - 210, - 117, - 238, - 152, - 36, - 68, - 67, - 237, - 165, - 211, - 188, - 64, - 53, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 32, - 131, - 1, - 82, - 128, - 127, - 38, - 248, - 174, - 231, - 91, - 152, - 232, - 102, - 48, - 84, - 220, - 10, - 143, - 74, - 167, - 135, - 71, - 229, - 195, - 118, - 3, - 202, - 216, - 108, - 255, - 158, - 7, - 238, - 28, - 67, - 191, - 204, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 64, - 131, - 1, - 82, - 128, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 227, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 96, - 131, - 1, - 82, - 128, - 127, - 37, - 128, - 133, - 19, - 32, - 245, - 149, - 202, - 138, - 103, - 156, - 194, - 21, - 125, - 139, - 125, - 72, - 70, - 188, - 142, - 237, - 27, - 37, - 176, - 146, - 214, - 223, - 166, - 75, - 28, - 78, - 30, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 128, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 160, - 131, - 1, - 82, - 128, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 192, - 131, - 1, - 82, - 128, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 125, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 224, - 131, - 1, - 82, - 128, - 127, - 5, - 139, - 76, - 84, - 16, - 181, - 93, - 126, - 158, - 88, - 201, - 89, - 142, - 181, - 133, - 126, - 118, - 253, - 254, - 21, - 106, - 158, - 91, - 29, - 134, - 217, - 28, - 0, - 230, - 59, - 68, - 132, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 15, - 0, - 131, - 1, - 82, - 128, - 127, - 13, - 211, - 11, - 154, - 216, - 193, - 115, - 85, - 93, - 42, - 51, - 2, - 155, - 200, - 7, - 172, - 22, - 91, - 97, - 40, - 30, - 144, - 84, - 161, - 115, - 175, - 127, - 244, - 228, - 252, - 136, - 252, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 15, - 32, - 131, - 1, - 82, - 128, - 127, - 34, - 145, - 66, - 216, - 8, - 112, - 44, - 212, - 91, - 38, - 18, - 179, - 229, - 185, - 80, - 177, - 17, - 216, - 135, - 32, - 91, - 41, - 27, - 239, - 208, - 50, - 117, - 159, - 11, - 3, - 119, - 5, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 15, - 64, - 131, - 1, - 82, - 97, - 13, - 64, - 130, - 1, - 81, - 129, - 129, - 97, - 13, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 13, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 15, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 32, - 132, - 1, - 82, - 129, - 129, - 97, - 15, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 12, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 96, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 16, - 160, - 131, - 1, - 82, - 96, - 32, - 97, - 16, - 192, - 131, - 1, - 82, - 96, - 32, - 97, - 16, - 224, - 131, - 1, - 82, - 97, - 16, - 96, - 130, - 1, - 81, - 97, - 17, - 0, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 17, - 32, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 17, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 16, - 128, - 133, - 1, - 96, - 192, - 97, - 16, - 160, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 16, - 128, - 130, - 1, - 81, - 96, - 0, - 97, - 12, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 64, - 134, - 1, - 81, - 9, - 97, - 12, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 15, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 32, - 134, - 1, - 81, - 9, - 97, - 15, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 15, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 0, - 134, - 1, - 81, - 9, - 97, - 15, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 224, - 134, - 1, - 81, - 9, - 97, - 14, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 192, - 134, - 1, - 81, - 9, - 97, - 14, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 160, - 134, - 1, - 81, - 9, - 97, - 14, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 128, - 134, - 1, - 81, - 9, - 97, - 14, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 13, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 96, - 134, - 1, - 81, - 9, - 97, - 13, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 13, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 13, - 64, - 134, - 1, - 81, - 9, - 97, - 13, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 13, - 64, - 133, - 1, - 129, - 144, - 82, - 97, - 13, - 32, - 133, - 1, - 81, - 132, - 147, - 80, - 144, - 145, - 80, - 9, - 97, - 17, - 96, - 131, - 1, - 82, - 128, - 97, - 13, - 128, - 131, - 1, - 81, - 97, - 13, - 96, - 132, - 1, - 81, - 9, - 97, - 17, - 128, - 131, - 1, - 82, - 128, - 97, - 13, - 192, - 131, - 1, - 81, - 97, - 13, - 160, - 132, - 1, - 81, - 9, - 97, - 17, - 160, - 131, - 1, - 82, - 128, - 97, - 14, - 0, - 131, - 1, - 81, - 97, - 13, - 224, - 132, - 1, - 81, - 9, - 97, - 17, - 192, - 131, - 1, - 82, - 128, - 97, - 14, - 64, - 131, - 1, - 81, - 97, - 14, - 32, - 132, - 1, - 81, - 9, - 97, - 17, - 224, - 131, - 1, - 82, - 128, - 97, - 14, - 128, - 131, - 1, - 81, - 97, - 14, - 96, - 132, - 1, - 81, - 9, - 97, - 18, - 0, - 131, - 1, - 82, - 128, - 97, - 14, - 192, - 131, - 1, - 81, - 97, - 14, - 160, - 132, - 1, - 81, - 9, - 97, - 18, - 32, - 131, - 1, - 82, - 128, - 97, - 15, - 0, - 131, - 1, - 81, - 97, - 14, - 224, - 132, - 1, - 81, - 9, - 97, - 18, - 64, - 131, - 1, - 82, - 128, - 97, - 15, - 64, - 131, - 1, - 81, - 97, - 15, - 32, - 132, - 1, - 81, - 9, - 97, - 18, - 96, - 131, - 1, - 82, - 128, - 96, - 32, - 131, - 1, - 81, - 97, - 18, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 96, - 64, - 134, - 1, - 81, - 97, - 18, - 64, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 96, - 96, - 134, - 1, - 81, - 97, - 18, - 96, - 135, - 1, - 81, - 9, - 8, - 97, - 18, - 128, - 132, - 1, - 82, - 80, - 97, - 7, - 32, - 130, - 1, - 81, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 145, - 144, - 8, - 97, - 18, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 18, - 192, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 18, - 224, - 131, - 1, - 82, - 128, - 97, - 18, - 224, - 131, - 1, - 81, - 97, - 18, - 160, - 132, - 1, - 81, - 9, - 97, - 19, - 0, - 131, - 1, - 82, - 128, - 127, - 6, - 111, - 111, - 133, - 214, - 246, - 138, - 133, - 236, - 16, - 52, - 83, - 81, - 162, - 58, - 58, - 175, - 7, - 243, - 138, - 248, - 201, - 82, - 167, - 188, - 236, - 167, - 11, - 210, - 175, - 122, - 213, - 97, - 19, - 0, - 132, - 1, - 81, - 9, - 97, - 19, - 32, - 131, - 1, - 82, - 128, - 97, - 7, - 64, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 19, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 19, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 19, - 128, - 131, - 1, - 82, - 128, - 97, - 19, - 128, - 131, - 1, - 81, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 19, - 160, - 131, - 1, - 82, - 128, - 127, - 43, - 157, - 75, - 65, - 16, - 201, - 174, - 153, - 119, - 130, - 225, - 80, - 155, - 29, - 15, - 219, - 32, - 167, - 192, - 43, - 189, - 139, - 234, - 115, - 5, - 70, - 43, - 159, - 129, - 37, - 177, - 232, - 97, - 19, - 160, - 132, - 1, - 81, - 9, - 97, - 19, - 192, - 131, - 1, - 82, - 128, - 97, - 19, - 192, - 131, - 1, - 81, - 97, - 19, - 32, - 132, - 1, - 81, - 8, - 97, - 19, - 224, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 19, - 224, - 132, - 1, - 81, - 8, - 97, - 20, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 160, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 20, - 32, - 131, - 1, - 82, - 128, - 97, - 20, - 32, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 20, - 64, - 131, - 1, - 82, - 128, - 127, - 12, - 197, - 124, - 219, - 176, - 133, - 7, - 214, - 43, - 246, - 122, - 68, - 147, - 204, - 38, - 47, - 182, - 192, - 157, - 85, - 112, - 19, - 255, - 241, - 245, - 115, - 244, - 49, - 34, - 31, - 143, - 249, - 97, - 19, - 0, - 132, - 1, - 81, - 9, - 97, - 20, - 96, - 131, - 1, - 82, - 128, - 127, - 18, - 116, - 230, - 73, - 163, - 46, - 211, - 85, - 163, - 26, - 110, - 214, - 151, - 36, - 225, - 173, - 173, - 232, - 87, - 232, - 110, - 181, - 195, - 161, - 33, - 188, - 209, - 71, - 148, - 50, - 3, - 200, - 97, - 19, - 160, - 132, - 1, - 81, - 9, - 97, - 20, - 128, - 131, - 1, - 82, - 128, - 97, - 20, - 128, - 131, - 1, - 81, - 97, - 20, - 96, - 132, - 1, - 81, - 8, - 97, - 20, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 20, - 160, - 132, - 1, - 81, - 8, - 97, - 20, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 160, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 20, - 224, - 131, - 1, - 82, - 128, - 97, - 20, - 224, - 131, - 1, - 81, - 97, - 20, - 64, - 132, - 1, - 81, - 8, - 97, - 21, - 0, - 131, - 1, - 82, - 128, - 97, - 21, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 21, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 19, - 0, - 132, - 1, - 81, - 8, - 97, - 21, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 21, - 96, - 131, - 1, - 82, - 128, - 97, - 21, - 96, - 131, - 1, - 81, - 97, - 21, - 32, - 132, - 1, - 81, - 8, - 97, - 21, - 128, - 131, - 1, - 82, - 128, - 97, - 21, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 21, - 160, - 131, - 1, - 82, - 128, - 127, - 6, - 111, - 111, - 133, - 214, - 246, - 138, - 133, - 236, - 16, - 52, - 83, - 81, - 162, - 58, - 58, - 175, - 7, - 243, - 138, - 248, - 201, - 82, - 167, - 188, - 236, - 167, - 11, - 210, - 175, - 122, - 213, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 21, - 192, - 131, - 1, - 82, - 128, - 127, - 43, - 157, - 75, - 65, - 16, - 201, - 174, - 153, - 119, - 130, - 225, - 80, - 155, - 29, - 15, - 219, - 32, - 167, - 192, - 43, - 189, - 139, - 234, - 115, - 5, - 70, - 43, - 159, - 129, - 37, - 177, - 232, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 21, - 224, - 131, - 1, - 82, - 128, - 97, - 21, - 224, - 131, - 1, - 81, - 97, - 21, - 192, - 132, - 1, - 81, - 8, - 97, - 22, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 6, - 224, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 22, - 32, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 22, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 22, - 96, - 131, - 1, - 82, - 128, - 97, - 22, - 96, - 131, - 1, - 81, - 97, - 22, - 32, - 132, - 1, - 81, - 9, - 97, - 22, - 128, - 131, - 1, - 82, - 128, - 127, - 19, - 171, - 236, - 57, - 10, - 218, - 127, - 67, - 112, - 129, - 154, - 177, - 199, - 132, - 111, - 33, - 5, - 84, - 86, - 157, - 155, - 41, - 209, - 234, - 141, - 190, - 189, - 15, - 168, - 197, - 62, - 102, - 97, - 6, - 32, - 132, - 1, - 81, - 9, - 97, - 22, - 160, - 131, - 1, - 82, - 128, - 127, - 30, - 185, - 225, - 220, - 25, - 163, - 58, - 98, - 76, - 152, - 98, - 161, - 217, - 125, - 21, - 16, - 189, - 82, - 30, - 173, - 93, - 254, - 3, - 69, - 170, - 246, - 24, - 91, - 26, - 30, - 96, - 254, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 22, - 192, - 131, - 1, - 82, - 128, - 97, - 22, - 192, - 131, - 1, - 81, - 97, - 22, - 160, - 132, - 1, - 81, - 8, - 97, - 22, - 224, - 131, - 1, - 82, - 128, - 97, - 22, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 22, - 128, - 132, - 1, - 81, - 8, - 97, - 23, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 23, - 32, - 131, - 1, - 82, - 128, - 97, - 23, - 32, - 131, - 1, - 81, - 97, - 21, - 160, - 132, - 1, - 81, - 8, - 97, - 23, - 64, - 131, - 1, - 82, - 128, - 97, - 23, - 64, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 23, - 96, - 131, - 1, - 82, - 128, - 127, - 12, - 197, - 124, - 219, - 176, - 133, - 7, - 214, - 43, - 246, - 122, - 68, - 147, - 204, - 38, - 47, - 182, - 192, - 157, - 85, - 112, - 19, - 255, - 241, - 245, - 115, - 244, - 49, - 34, - 31, - 143, - 249, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 23, - 128, - 131, - 1, - 82, - 128, - 127, - 18, - 116, - 230, - 73, - 163, - 46, - 211, - 85, - 163, - 26, - 110, - 214, - 151, - 36, - 225, - 173, - 173, - 232, - 87, - 232, - 110, - 181, - 195, - 161, - 33, - 188, - 209, - 71, - 148, - 50, - 3, - 200, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 23, - 160, - 131, - 1, - 82, - 128, - 97, - 23, - 160, - 131, - 1, - 81, - 97, - 23, - 128, - 132, - 1, - 81, - 8, - 97, - 23, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 0, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 23, - 224, - 131, - 1, - 82, - 128, - 127, - 15, - 193, - 201, - 57, - 77, - 184, - 155, - 178, - 96, - 26, - 188, - 73, - 253, - 173, - 79, - 3, - 140, - 229, - 22, - 144, - 48, - 162, - 173, - 105, - 118, - 63, - 120, - 117, - 3, - 107, - 203, - 2, - 97, - 6, - 32, - 132, - 1, - 81, - 9, - 97, - 24, - 0, - 131, - 1, - 82, - 128, - 127, - 22, - 169, - 233, - 140, - 73, - 58, - 144, - 43, - 149, - 2, - 5, - 78, - 220, - 3, - 231, - 178, - 43, - 126, - 172, - 52, - 52, - 89, - 97, - 188, - 138, - 188, - 237, - 107, - 209, - 71, - 200, - 190, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 24, - 32, - 131, - 1, - 82, - 128, - 97, - 24, - 32, - 131, - 1, - 81, - 97, - 24, - 0, - 132, - 1, - 81, - 8, - 97, - 24, - 64, - 131, - 1, - 82, - 128, - 97, - 24, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 23, - 224, - 132, - 1, - 81, - 8, - 97, - 24, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 24, - 128, - 131, - 1, - 82, - 128, - 97, - 24, - 128, - 131, - 1, - 81, - 97, - 23, - 96, - 132, - 1, - 81, - 8, - 97, - 24, - 160, - 131, - 1, - 82, - 128, - 97, - 24, - 160, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 24, - 192, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 24, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 0, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 2, - 8, - 97, - 25, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 64, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 3, - 8, - 97, - 25, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 128, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 97, - 6, - 160, - 132, - 1, - 81, - 8, - 97, - 25, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 25, - 160, - 132, - 1, - 81, - 8, - 97, - 25, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 224, - 131, - 1, - 82, - 128, - 97, - 25, - 224, - 131, - 1, - 81, - 97, - 24, - 192, - 132, - 1, - 81, - 8, - 97, - 26, - 0, - 131, - 1, - 82, - 128, - 97, - 26, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 26, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 128, - 132, - 1, - 81, - 8, - 97, - 26, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 26, - 96, - 131, - 1, - 82, - 128, - 97, - 26, - 96, - 131, - 1, - 81, - 97, - 26, - 32, - 132, - 1, - 81, - 8, - 97, - 26, - 128, - 131, - 1, - 82, - 128, - 97, - 26, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 26, - 160, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 97, - 25, - 32, - 132, - 1, - 81, - 9, - 97, - 26, - 192, - 131, - 1, - 82, - 128, - 97, - 26, - 192, - 131, - 1, - 81, - 97, - 25, - 96, - 132, - 1, - 81, - 9, - 97, - 26, - 224, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 4, - 8, - 97, - 27, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 26, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 27, - 32, - 131, - 1, - 82, - 128, - 97, - 27, - 32, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 27, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 27, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 27, - 128, - 131, - 1, - 82, - 128, - 97, - 27, - 128, - 131, - 1, - 81, - 97, - 26, - 160, - 132, - 1, - 81, - 8, - 97, - 27, - 160, - 131, - 1, - 82, - 128, - 97, - 27, - 160, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 27, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 96, - 2, - 9, - 97, - 27, - 224, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 28, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 28, - 32, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 32, - 132, - 1, - 81, - 8, - 97, - 28, - 64, - 131, - 1, - 82, - 128, - 97, - 28, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 28, - 32, - 132, - 1, - 81, - 8, - 97, - 28, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 28, - 128, - 131, - 1, - 82, - 128, - 97, - 28, - 128, - 131, - 1, - 81, - 130, - 3, - 97, - 28, - 96, - 132, - 1, - 81, - 8, - 97, - 28, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 28, - 192, - 131, - 1, - 82, - 128, - 97, - 28, - 192, - 131, - 1, - 81, - 97, - 27, - 192, - 132, - 1, - 81, - 8, - 97, - 28, - 224, - 131, - 1, - 82, - 128, - 97, - 28, - 224, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 0, - 131, - 1, - 82, - 128, - 97, - 25, - 0, - 131, - 1, - 81, - 97, - 25, - 96, - 132, - 1, - 81, - 9, - 97, - 29, - 32, - 131, - 1, - 82, - 128, - 97, - 29, - 32, - 131, - 1, - 81, - 97, - 27, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 29, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 29, - 96, - 132, - 1, - 81, - 8, - 97, - 29, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 29, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 29, - 160, - 131, - 1, - 82, - 128, - 97, - 29, - 160, - 131, - 1, - 81, - 97, - 29, - 0, - 132, - 1, - 81, - 8, - 97, - 29, - 192, - 131, - 1, - 82, - 128, - 97, - 29, - 192, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 29, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 30, - 0, - 131, - 1, - 82, - 128, - 97, - 30, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 30, - 32, - 131, - 1, - 82, - 128, - 97, - 25, - 64, - 131, - 1, - 81, - 97, - 27, - 0, - 132, - 1, - 81, - 9, - 97, - 30, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 30, - 96, - 131, - 1, - 82, - 128, - 96, - 1, - 96, - 112, - 27, - 97, - 30, - 96, - 132, - 1, - 81, - 8, - 97, - 30, - 128, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 30, - 128, - 132, - 1, - 81, - 8, - 97, - 30, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 30, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 30, - 192, - 131, - 1, - 82, - 128, - 97, - 30, - 192, - 131, - 1, - 81, - 97, - 30, - 32, - 132, - 1, - 81, - 8, - 97, - 30, - 224, - 131, - 1, - 82, - 128, - 97, - 30, - 224, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 31, - 0, - 131, - 1, - 82, - 128, - 97, - 8, - 192, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 31, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 31, - 64, - 131, - 1, - 82, - 128, - 97, - 31, - 64, - 131, - 1, - 81, - 97, - 31, - 0, - 132, - 1, - 81, - 8, - 97, - 31, - 96, - 131, - 1, - 82, - 128, - 97, - 31, - 96, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 31, - 128, - 131, - 1, - 82, - 97, - 9, - 32, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 31, - 160, - 131, - 1, - 82, - 128, - 97, - 9, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 31, - 160, - 132, - 1, - 81, - 8, - 97, - 31, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 31, - 224, - 131, - 1, - 82, - 128, - 97, - 31, - 224, - 131, - 1, - 81, - 97, - 31, - 128, - 132, - 1, - 81, - 8, - 97, - 32, - 0, - 131, - 1, - 82, - 128, - 97, - 32, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 32, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 32, - 132, - 1, - 81, - 8, - 97, - 32, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 32, - 96, - 131, - 1, - 82, - 128, - 97, - 32, - 96, - 131, - 1, - 81, - 97, - 32, - 32, - 132, - 1, - 81, - 8, - 97, - 32, - 128, - 131, - 1, - 82, - 128, - 97, - 32, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 32, - 160, - 131, - 1, - 82, - 128, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 32, - 192, - 131, - 1, - 82, - 128, - 97, - 17, - 160, - 131, - 1, - 81, - 97, - 17, - 128, - 132, - 1, - 81, - 8, - 97, - 32, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 192, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 224, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 0, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 64, - 131, - 1, - 82, - 128, - 97, - 33, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 32, - 192, - 132, - 1, - 81, - 8, - 97, - 33, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 0, - 132, - 1, - 81, - 9, - 97, - 33, - 128, - 131, - 1, - 82, - 128, - 97, - 33, - 128, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 8, - 97, - 33, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 32, - 132, - 1, - 81, - 9, - 97, - 33, - 224, - 131, - 1, - 82, - 128, - 97, - 33, - 224, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 34, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 34, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 34, - 64, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 64, - 132, - 1, - 81, - 9, - 97, - 34, - 96, - 131, - 1, - 82, - 128, - 97, - 34, - 96, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 34, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 34, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 34, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 34, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 96, - 132, - 1, - 81, - 9, - 97, - 34, - 224, - 131, - 1, - 82, - 128, - 97, - 34, - 224, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 8, - 97, - 35, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 35, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 34, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 35, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 8, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 35, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 35, - 128, - 131, - 1, - 82, - 128, - 97, - 35, - 128, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 35, - 160, - 131, - 1, - 82, - 128, - 97, - 35, - 160, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 8, - 97, - 35, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 35, - 224, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 9, - 34, - 107, - 110, - 34, - 198, - 240, - 202, - 100, - 236, - 38, - 170, - 212, - 200, - 110, - 113, - 91, - 95, - 137, - 142, - 94, - 150, - 63, - 37, - 135, - 14, - 86, - 187, - 229, - 51, - 233, - 162, - 9, - 97, - 36, - 0, - 131, - 1, - 82, - 128, - 97, - 36, - 0, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 36, - 32, - 131, - 1, - 82, - 128, - 97, - 36, - 32, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 36, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 36, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 35, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 36, - 128, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 19, - 179, - 96, - 212, - 232, - 47, - 233, - 21, - 254, - 209, - 96, - 129, - 3, - 143, - 152, - 194, - 17, - 66, - 123, - 135, - 162, - 129, - 189, - 115, - 60, - 39, - 125, - 186, - 223, - 16, - 55, - 43, - 9, - 97, - 36, - 160, - 131, - 1, - 82, - 128, - 97, - 36, - 160, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 36, - 192, - 131, - 1, - 82, - 128, - 97, - 36, - 192, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 36, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 37, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 36, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 32, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 24, - 175, - 223, - 35, - 233, - 189, - 147, - 2, - 103, - 63, - 193, - 224, - 118, - 164, - 146, - 212, - 214, - 91, - 209, - 142, - 188, - 77, - 133, - 78, - 209, - 137, - 19, - 155, - 171, - 49, - 62, - 82, - 9, - 97, - 37, - 64, - 131, - 1, - 82, - 128, - 97, - 37, - 64, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 37, - 96, - 131, - 1, - 82, - 128, - 97, - 37, - 96, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 8, - 97, - 37, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 37, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 37, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 8, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 224, - 131, - 1, - 82, - 128, - 97, - 37, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 35, - 96, - 132, - 1, - 81, - 8, - 97, - 38, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 38, - 32, - 131, - 1, - 82, - 128, - 97, - 38, - 32, - 131, - 1, - 81, - 97, - 32, - 160, - 132, - 1, - 81, - 8, - 97, - 38, - 64, - 131, - 1, - 82, - 128, - 97, - 38, - 64, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 38, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 128, - 132, - 1, - 81, - 9, - 97, - 38, - 128, - 131, - 1, - 82, - 128, - 97, - 38, - 128, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 38, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 38, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 160, - 132, - 1, - 81, - 9, - 97, - 38, - 224, - 131, - 1, - 82, - 128, - 97, - 38, - 224, - 131, - 1, - 81, - 97, - 18, - 128, - 132, - 1, - 81, - 8, - 97, - 39, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 39, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 38, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 39, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 39, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 126, - 161, - 54, - 186, - 19, - 175, - 166, - 200, - 62, - 183, - 184, - 47, - 179, - 112, - 226, - 40, - 231, - 65, - 85, - 228, - 143, - 184, - 241, - 193, - 207, - 195, - 63, - 176, - 218, - 138, - 251, - 66, - 9, - 97, - 39, - 128, - 131, - 1, - 82, - 128, - 97, - 39, - 128, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 39, - 160, - 131, - 1, - 82, - 128, - 97, - 39, - 160, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 39, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 39, - 224, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 46, - 185, - 117, - 13, - 206, - 84, - 95, - 23, - 212, - 146, - 5, - 141, - 210, - 1, - 161, - 37, - 31, - 243, - 217, - 7, - 120, - 100, - 88, - 61, - 68, - 234, - 249, - 190, - 144, - 8, - 105, - 157, - 9, - 97, - 40, - 0, - 131, - 1, - 82, - 128, - 97, - 40, - 0, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 40, - 32, - 131, - 1, - 82, - 128, - 97, - 40, - 32, - 131, - 1, - 81, - 97, - 18, - 128, - 132, - 1, - 81, - 8, - 97, - 40, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 40, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 39, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 160, - 131, - 1, - 82, - 128, - 97, - 40, - 160, - 131, - 1, - 81, - 130, - 3, - 97, - 39, - 96, - 132, - 1, - 81, - 8, - 97, - 40, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 224, - 131, - 1, - 82, - 128, - 97, - 40, - 224, - 131, - 1, - 81, - 97, - 38, - 96, - 132, - 1, - 81, - 8, - 97, - 41, - 0, - 131, - 1, - 82, - 128, - 97, - 41, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 41, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 41, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 41, - 96, - 131, - 1, - 82, - 128, - 97, - 41, - 96, - 131, - 1, - 81, - 97, - 41, - 32, - 132, - 1, - 81, - 8, - 97, - 41, - 128, - 131, - 1, - 82, - 128, - 97, - 41, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 41, - 160, - 131, - 1, - 82, - 97, - 9, - 96, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 41, - 192, - 131, - 1, - 82, - 128, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 41, - 192, - 132, - 1, - 81, - 8, - 97, - 41, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 0, - 131, - 1, - 82, - 128, - 97, - 42, - 0, - 131, - 1, - 81, - 97, - 41, - 160, - 132, - 1, - 81, - 8, - 97, - 42, - 32, - 131, - 1, - 82, - 128, - 97, - 42, - 32, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 42, - 64, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 42, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 128, - 131, - 1, - 82, - 128, - 97, - 2, - 160, - 131, - 1, - 81, - 97, - 9, - 224, - 132, - 1, - 81, - 8, - 97, - 42, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 42, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 192, - 131, - 1, - 81, - 97, - 1, - 0, - 9, - 97, - 42, - 224, - 131, - 1, - 82, - 128, - 97, - 42, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 43, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 64, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 43, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 160, - 131, - 1, - 81, - 97, - 7, - 32, - 132, - 1, - 81, - 8, - 97, - 43, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 43, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 160, - 131, - 1, - 82, - 128, - 97, - 43, - 160, - 131, - 1, - 81, - 130, - 3, - 97, - 42, - 192, - 132, - 1, - 81, - 8, - 97, - 43, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 224, - 131, - 1, - 82, - 128, - 97, - 43, - 224, - 131, - 1, - 81, - 97, - 42, - 64, - 132, - 1, - 81, - 8, - 97, - 44, - 0, - 131, - 1, - 82, - 128, - 97, - 44, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 44, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 44, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 44, - 96, - 131, - 1, - 82, - 128, - 97, - 44, - 96, - 131, - 1, - 81, - 97, - 44, - 32, - 132, - 1, - 81, - 8, - 97, - 44, - 128, - 131, - 1, - 82, - 128, - 97, - 44, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 44, - 160, - 131, - 1, - 82, - 128, - 97, - 33, - 96, - 131, - 1, - 81, - 97, - 44, - 64, - 132, - 1, - 81, - 9, - 97, - 44, - 192, - 131, - 1, - 82, - 128, - 97, - 9, - 192, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 44, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 44, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 0, - 131, - 1, - 82, - 128, - 97, - 45, - 0, - 131, - 1, - 81, - 97, - 44, - 160, - 132, - 1, - 81, - 8, - 97, - 45, - 32, - 131, - 1, - 82, - 97, - 12, - 192, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 45, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 160, - 131, - 1, - 82, - 128, - 97, - 12, - 192, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 45, - 192, - 131, - 1, - 82, - 128, - 97, - 45, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 45, - 224, - 131, - 1, - 82, - 128, - 97, - 45, - 96, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 46, - 0, - 131, - 1, - 82, - 128, - 97, - 45, - 128, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 46, - 32, - 131, - 1, - 82, - 128, - 97, - 12, - 224, - 131, - 1, - 81, - 97, - 45, - 32, - 132, - 1, - 81, - 9, - 97, - 46, - 64, - 131, - 1, - 82, - 128, - 97, - 5, - 160, - 131, - 1, - 81, - 97, - 11, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 96, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 128, - 131, - 1, - 82, - 128, - 97, - 46, - 128, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 46, - 160, - 131, - 1, - 82, - 128, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 227, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 192, - 131, - 1, - 82, - 128, - 97, - 46, - 192, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 46, - 224, - 131, - 1, - 82, - 128, - 127, - 21, - 247, - 157, - 185, - 195, - 145, - 129, - 188, - 62, - 49, - 200, - 63, - 146, - 145, - 218, - 118, - 238, - 223, - 27, - 35, - 196, - 16, - 173, - 215, - 233, - 9, - 132, - 100, - 170, - 164, - 251, - 38, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 47, - 0, - 131, - 1, - 82, - 128, - 97, - 47, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 47, - 32, - 131, - 1, - 82, - 128, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 125, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 47, - 64, - 131, - 1, - 82, - 128, - 97, - 47, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 47, - 96, - 131, - 1, - 82, - 128, - 129, - 127, - 43, - 11, - 209, - 103, - 49, - 170, - 243, - 73, - 40, - 192, - 102, - 27, - 164, - 51, - 16, - 251, - 191, - 68, - 186, - 164, - 87, - 185, - 128, - 206, - 25, - 175, - 251, - 167, - 49, - 87, - 146, - 164, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 5, - 88, - 125, - 11, - 175, - 134, - 172, - 224, - 143, - 143, - 223, - 154, - 221, - 78, - 71, - 97, - 104, - 239, - 45, - 164, - 33, - 255, - 239, - 195, - 42, - 49, - 249, - 236, - 190, - 168, - 109, - 93, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 47, - 128, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 30, - 66, - 33, - 78, - 169, - 178, - 219, - 51, - 41, - 107, - 165, - 80, - 150, - 129, - 90, - 10, - 109, - 70, - 138, - 247, - 21, - 204, - 250, - 159, - 171, - 147, - 177, - 227, - 112, - 27, - 127, - 98, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 22, - 72, - 204, - 5, - 91, - 17, - 175, - 78, - 15, - 98, - 146, - 61, - 150, - 39, - 227, - 119, - 177, - 212, - 19, - 192, - 134, - 74, - 244, - 150, - 58, - 130, - 111, - 204, - 106, - 2, - 49, - 250, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 47, - 160, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 41, - 96, - 216, - 74, - 149, - 216, - 240, - 15, - 116, - 10, - 61, - 20, - 120, - 254, - 182, - 212, - 177, - 150, - 227, - 75, - 248, - 107, - 98, - 183, - 80, - 65, - 177, - 75, - 56, - 157, - 73, - 206, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 33, - 254, - 97, - 90, - 206, - 153, - 2, - 136, - 65, - 200, - 67, - 147, - 227, - 148, - 53, - 234, - 38, - 103, - 94, - 73, - 79, - 212, - 136, - 98, - 99, - 230, - 254, - 221, - 60, - 186, - 31, - 22, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 47, - 192, - 132, - 1, - 82, - 80, - 97, - 46, - 160, - 130, - 1, - 81, - 129, - 144, - 96, - 1, - 9, - 97, - 47, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 47, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 48, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 46, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 48, - 32, - 131, - 1, - 82, - 128, - 129, - 127, - 5, - 139, - 76, - 84, - 16, - 181, - 93, - 126, - 158, - 88, - 201, - 89, - 142, - 181, - 133, - 126, - 118, - 253, - 254, - 21, - 106, - 158, - 91, - 29, - 134, - 217, - 28, - 0, - 230, - 59, - 68, - 133, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 124, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 64, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 124, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 29, - 5, - 246, - 131, - 247, - 186, - 207, - 85, - 188, - 205, - 73, - 90, - 87, - 3, - 203, - 50, - 154, - 218, - 137, - 10, - 240, - 138, - 192, - 210, - 73, - 89, - 89, - 158, - 36, - 200, - 50, - 129, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 96, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 35, - 175, - 64, - 228, - 126, - 47, - 89, - 160, - 56, - 9, - 72, - 74, - 41, - 213, - 227, - 175, - 191, - 16, - 95, - 31, - 161, - 0, - 222, - 139, - 226, - 18, - 149, - 169, - 47, - 167, - 85, - 52, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 12, - 181, - 13, - 142, - 99, - 2, - 70, - 137, - 128, - 70, - 253, - 108, - 87, - 171, - 116, - 173, - 105, - 35, - 137, - 40, - 216, - 184, - 146, - 5, - 97, - 207, - 95, - 234, - 192, - 88, - 170, - 205, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 128, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 37, - 158, - 177, - 209, - 93, - 46, - 116, - 220, - 26, - 34, - 195, - 34, - 16, - 222, - 135, - 86, - 109, - 122, - 230, - 123, - 204, - 133, - 156, - 225, - 227, - 49, - 23, - 225, - 113, - 203, - 188, - 210, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 7, - 5, - 247, - 144, - 26, - 11, - 163, - 115, - 109, - 255, - 8, - 48, - 168, - 19, - 205, - 199, - 53, - 12, - 231, - 156, - 133, - 43, - 162, - 216, - 99, - 83, - 208, - 255, - 132, - 216, - 11, - 181, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 160, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 42, - 107, - 190, - 181, - 99, - 50, - 242, - 32, - 195, - 15, - 202, - 172, - 115, - 127, - 216, - 133, - 195, - 89, - 100, - 128, - 240, - 202, - 47, - 240, - 125, - 39, - 51, - 86, - 25, - 17, - 183, - 189, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 38, - 160, - 248, - 77, - 118, - 68, - 75, - 94, - 10, - 96, - 248, - 150, - 108, - 198, - 200, - 140, - 9, - 207, - 7, - 19, - 189, - 4, - 75, - 169, - 254, - 108, - 155, - 46, - 139, - 98, - 99, - 183, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 48, - 192, - 132, - 1, - 82, - 80, - 97, - 47, - 32, - 130, - 1, - 81, - 97, - 48, - 0, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 48, - 224, - 131, - 1, - 82, - 128, - 129, - 127, - 37, - 128, - 133, - 19, - 32, - 245, - 149, - 202, - 138, - 103, - 156, - 194, - 21, - 125, - 139, - 125, - 72, - 70, - 188, - 142, - 237, - 27, - 37, - 176, - 146, - 214, - 223, - 166, - 75, - 28, - 78, - 31, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 226, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 49, - 0, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 226, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 1, - 120, - 41, - 212, - 58, - 163, - 82, - 155, - 165, - 237, - 63, - 72, - 121, - 205, - 28, - 9, - 255, - 159, - 6, - 231, - 22, - 175, - 178, - 188, - 108, - 199, - 40, - 71, - 209, - 39, - 113, - 174, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 49, - 32, - 132, - 1, - 82, - 80, - 97, - 46, - 224, - 130, - 1, - 81, - 97, - 47, - 224, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 49, - 64, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 49, - 96, - 132, - 1, - 82, - 80, - 97, - 47, - 128, - 130, - 1, - 81, - 97, - 47, - 160, - 131, - 1, - 81, - 130, - 144, - 130, - 144, - 9, - 144, - 80, - 128, - 97, - 49, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 47, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 32, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 160, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 32, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 51, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 47, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 51, - 32, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 51, - 96, - 131, - 1, - 82, - 96, - 32, - 97, - 51, - 128, - 131, - 1, - 82, - 96, - 32, - 97, - 51, - 160, - 131, - 1, - 82, - 97, - 51, - 32, - 130, - 1, - 81, - 97, - 51, - 192, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 51, - 224, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 52, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 51, - 64, - 133, - 1, - 96, - 192, - 97, - 51, - 96, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 51, - 64, - 130, - 1, - 81, - 96, - 0, - 97, - 47, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 51, - 0, - 134, - 1, - 81, - 9, - 97, - 47, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 224, - 134, - 1, - 81, - 9, - 97, - 49, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 192, - 134, - 1, - 81, - 9, - 97, - 49, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 32, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 160, - 134, - 1, - 81, - 9, - 97, - 49, - 32, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 128, - 134, - 1, - 81, - 9, - 97, - 49, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 96, - 134, - 1, - 81, - 9, - 97, - 48, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 64, - 134, - 1, - 81, - 9, - 97, - 48, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 32, - 134, - 1, - 81, - 9, - 97, - 48, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 0, - 134, - 1, - 81, - 9, - 97, - 48, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 224, - 134, - 1, - 81, - 9, - 97, - 48, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 192, - 134, - 1, - 81, - 9, - 97, - 48, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 160, - 134, - 1, - 81, - 9, - 97, - 48, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 47, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 128, - 134, - 1, - 81, - 9, - 97, - 47, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 47, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 47, - 128, - 134, - 1, - 81, - 9, - 97, - 47, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 47, - 128, - 133, - 1, - 129, - 144, - 82, - 97, - 47, - 160, - 133, - 1, - 81, - 144, - 146, - 80, - 131, - 145, - 80, - 130, - 144, - 8, - 144, - 80, - 129, - 129, - 97, - 47, - 192, - 133, - 1, - 81, - 8, - 97, - 52, - 32, - 132, - 1, - 82, - 80, - 97, - 48, - 0, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 64, - 131, - 1, - 82, - 97, - 48, - 64, - 130, - 1, - 81, - 129, - 129, - 97, - 48, - 96, - 133, - 1, - 81, - 8, - 97, - 52, - 96, - 132, - 1, - 82, - 80, - 97, - 48, - 224, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 128, - 131, - 1, - 82, - 97, - 48, - 128, - 130, - 1, - 81, - 129, - 129, - 97, - 48, - 160, - 133, - 1, - 81, - 8, - 144, - 80, - 129, - 129, - 97, - 48, - 192, - 133, - 1, - 81, - 8, - 97, - 52, - 160, - 132, - 1, - 82, - 80, - 97, - 49, - 64, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 192, - 131, - 1, - 82, - 97, - 49, - 0, - 130, - 1, - 81, - 129, - 129, - 97, - 49, - 32, - 133, - 1, - 81, - 8, - 97, - 52, - 224, - 132, - 1, - 82, - 80, - 97, - 47, - 224, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 53, - 0, - 131, - 1, - 82, - 97, - 49, - 96, - 130, - 1, - 81, - 128, - 97, - 53, - 32, - 132, - 1, - 82, - 80, - 97, - 52, - 32, - 130, - 1, - 81, - 129, - 129, - 97, - 52, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 52, - 160, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 52, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 53, - 32, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 160, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 53, - 224, - 131, - 1, - 82, - 96, - 32, - 97, - 54, - 0, - 131, - 1, - 82, - 96, - 32, - 97, - 54, - 32, - 131, - 1, - 82, - 97, - 53, - 160, - 130, - 1, - 81, - 97, - 54, - 64, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 54, - 96, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 54, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 53, - 192, - 133, - 1, - 96, - 192, - 97, - 53, - 224, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 53, - 192, - 130, - 1, - 81, - 96, - 0, - 97, - 53, - 32, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 128, - 134, - 1, - 81, - 9, - 97, - 53, - 32, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 96, - 134, - 1, - 81, - 9, - 97, - 52, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 64, - 134, - 1, - 81, - 9, - 97, - 52, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 52, - 32, - 134, - 1, - 81, - 9, - 97, - 52, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 52, - 32, - 133, - 1, - 82, - 80, - 80, - 97, - 52, - 96, - 130, - 1, - 81, - 97, - 52, - 64, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 54, - 160, - 131, - 1, - 82, - 128, - 97, - 52, - 160, - 131, - 1, - 81, - 97, - 52, - 128, - 132, - 1, - 81, - 9, - 97, - 54, - 192, - 131, - 1, - 82, - 128, - 97, - 52, - 224, - 131, - 1, - 81, - 97, - 52, - 192, - 132, - 1, - 81, - 9, - 97, - 54, - 224, - 131, - 1, - 82, - 128, - 97, - 53, - 32, - 131, - 1, - 81, - 97, - 53, - 0, - 132, - 1, - 81, - 9, - 97, - 55, - 0, - 131, - 1, - 82, - 97, - 10, - 32, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 55, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 0, - 131, - 1, - 82, - 97, - 10, - 128, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 57, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 128, - 131, - 1, - 82, - 128, - 97, - 47, - 128, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 47, - 160, - 134, - 1, - 81, - 97, - 6, - 32, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 47, - 192, - 134, - 1, - 81, - 97, - 6, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 57, - 160, - 132, - 1, - 129, - 144, - 82, - 97, - 52, - 32, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 57, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 57, - 192, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 57, - 224, - 131, - 1, - 82, - 128, - 97, - 47, - 128, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 47, - 160, - 134, - 1, - 81, - 97, - 6, - 64, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 47, - 192, - 134, - 1, - 81, - 97, - 6, - 128, - 135, - 1, - 81, - 9, - 8, - 97, - 58, - 0, - 132, - 1, - 129, - 144, - 82, - 97, - 52, - 32, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 58, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 58, - 64, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 58, - 96, - 131, - 1, - 82, - 128, - 97, - 58, - 64, - 131, - 1, - 81, - 97, - 57, - 224, - 132, - 1, - 81, - 8, - 97, - 58, - 128, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 128, - 132, - 1, - 81, - 9, - 97, - 58, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 96, - 132, - 1, - 81, - 9, - 97, - 58, - 192, - 131, - 1, - 82, - 128, - 97, - 52, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 58, - 224, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 6, - 192, - 135, - 1, - 81, - 9, - 8, - 97, - 59, - 0, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 59, - 32, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 59, - 32, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 59, - 64, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 59, - 96, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 9, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 9, - 64, - 135, - 1, - 81, - 9, - 8, - 97, - 59, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 59, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 59, - 192, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 59, - 224, - 131, - 1, - 82, - 128, - 97, - 59, - 192, - 131, - 1, - 81, - 97, - 59, - 64, - 132, - 1, - 81, - 8, - 97, - 60, - 0, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 9, - 96, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 9, - 128, - 135, - 1, - 81, - 9, - 8, - 97, - 60, - 32, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 60, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 60, - 96, - 131, - 1, - 82, - 128, - 97, - 55, - 32, - 131, - 1, - 81, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 60, - 128, - 131, - 1, - 82, - 128, - 97, - 60, - 96, - 131, - 1, - 81, - 97, - 60, - 0, - 132, - 1, - 81, - 8, - 97, - 60, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 60, - 192, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 59, - 96, - 132, - 1, - 81, - 9, - 97, - 60, - 224, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 59, - 224, - 132, - 1, - 81, - 9, - 97, - 61, - 0, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 60, - 128, - 132, - 1, - 81, - 9, - 97, - 61, - 32, - 131, - 1, - 82, - 128, - 97, - 60, - 192, - 131, - 1, - 81, - 97, - 58, - 160, - 132, - 1, - 81, - 8, - 97, - 61, - 64, - 131, - 1, - 82, - 128, - 97, - 52, - 128, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 61, - 96, - 131, - 1, - 82, - 128, - 97, - 48, - 128, - 131, - 1, - 81, - 97, - 8, - 192, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 160, - 134, - 1, - 81, - 97, - 8, - 224, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 48, - 192, - 134, - 1, - 81, - 97, - 9, - 0, - 135, - 1, - 81, - 9, - 8, - 97, - 61, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 192, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 61, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 61, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 61, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 61, - 96, - 132, - 1, - 81, - 9, - 97, - 61, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 32, - 131, - 1, - 81, - 97, - 61, - 192, - 132, - 1, - 81, - 9, - 97, - 62, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 32, - 131, - 1, - 81, - 97, - 61, - 224, - 132, - 1, - 81, - 9, - 97, - 62, - 32, - 131, - 1, - 82, - 128, - 97, - 62, - 0, - 131, - 1, - 81, - 97, - 61, - 64, - 132, - 1, - 81, - 8, - 97, - 62, - 64, - 131, - 1, - 82, - 128, - 97, - 52, - 192, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 62, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 0, - 131, - 1, - 81, - 97, - 9, - 160, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 49, - 32, - 134, - 1, - 81, - 97, - 9, - 192, - 135, - 1, - 81, - 9, - 8, - 97, - 62, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 224, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 62, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 62, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 62, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 62, - 96, - 132, - 1, - 81, - 9, - 97, - 62, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 64, - 131, - 1, - 81, - 97, - 62, - 192, - 132, - 1, - 81, - 9, - 97, - 63, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 64, - 131, - 1, - 81, - 97, - 62, - 224, - 132, - 1, - 81, - 9, - 97, - 63, - 32, - 131, - 1, - 82, - 128, - 97, - 63, - 0, - 131, - 1, - 81, - 97, - 62, - 64, - 132, - 1, - 81, - 8, - 97, - 63, - 64, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 63, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 9, - 224, - 132, - 1, - 81, - 9, - 97, - 63, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 63, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 63, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 63, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 63, - 224, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 9, - 97, - 64, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 64, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 64, - 64, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 64, - 96, - 131, - 1, - 82, - 128, - 97, - 64, - 64, - 131, - 1, - 81, - 97, - 63, - 192, - 132, - 1, - 81, - 8, - 97, - 64, - 128, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 9, - 97, - 64, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 64, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 64, - 224, - 131, - 1, - 82, - 128, - 97, - 55, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 65, - 0, - 131, - 1, - 82, - 128, - 97, - 64, - 224, - 131, - 1, - 81, - 97, - 64, - 128, - 132, - 1, - 81, - 8, - 97, - 65, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 32, - 132, - 1, - 81, - 9, - 97, - 65, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 65, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 64, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 65, - 128, - 131, - 1, - 82, - 128, - 97, - 55, - 64, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 65, - 160, - 131, - 1, - 82, - 128, - 97, - 65, - 128, - 131, - 1, - 81, - 97, - 65, - 32, - 132, - 1, - 81, - 8, - 97, - 65, - 192, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 64, - 132, - 1, - 81, - 9, - 97, - 65, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 66, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 96, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 66, - 32, - 131, - 1, - 82, - 128, - 97, - 55, - 96, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 64, - 131, - 1, - 82, - 128, - 97, - 66, - 32, - 131, - 1, - 81, - 97, - 65, - 192, - 132, - 1, - 81, - 8, - 97, - 66, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 66, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 128, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 66, - 192, - 131, - 1, - 82, - 128, - 97, - 55, - 128, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 224, - 131, - 1, - 82, - 128, - 97, - 66, - 192, - 131, - 1, - 81, - 97, - 66, - 96, - 132, - 1, - 81, - 8, - 97, - 67, - 0, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 128, - 132, - 1, - 81, - 9, - 97, - 67, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 67, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 160, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 67, - 96, - 131, - 1, - 82, - 128, - 97, - 55, - 160, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 67, - 128, - 131, - 1, - 82, - 128, - 97, - 67, - 96, - 131, - 1, - 81, - 97, - 67, - 0, - 132, - 1, - 81, - 8, - 97, - 67, - 160, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 160, - 132, - 1, - 81, - 9, - 97, - 67, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 67, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 192, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 68, - 0, - 131, - 1, - 82, - 128, - 97, - 55, - 192, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 68, - 32, - 131, - 1, - 82, - 128, - 97, - 68, - 0, - 131, - 1, - 81, - 97, - 67, - 160, - 132, - 1, - 81, - 8, - 97, - 68, - 64, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 192, - 132, - 1, - 81, - 9, - 97, - 68, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 68, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 224, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 68, - 160, - 131, - 1, - 82, - 128, - 97, - 55, - 224, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 68, - 192, - 131, - 1, - 82, - 128, - 97, - 68, - 160, - 131, - 1, - 81, - 97, - 68, - 64, - 132, - 1, - 81, - 8, - 97, - 68, - 224, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 0, - 132, - 1, - 81, - 9, - 97, - 69, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 69, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 0, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 69, - 64, - 131, - 1, - 82, - 128, - 97, - 56, - 0, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 69, - 96, - 131, - 1, - 82, - 128, - 97, - 69, - 64, - 131, - 1, - 81, - 97, - 68, - 224, - 132, - 1, - 81, - 8, - 97, - 69, - 128, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 32, - 132, - 1, - 81, - 9, - 97, - 69, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 69, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 69, - 224, - 131, - 1, - 82, - 128, - 97, - 56, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 0, - 131, - 1, - 82, - 128, - 97, - 69, - 224, - 131, - 1, - 81, - 97, - 69, - 128, - 132, - 1, - 81, - 8, - 97, - 70, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 64, - 132, - 1, - 81, - 9, - 97, - 70, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 70, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 70, - 128, - 131, - 1, - 82, - 128, - 97, - 56, - 64, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 160, - 131, - 1, - 82, - 128, - 97, - 70, - 128, - 131, - 1, - 81, - 97, - 70, - 32, - 132, - 1, - 81, - 8, - 97, - 70, - 192, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 71, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 96, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 71, - 32, - 131, - 1, - 82, - 128, - 97, - 56, - 96, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 71, - 64, - 131, - 1, - 82, - 128, - 97, - 71, - 32, - 131, - 1, - 81, - 97, - 70, - 192, - 132, - 1, - 81, - 8, - 97, - 71, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 128, - 132, - 1, - 81, - 9, - 97, - 71, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 71, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 128, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 71, - 192, - 131, - 1, - 82, - 128, - 97, - 56, - 128, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 71, - 224, - 131, - 1, - 82, - 128, - 97, - 71, - 192, - 131, - 1, - 81, - 97, - 71, - 96, - 132, - 1, - 81, - 8, - 97, - 72, - 0, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 160, - 132, - 1, - 81, - 9, - 97, - 72, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 72, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 160, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 72, - 96, - 131, - 1, - 82, - 128, - 97, - 56, - 160, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 72, - 128, - 131, - 1, - 82, - 128, - 97, - 72, - 96, - 131, - 1, - 81, - 97, - 72, - 0, - 132, - 1, - 81, - 8, - 97, - 72, - 160, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 45, - 192, - 132, - 1, - 81, - 9, - 97, - 72, - 192, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 45, - 224, - 132, - 1, - 81, - 9, - 97, - 72, - 224, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 46, - 0, - 132, - 1, - 81, - 9, - 97, - 73, - 0, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 46, - 32, - 132, - 1, - 81, - 9, - 97, - 73, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 46, - 64, - 132, - 1, - 81, - 9, - 97, - 73, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 73, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 192, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 73, - 128, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 73, - 160, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 72, - 192, - 132, - 1, - 81, - 9, - 97, - 73, - 192, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 72, - 224, - 132, - 1, - 81, - 9, - 97, - 73, - 224, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 73, - 0, - 132, - 1, - 81, - 9, - 97, - 74, - 0, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 73, - 32, - 132, - 1, - 81, - 9, - 97, - 74, - 32, - 131, - 1, - 82, - 128, - 97, - 73, - 128, - 131, - 1, - 81, - 97, - 72, - 160, - 132, - 1, - 81, - 8, - 97, - 74, - 64, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 224, - 132, - 1, - 81, - 9, - 97, - 74, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 74, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 224, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 74, - 160, - 131, - 1, - 82, - 128, - 97, - 56, - 224, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 74, - 192, - 131, - 1, - 82, - 128, - 97, - 74, - 160, - 131, - 1, - 81, - 97, - 74, - 64, - 132, - 1, - 81, - 8, - 97, - 74, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 57, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 75, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 63, - 224, - 132, - 1, - 81, - 9, - 97, - 75, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 64, - 96, - 132, - 1, - 81, - 9, - 97, - 75, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 65, - 0, - 132, - 1, - 81, - 9, - 97, - 75, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 65, - 160, - 132, - 1, - 81, - 9, - 97, - 75, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 66, - 64, - 132, - 1, - 81, - 9, - 97, - 75, - 160, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 66, - 224, - 132, - 1, - 81, - 9, - 97, - 75, - 192, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 67, - 128, - 132, - 1, - 81, - 9, - 97, - 75, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 68, - 32, - 132, - 1, - 81, - 9, - 97, - 76, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 68, - 192, - 132, - 1, - 81, - 9, - 97, - 76, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 69, - 96, - 132, - 1, - 81, - 9, - 97, - 76, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 70, - 0, - 132, - 1, - 81, - 9, - 97, - 76, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 70, - 160, - 132, - 1, - 81, - 9, - 97, - 76, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 71, - 64, - 132, - 1, - 81, - 9, - 97, - 76, - 160, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 71, - 224, - 132, - 1, - 81, - 9, - 97, - 76, - 192, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 72, - 128, - 132, - 1, - 81, - 9, - 97, - 76, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 160, - 132, - 1, - 81, - 9, - 97, - 77, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 192, - 132, - 1, - 81, - 9, - 97, - 77, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 224, - 132, - 1, - 81, - 9, - 97, - 77, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 0, - 132, - 1, - 81, - 9, - 97, - 77, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 32, - 132, - 1, - 81, - 9, - 97, - 77, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 192, - 132, - 1, - 81, - 9, - 97, - 77, - 160, - 131, - 1, - 82, - 128, - 97, - 75, - 0, - 131, - 1, - 81, - 97, - 63, - 64, - 132, - 1, - 81, - 8, - 97, - 77, - 192, - 131, - 1, - 82, - 128, - 97, - 48, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 77, - 224, - 131, - 1, - 82, - 128, - 97, - 11, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 78, - 0, - 131, - 1, - 82, - 96, - 1, - 97, - 78, - 32, - 131, - 1, - 129, - 129, - 82, - 96, - 2, - 97, - 78, - 64, - 133, - 1, - 82, - 97, - 77, - 192, - 132, - 1, - 81, - 97, - 78, - 96, - 133, - 1, - 82, - 132, - 145, - 144, - 96, - 64, - 144, - 96, - 96, - 129, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 78, - 32, - 130, - 1, - 81, - 97, - 78, - 128, - 131, - 1, - 82, - 97, - 78, - 64, - 130, - 1, - 81, - 97, - 78, - 160, - 131, - 1, - 82, - 96, - 128, - 130, - 1, - 81, - 97, - 78, - 192, - 131, - 1, - 82, - 96, - 160, - 130, - 1, - 81, - 97, - 78, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 78, - 128, - 133, - 1, - 96, - 128, - 97, - 78, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 96, - 192, - 130, - 1, - 81, - 97, - 79, - 0, - 131, - 1, - 82, - 96, - 224, - 130, - 1, - 81, - 97, - 79, - 32, - 131, - 1, - 82, - 97, - 58, - 192, - 130, - 1, - 81, - 97, - 79, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 0, - 133, - 1, - 96, - 96, - 97, - 79, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 78, - 128, - 130, - 1, - 81, - 97, - 79, - 96, - 131, - 1, - 82, - 97, - 78, - 160, - 130, - 1, - 81, - 97, - 79, - 128, - 131, - 1, - 82, - 97, - 79, - 0, - 130, - 1, - 81, - 97, - 79, - 160, - 131, - 1, - 82, - 97, - 79, - 32, - 130, - 1, - 81, - 97, - 79, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 96, - 133, - 1, - 96, - 128, - 97, - 79, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 0, - 130, - 1, - 81, - 97, - 79, - 224, - 131, - 1, - 82, - 97, - 1, - 32, - 130, - 1, - 81, - 97, - 80, - 0, - 131, - 1, - 82, - 97, - 60, - 224, - 130, - 1, - 81, - 97, - 80, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 224, - 133, - 1, - 96, - 96, - 97, - 79, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 79, - 96, - 130, - 1, - 81, - 97, - 80, - 64, - 131, - 1, - 82, - 97, - 79, - 128, - 130, - 1, - 81, - 97, - 80, - 96, - 131, - 1, - 82, - 97, - 79, - 224, - 130, - 1, - 81, - 97, - 80, - 128, - 131, - 1, - 82, - 97, - 80, - 0, - 130, - 1, - 81, - 97, - 80, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 80, - 64, - 133, - 1, - 96, - 128, - 97, - 80, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 32, - 130, - 1, - 81, - 97, - 80, - 192, - 131, - 1, - 82, - 97, - 3, - 64, - 130, - 1, - 81, - 97, - 80, - 224, - 131, - 1, - 82, - 97, - 61, - 0, - 130, - 1, - 81, - 97, - 81, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 80, - 192, - 133, - 1, - 96, - 96, - 97, - 80, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 80, - 64, - 130, - 1, - 81, - 97, - 81, - 32, - 131, - 1, - 82, - 97, - 80, - 96, - 130, - 1, - 81, - 97, - 81, - 64, - 131, - 1, - 82, - 97, - 80, - 192, - 130, - 1, - 81, - 97, - 81, - 96, - 131, - 1, - 82, - 97, - 80, - 224, - 130, - 1, - 81, - 97, - 81, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 81, - 32, - 133, - 1, - 96, - 128, - 97, - 81, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 96, - 130, - 1, - 81, - 97, - 81, - 160, - 131, - 1, - 82, - 97, - 3, - 128, - 130, - 1, - 81, - 97, - 81, - 192, - 131, - 1, - 82, - 97, - 61, - 32, - 130, - 1, - 81, - 97, - 81, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 81, - 160, - 133, - 1, - 96, - 96, - 97, - 81, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 81, - 32, - 130, - 1, - 81, - 97, - 82, - 0, - 131, - 1, - 82, - 97, - 81, - 64, - 130, - 1, - 81, - 97, - 82, - 32, - 131, - 1, - 82, - 97, - 81, - 160, - 130, - 1, - 81, - 97, - 82, - 64, - 131, - 1, - 82, - 97, - 81, - 192, - 130, - 1, - 81, - 97, - 82, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 0, - 133, - 1, - 96, - 128, - 97, - 82, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 2, - 224, - 130, - 1, - 81, - 97, - 82, - 128, - 131, - 1, - 82, - 97, - 3, - 0, - 130, - 1, - 81, - 97, - 82, - 160, - 131, - 1, - 82, - 97, - 62, - 32, - 130, - 1, - 81, - 97, - 82, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 128, - 133, - 1, - 96, - 96, - 97, - 82, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 82, - 0, - 130, - 1, - 81, - 97, - 82, - 224, - 131, - 1, - 82, - 97, - 82, - 32, - 130, - 1, - 81, - 97, - 83, - 0, - 131, - 1, - 82, - 97, - 82, - 128, - 130, - 1, - 81, - 97, - 83, - 32, - 131, - 1, - 82, - 97, - 82, - 160, - 130, - 1, - 81, - 97, - 83, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 224, - 133, - 1, - 96, - 128, - 97, - 82, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 160, - 130, - 1, - 81, - 97, - 83, - 96, - 131, - 1, - 82, - 97, - 1, - 192, - 130, - 1, - 81, - 97, - 83, - 128, - 131, - 1, - 82, - 97, - 63, - 32, - 130, - 1, - 81, - 97, - 83, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 96, - 133, - 1, - 96, - 96, - 97, - 83, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 82, - 224, - 130, - 1, - 81, - 97, - 83, - 192, - 131, - 1, - 82, - 97, - 83, - 0, - 130, - 1, - 81, - 97, - 83, - 224, - 131, - 1, - 82, - 97, - 83, - 96, - 130, - 1, - 81, - 97, - 84, - 0, - 131, - 1, - 82, - 97, - 83, - 128, - 130, - 1, - 81, - 97, - 84, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 192, - 133, - 1, - 96, - 128, - 97, - 83, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 224, - 130, - 1, - 81, - 97, - 84, - 64, - 131, - 1, - 82, - 97, - 2, - 0, - 130, - 1, - 81, - 97, - 84, - 96, - 131, - 1, - 82, - 97, - 75, - 32, - 130, - 1, - 81, - 97, - 84, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 84, - 64, - 133, - 1, - 96, - 96, - 97, - 84, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 83, - 192, - 130, - 1, - 81, - 97, - 84, - 160, - 131, - 1, - 82, - 97, - 83, - 224, - 130, - 1, - 81, - 97, - 84, - 192, - 131, - 1, - 82, - 97, - 84, - 64, - 130, - 1, - 81, - 97, - 84, - 224, - 131, - 1, - 82, - 97, - 84, - 96, - 130, - 1, - 81, - 97, - 85, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 84, - 160, - 133, - 1, - 96, - 128, - 97, - 84, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 6, - 85, - 214, - 41, - 121, - 220, - 6, - 45, - 193, - 232, - 193, - 83, - 52, - 191, - 23, - 207, - 92, - 126, - 99, - 82, - 33, - 156, - 11, - 208, - 176, - 204, - 3, - 149, - 152, - 217, - 166, - 105, - 97, - 85, - 32, - 131, - 1, - 82, - 127, - 1, - 149, - 137, - 211, - 0, - 47, - 106, - 13, - 237, - 70, - 166, - 144, - 83, - 240, - 192, - 94, - 122, - 124, - 164, - 83, - 57, - 179, - 210, - 186, - 232, - 93, - 0, - 242, - 106, - 192, - 243, - 62, - 97, - 85, - 64, - 131, - 1, - 82, - 97, - 75, - 64, - 130, - 1, - 81, - 97, - 85, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 85, - 32, - 133, - 1, - 96, - 96, - 97, - 85, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 84, - 160, - 130, - 1, - 81, - 97, - 85, - 128, - 131, - 1, - 82, - 97, - 84, - 192, - 130, - 1, - 81, - 97, - 85, - 160, - 131, - 1, - 82, - 97, - 85, - 32, - 130, - 1, - 81, - 97, - 85, - 192, - 131, - 1, - 82, - 97, - 85, - 64, - 130, - 1, - 81, - 97, - 85, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 85, - 128, - 133, - 1, - 96, - 128, - 97, - 85, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 30, - 171, - 153, - 149, - 146, - 56, - 82, - 8, - 180, - 42, - 18, - 220, - 192, - 71, - 118, - 62, - 229, - 207, - 18, - 5, - 46, - 180, - 176, - 217, - 167, - 162, - 134, - 224, - 67, - 243, - 223, - 159, - 97, - 86, - 0, - 131, - 1, - 82, - 127, - 24, - 136, - 126, - 179, - 198, - 70, - 255, - 212, - 150, - 18, - 38, - 201, - 27, - 172, - 150, - 97, - 0, - 71, - 152, - 177, - 252, - 106, - 57, - 196, - 63, - 154, - 109, - 29, - 3, - 118, - 113, - 148, - 97, - 86, - 32, - 131, - 1, - 82, - 97, - 75, - 96, - 130, - 1, - 81, - 97, - 86, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 0, - 133, - 1, - 96, - 96, - 97, - 86, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 85, - 128, - 130, - 1, - 81, - 97, - 86, - 96, - 131, - 1, - 82, - 97, - 85, - 160, - 130, - 1, - 81, - 97, - 86, - 128, - 131, - 1, - 82, - 97, - 86, - 0, - 130, - 1, - 81, - 97, - 86, - 160, - 131, - 1, - 82, - 97, - 86, - 32, - 130, - 1, - 81, - 97, - 86, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 96, - 133, - 1, - 96, - 128, - 97, - 86, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 7, - 104, - 6, - 5, - 139, - 2, - 225, - 181, - 233, - 155, - 47, - 46, - 142, - 238, - 97, - 49, - 148, - 248, - 223, - 115, - 72, - 22, - 89, - 245, - 147, - 139, - 170, - 205, - 100, - 228, - 215, - 184, - 97, - 86, - 224, - 131, - 1, - 82, - 127, - 5, - 174, - 129, - 100, - 75, - 36, - 77, - 206, - 234, - 83, - 80, - 168, - 74, - 121, - 203, - 240, - 161, - 153, - 187, - 214, - 193, - 250, - 217, - 136, - 116, - 35, - 248, - 200, - 4, - 142, - 96, - 57, - 97, - 87, - 0, - 131, - 1, - 82, - 97, - 75, - 128, - 130, - 1, - 81, - 97, - 87, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 224, - 133, - 1, - 96, - 96, - 97, - 86, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 86, - 96, - 130, - 1, - 81, - 97, - 87, - 64, - 131, - 1, - 82, - 97, - 86, - 128, - 130, - 1, - 81, - 97, - 87, - 96, - 131, - 1, - 82, - 97, - 86, - 224, - 130, - 1, - 81, - 97, - 87, - 128, - 131, - 1, - 82, - 97, - 87, - 0, - 130, - 1, - 81, - 97, - 87, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 87, - 64, - 133, - 1, - 96, - 128, - 97, - 87, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 4, - 56, - 135, - 63, - 192, - 2, - 49, - 174, - 82, - 126, - 252, - 247, - 77, - 144, - 146, - 245, - 5, - 157, - 250, - 5, - 39, - 92, - 190, - 115, - 129, - 233, - 72, - 254, - 59, - 123, - 97, - 216, - 97, - 87, - 192, - 131, - 1, - 82, - 127, - 3, - 192, - 243, - 20, - 201, - 52, - 3, - 121, - 43, - 168, - 110, - 195, - 132, - 27, - 48, - 128, - 242, - 247, - 205, - 9, - 44, - 107, - 203, - 99, - 44, - 219, - 194, - 18, - 42, - 19, - 205, - 239, - 97, - 87, - 224, - 131, - 1, - 82, - 97, - 75, - 160, - 130, - 1, - 81, - 97, - 88, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 87, - 192, - 133, - 1, - 96, - 96, - 97, - 87, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 87, - 64, - 130, - 1, - 81, - 97, - 88, - 32, - 131, - 1, - 82, - 97, - 87, - 96, - 130, - 1, - 81, - 97, - 88, - 64, - 131, - 1, - 82, - 97, - 87, - 192, - 130, - 1, - 81, - 97, - 88, - 96, - 131, - 1, - 82, - 97, - 87, - 224, - 130, - 1, - 81, - 97, - 88, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 88, - 32, - 133, - 1, - 96, - 128, - 97, - 88, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 43, - 18, - 177, - 50, - 166, - 38, - 26, - 214, - 2, - 73, - 20, - 117, - 153, - 202, - 224, - 213, - 179, - 84, - 126, - 81, - 13, - 234, - 187, - 166, - 85, - 38, - 209, - 48, - 240, - 79, - 36, - 2, - 97, - 88, - 160, - 131, - 1, - 82, - 127, - 19, - 227, - 192, - 44, - 224, - 15, - 107, - 126, - 0, - 213, - 176, - 153, - 237, - 165, - 241, - 21, - 89, - 86, - 174, - 131, - 137, - 154, - 45, - 89, - 206, - 252, - 176, - 13, - 173, - 102, - 167, - 246, - 97, - 88, - 192, - 131, - 1, - 82, - 97, - 75, - 192, - 130, - 1, - 81, - 97, - 88, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 88, - 160, - 133, - 1, - 96, - 96, - 97, - 88, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 88, - 32, - 130, - 1, - 81, - 97, - 89, - 0, - 131, - 1, - 82, - 97, - 88, - 64, - 130, - 1, - 81, - 97, - 89, - 32, - 131, - 1, - 82, - 97, - 88, - 160, - 130, - 1, - 81, - 97, - 89, - 64, - 131, - 1, - 82, - 97, - 88, - 192, - 130, - 1, - 81, - 97, - 89, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 0, - 133, - 1, - 96, - 128, - 97, - 89, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 14, - 216, - 51, - 112, - 39, - 126, - 15, - 211, - 94, - 130, - 88, - 221, - 86, - 48, - 206, - 12, - 227, - 73, - 31, - 223, - 126, - 22, - 109, - 41, - 55, - 69, - 99, - 91, - 12, - 196, - 235, - 165, - 97, - 89, - 128, - 131, - 1, - 82, - 127, - 3, - 153, - 78, - 126, - 119, - 173, - 88, - 7, - 43, - 120, - 117, - 119, - 0, - 171, - 11, - 121, - 36, - 127, - 46, - 70, - 43, - 12, - 246, - 165, - 161, - 139, - 96, - 116, - 20, - 192, - 149, - 219, - 97, - 89, - 160, - 131, - 1, - 82, - 97, - 75, - 224, - 130, - 1, - 81, - 97, - 89, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 128, - 133, - 1, - 96, - 96, - 97, - 89, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 89, - 0, - 130, - 1, - 81, - 97, - 89, - 224, - 131, - 1, - 82, - 97, - 89, - 32, - 130, - 1, - 81, - 97, - 90, - 0, - 131, - 1, - 82, - 97, - 89, - 128, - 130, - 1, - 81, - 97, - 90, - 32, - 131, - 1, - 82, - 97, - 89, - 160, - 130, - 1, - 81, - 97, - 90, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 224, - 133, - 1, - 96, - 128, - 97, - 89, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 35, - 186, - 75, - 196, - 155, - 170, - 181, - 99, - 233, - 213, - 191, - 7, - 218, - 35, - 26, - 68, - 150, - 211, - 91, - 107, - 199, - 130, - 219, - 189, - 118, - 19, - 95, - 228, - 76, - 49, - 203, - 207, - 97, - 90, - 96, - 131, - 1, - 82, - 127, - 40, - 184, - 128, - 151, - 231, - 237, - 241, - 178, - 144, - 79, - 108, - 37, - 193, - 227, - 12, - 160, - 227, - 140, - 116, - 165, - 33, - 37, - 178, - 153, - 92, - 76, - 240, - 167, - 80, - 104, - 56, - 84, - 97, - 90, - 128, - 131, - 1, - 82, - 97, - 76, - 0, - 130, - 1, - 81, - 97, - 90, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 90, - 96, - 133, - 1, - 96, - 96, - 97, - 90, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 89, - 224, - 130, - 1, - 81, - 97, - 90, - 192, - 131, - 1, - 82, - 97, - 90, - 0, - 130, - 1, - 81, - 97, - 90, - 224, - 131, - 1, - 82, - 97, - 90, - 96, - 130, - 1, - 81, - 97, - 91, - 0, - 131, - 1, - 82, - 97, - 90, - 128, - 130, - 1, - 81, - 97, - 91, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 90, - 192, - 133, - 1, - 96, - 128, - 97, - 90, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 23, - 220, - 187, - 160, - 187, - 226, - 210, - 69, - 102, - 222, - 98, - 9, - 152, - 246, - 47, - 245, - 78, - 165, - 48, - 42, - 218, - 106, - 235, - 24, - 2, - 139, - 97, - 180, - 220, - 25, - 187, - 211, - 97, - 91, - 64, - 131, - 1, - 82, - 127, - 14, - 31, - 144, - 128, - 7, - 165, - 194, - 204, - 147, - 68, - 38, - 194, - 109, - 231, - 32, - 108, - 83, - 250, - 16, - 199, - 157, - 99, - 239, - 82, - 238, - 145, - 191, - 181, - 104, - 199, - 47, - 189, - 97, - 91, - 96, - 131, - 1, - 82, - 97, - 76, - 32, - 130, - 1, - 81, - 97, - 91, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 91, - 64, - 133, - 1, - 96, - 96, - 97, - 91, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 90, - 192, - 130, - 1, - 81, - 97, - 91, - 160, - 131, - 1, - 82, - 97, - 90, - 224, - 130, - 1, - 81, - 97, - 91, - 192, - 131, - 1, - 82, - 97, - 91, - 64, - 130, - 1, - 81, - 97, - 91, - 224, - 131, - 1, - 82, - 97, - 91, - 96, - 130, - 1, - 81, - 97, - 92, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 91, - 160, - 133, - 1, - 96, - 128, - 97, - 91, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 44, - 120, - 35, - 249, - 156, - 178, - 173, - 183, - 22, - 190, - 203, - 150, - 9, - 20, - 255, - 161, - 214, - 226, - 242, - 87, - 135, - 95, - 221, - 3, - 194, - 190, - 229, - 46, - 245, - 113, - 212, - 30, - 97, - 92, - 32, - 131, - 1, - 82, - 127, - 9, - 171, - 131, - 235, - 198, - 128, - 62, - 101, - 178, - 230, - 131, - 28, - 135, - 6, - 217, - 161, - 52, - 246, - 177, - 207, - 111, - 110, - 197, - 194, - 105, - 122, - 254, - 224, - 149, - 50, - 14, - 225, - 97, - 92, - 64, - 131, - 1, - 82, - 97, - 76, - 64, - 130, - 1, - 81, - 97, - 92, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 92, - 32, - 133, - 1, - 96, - 96, - 97, - 92, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 91, - 160, - 130, - 1, - 81, - 97, - 92, - 128, - 131, - 1, - 82, - 97, - 91, - 192, - 130, - 1, - 81, - 97, - 92, - 160, - 131, - 1, - 82, - 97, - 92, - 32, - 130, - 1, - 81, - 97, - 92, - 192, - 131, - 1, - 82, - 97, - 92, - 64, - 130, - 1, - 81, - 97, - 92, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 92, - 128, - 133, - 1, - 96, - 128, - 97, - 92, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 45, - 193, - 44, - 32, - 81, - 82, - 191, - 172, - 195, - 84, - 200, - 56, - 34, - 85, - 113, - 23, - 44, - 33, - 94, - 1, - 166, - 77, - 230, - 162, - 202, - 102, - 101, - 199, - 9, - 55, - 172, - 88, - 97, - 93, - 0, - 131, - 1, - 82, - 127, - 4, - 73, - 235, - 82, - 159, - 0, - 56, - 162, - 189, - 47, - 108, - 11, - 98, - 19, - 167, - 4, - 136, - 182, - 155, - 71, - 157, - 144, - 169, - 83, - 87, - 158, - 76, - 157, - 69, - 98, - 27, - 133, - 97, - 93, - 32, - 131, - 1, - 82, - 97, - 76, - 96, - 130, - 1, - 81, - 97, - 93, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 0, - 133, - 1, - 96, - 96, - 97, - 93, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 92, - 128, - 130, - 1, - 81, - 97, - 93, - 96, - 131, - 1, - 82, - 97, - 92, - 160, - 130, - 1, - 81, - 97, - 93, - 128, - 131, - 1, - 82, - 97, - 93, - 0, - 130, - 1, - 81, - 97, - 93, - 160, - 131, - 1, - 82, - 97, - 93, - 32, - 130, - 1, - 81, - 97, - 93, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 96, - 133, - 1, - 96, - 128, - 97, - 93, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 9, - 162, - 171, - 57, - 19, - 164, - 119, - 15, - 213, - 15, - 107, - 169, - 236, - 76, - 224, - 179, - 23, - 139, - 84, - 215, - 191, - 202, - 91, - 66, - 254, - 126, - 142, - 28, - 229, - 207, - 96, - 169, - 97, - 93, - 224, - 131, - 1, - 82, - 127, - 19, - 236, - 49, - 249, - 64, - 38, - 86, - 156, - 75, - 183, - 110, - 44, - 76, - 234, - 163, - 230, - 82, - 84, - 56, - 255, - 180, - 167, - 166, - 156, - 222, - 97, - 246, - 215, - 123, - 147, - 186, - 215, - 97, - 94, - 0, - 131, - 1, - 82, - 97, - 76, - 128, - 130, - 1, - 81, - 97, - 94, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 224, - 133, - 1, - 96, - 96, - 97, - 93, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 93, - 96, - 130, - 1, - 81, - 97, - 94, - 64, - 131, - 1, - 82, - 97, - 93, - 128, - 130, - 1, - 81, - 97, - 94, - 96, - 131, - 1, - 82, - 97, - 93, - 224, - 130, - 1, - 81, - 97, - 94, - 128, - 131, - 1, - 82, - 97, - 94, - 0, - 130, - 1, - 81, - 97, - 94, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 94, - 64, - 133, - 1, - 96, - 128, - 97, - 94, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 7, - 67, - 234, - 64, - 241, - 64, - 132, - 219, - 38, - 115, - 33, - 114, - 131, - 170, - 5, - 63, - 152, - 104, - 150, - 238, - 124, - 24, - 31, - 82, - 17, - 132, - 66, - 233, - 156, - 69, - 41, - 116, - 97, - 94, - 192, - 131, - 1, - 82, - 127, - 2, - 3, - 227, - 73, - 58, - 37, - 148, - 236, - 229, - 125, - 34, - 204, - 117, - 221, - 8, - 26, - 198, - 130, - 113, - 236, - 124, - 117, - 129, - 83, - 207, - 210, - 21, - 43, - 251, - 92, - 25, - 227, - 97, - 94, - 224, - 131, - 1, - 82, - 97, - 76, - 160, - 130, - 1, - 81, - 97, - 95, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 94, - 192, - 133, - 1, - 96, - 96, - 97, - 94, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 94, - 64, - 130, - 1, - 81, - 97, - 95, - 32, - 131, - 1, - 82, - 97, - 94, - 96, - 130, - 1, - 81, - 97, - 95, - 64, - 131, - 1, - 82, - 97, - 94, - 192, - 130, - 1, - 81, - 97, - 95, - 96, - 131, - 1, - 82, - 97, - 94, - 224, - 130, - 1, - 81, - 97, - 95, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 95, - 32, - 133, - 1, - 96, - 128, - 97, - 95, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 2, - 169, - 167, - 125, - 142, - 111, - 111, - 216, - 159, - 51, - 186, - 86, - 254, - 69, - 246, - 245, - 201, - 7, - 229, - 11, - 162, - 140, - 221, - 65, - 152, - 172, - 251, - 86, - 46, - 178, - 17, - 3, - 97, - 95, - 160, - 131, - 1, - 82, - 127, - 35, - 171, - 238, - 104, - 216, - 60, - 45, - 102, - 50, - 87, - 110, - 94, - 149, - 202, - 1, - 166, - 30, - 94, - 62, - 109, - 148, - 56, - 194, - 172, - 100, - 40, - 200, - 182, - 237, - 254, - 42, - 186, - 97, - 95, - 192, - 131, - 1, - 82, - 97, - 76, - 192, - 130, - 1, - 81, - 97, - 95, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 95, - 160, - 133, - 1, - 96, - 96, - 97, - 95, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 95, - 32, - 130, - 1, - 81, - 97, - 96, - 0, - 131, - 1, - 82, - 97, - 95, - 64, - 130, - 1, - 81, - 97, - 96, - 32, - 131, - 1, - 82, - 97, - 95, - 160, - 130, - 1, - 81, - 97, - 96, - 64, - 131, - 1, - 82, - 97, - 95, - 192, - 130, - 1, - 81, - 97, - 96, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 0, - 133, - 1, - 96, - 128, - 97, - 96, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 44, - 243, - 109, - 54, - 191, - 172, - 190, - 26, - 141, - 140, - 98, - 106, - 239, - 167, - 90, - 192, - 254, - 180, - 107, - 114, - 89, - 137, - 168, - 230, - 250, - 190, - 208, - 116, - 191, - 159, - 106, - 247, - 97, - 96, - 128, - 131, - 1, - 82, - 127, - 6, - 15, - 222, - 211, - 237, - 94, - 197, - 109, - 158, - 0, - 100, - 215, - 60, - 71, - 34, - 69, - 164, - 196, - 182, - 236, - 55, - 30, - 152, - 8, - 105, - 43, - 247, - 242, - 89, - 211, - 183, - 48, - 97, - 96, - 160, - 131, - 1, - 82, - 97, - 76, - 224, - 130, - 1, - 81, - 97, - 96, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 128, - 133, - 1, - 96, - 96, - 97, - 96, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 96, - 0, - 130, - 1, - 81, - 97, - 96, - 224, - 131, - 1, - 82, - 97, - 96, - 32, - 130, - 1, - 81, - 97, - 97, - 0, - 131, - 1, - 82, - 97, - 96, - 128, - 130, - 1, - 81, - 97, - 97, - 32, - 131, - 1, - 82, - 97, - 96, - 160, - 130, - 1, - 81, - 97, - 97, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 224, - 133, - 1, - 96, - 128, - 97, - 96, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 64, - 130, - 1, - 81, - 97, - 97, - 96, - 131, - 1, - 82, - 97, - 4, - 96, - 130, - 1, - 81, - 97, - 97, - 128, - 131, - 1, - 82, - 97, - 77, - 0, - 130, - 1, - 81, - 97, - 97, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 97, - 96, - 133, - 1, - 96, - 96, - 97, - 97, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 96, - 224, - 130, - 1, - 81, - 97, - 97, - 192, - 131, - 1, - 82, - 97, - 97, - 0, - 130, - 1, - 81, - 97, - 97, - 224, - 131, - 1, - 82, - 97, - 97, - 96, - 130, - 1, - 81, - 97, - 98, - 0, - 131, - 1, - 82, - 97, - 97, - 128, - 130, - 1, - 81, - 97, - 98, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 97, - 192, - 133, - 1, - 96, - 128, - 97, - 97, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 128, - 130, - 1, - 81, - 97, - 98, - 64, - 131, - 1, - 82, - 97, - 4, - 160, - 130, - 1, - 81, - 97, - 98, - 96, - 131, - 1, - 82, - 97, - 77, - 32, - 130, - 1, - 81, - 97, - 98, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 98, - 64, - 133, - 1, - 96, - 96, - 97, - 98, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 97, - 192, - 130, - 1, - 81, - 97, - 98, - 160, - 131, - 1, - 82, - 97, - 97, - 224, - 130, - 1, - 81, - 97, - 98, - 192, - 131, - 1, - 82, - 97, - 98, - 64, - 130, - 1, - 81, - 97, - 98, - 224, - 131, - 1, - 82, - 97, - 98, - 96, - 130, - 1, - 81, - 97, - 99, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 98, - 160, - 133, - 1, - 96, - 128, - 97, - 98, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 192, - 130, - 1, - 81, - 97, - 99, - 32, - 131, - 1, - 82, - 97, - 4, - 224, - 130, - 1, - 81, - 97, - 99, - 64, - 131, - 1, - 82, - 97, - 77, - 64, - 130, - 1, - 81, - 97, - 99, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 99, - 32, - 133, - 1, - 96, - 96, - 97, - 99, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 98, - 160, - 130, - 1, - 81, - 97, - 99, - 128, - 131, - 1, - 82, - 97, - 98, - 192, - 130, - 1, - 81, - 97, - 99, - 160, - 131, - 1, - 82, - 97, - 99, - 32, - 130, - 1, - 81, - 97, - 99, - 192, - 131, - 1, - 82, - 97, - 99, - 64, - 130, - 1, - 81, - 97, - 99, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 99, - 128, - 133, - 1, - 96, - 128, - 97, - 99, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 5, - 0, - 130, - 1, - 81, - 97, - 100, - 0, - 131, - 1, - 82, - 97, - 5, - 32, - 130, - 1, - 81, - 97, - 100, - 32, - 131, - 1, - 82, - 97, - 77, - 96, - 130, - 1, - 81, - 97, - 100, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 0, - 133, - 1, - 96, - 96, - 97, - 100, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 99, - 128, - 130, - 1, - 81, - 97, - 100, - 96, - 131, - 1, - 82, - 97, - 99, - 160, - 130, - 1, - 81, - 97, - 100, - 128, - 131, - 1, - 82, - 97, - 100, - 0, - 130, - 1, - 81, - 97, - 100, - 160, - 131, - 1, - 82, - 97, - 100, - 32, - 130, - 1, - 81, - 97, - 100, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 96, - 133, - 1, - 96, - 128, - 97, - 100, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 5, - 64, - 130, - 1, - 81, - 97, - 100, - 224, - 131, - 1, - 82, - 97, - 5, - 96, - 130, - 1, - 81, - 97, - 101, - 0, - 131, - 1, - 82, - 97, - 77, - 128, - 130, - 1, - 81, - 97, - 101, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 224, - 133, - 1, - 96, - 96, - 97, - 100, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 100, - 96, - 130, - 1, - 81, - 97, - 101, - 64, - 131, - 1, - 82, - 97, - 100, - 128, - 130, - 1, - 81, - 97, - 101, - 96, - 131, - 1, - 82, - 97, - 100, - 224, - 130, - 1, - 81, - 97, - 101, - 128, - 131, - 1, - 82, - 97, - 101, - 0, - 130, - 1, - 81, - 97, - 101, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 101, - 64, - 133, - 1, - 96, - 128, - 97, - 101, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 160, - 130, - 1, - 81, - 97, - 101, - 192, - 131, - 1, - 82, - 97, - 3, - 192, - 130, - 1, - 81, - 97, - 101, - 224, - 131, - 1, - 82, - 97, - 77, - 160, - 130, - 1, - 81, - 97, - 102, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 101, - 192, - 133, - 1, - 96, - 96, - 97, - 101, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 101, - 64, - 130, - 1, - 81, - 97, - 102, - 32, - 131, - 1, - 82, - 97, - 101, - 96, - 130, - 1, - 81, - 97, - 102, - 64, - 131, - 1, - 82, - 97, - 101, - 192, - 130, - 1, - 81, - 97, - 102, - 96, - 131, - 1, - 82, - 97, - 101, - 224, - 130, - 1, - 81, - 97, - 102, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 102, - 32, - 133, - 1, - 96, - 128, - 97, - 102, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 10, - 192, - 130, - 1, - 81, - 97, - 102, - 160, - 131, - 1, - 82, - 97, - 10, - 224, - 130, - 1, - 81, - 97, - 102, - 192, - 131, - 1, - 82, - 97, - 77, - 224, - 130, - 1, - 81, - 129, - 3, - 97, - 102, - 224, - 131, - 1, - 82, - 80, - 129, - 96, - 1, - 96, - 64, - 97, - 102, - 160, - 132, - 1, - 96, - 96, - 97, - 102, - 160, - 134, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 102, - 32, - 129, - 1, - 81, - 97, - 103, - 0, - 130, - 1, - 82, - 97, - 102, - 64, - 129, - 1, - 81, - 97, - 103, - 32, - 130, - 1, - 82, - 97, - 102, - 160, - 129, - 1, - 81, - 97, - 103, - 64, - 130, - 1, - 82, - 97, - 102, - 192, - 129, - 1, - 81, - 97, - 103, - 96, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 0, - 132, - 1, - 96, - 128, - 97, - 103, - 0, - 134, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 11, - 96, - 129, - 1, - 81, - 97, - 103, - 128, - 130, - 1, - 82, - 97, - 11, - 128, - 129, - 1, - 81, - 97, - 103, - 160, - 130, - 1, - 82, - 97, - 78, - 0, - 129, - 1, - 81, - 97, - 103, - 192, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 128, - 132, - 1, - 96, - 96, - 97, - 103, - 128, - 134, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 103, - 0, - 129, - 1, - 81, - 97, - 103, - 224, - 130, - 1, - 82, - 97, - 103, - 32, - 129, - 1, - 81, - 97, - 104, - 0, - 130, - 1, - 82, - 97, - 103, - 128, - 129, - 1, - 81, - 97, - 104, - 32, - 130, - 1, - 82, - 97, - 103, - 160, - 129, - 1, - 81, - 97, - 104, - 64, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 224, - 132, - 1, - 96, - 128, - 97, - 103, - 224, - 134, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 103, - 224, - 129, - 1, - 81, - 97, - 104, - 96, - 130, - 1, - 82, - 97, - 104, - 0, - 129, - 1, - 81, - 97, - 104, - 128, - 130, - 1, - 82, - 127, - 25, - 142, - 147, - 147, - 146, - 13, - 72, - 58, - 114, - 96, - 191, - 183, - 49, - 251, - 93, - 37, - 241, - 170, - 73, - 51, - 53, - 169, - 231, - 18, - 151, - 228, - 133, - 183, - 174, - 243, - 18, - 194, - 97, - 104, - 160, - 130, - 1, - 82, - 127, - 24, - 0, - 222, - 239, - 18, - 31, - 30, - 118, - 66, - 106, - 0, - 102, - 94, - 92, - 68, - 121, - 103, - 67, - 34, - 212, - 247, - 94, - 218, - 221, - 70, - 222, - 189, - 92, - 217, - 146, - 246, - 237, - 97, - 104, - 192, - 130, - 1, - 82, - 127, - 9, - 6, - 137, - 208, - 88, - 95, - 240, - 117, - 236, - 158, - 153, - 173, - 105, - 12, - 51, - 149, - 188, - 75, - 49, - 51, - 112, - 179, - 142, - 243, - 85, - 172, - 218, - 220, - 209, - 34, - 151, - 91, - 97, - 104, - 224, - 130, - 1, - 82, - 127, - 18, - 200, - 94, - 165, - 219, - 140, - 109, - 235, - 74, - 171, - 113, - 128, - 141, - 203, - 64, - 143, - 227, - 209, - 231, - 105, - 12, - 67, - 211, - 123, - 76, - 230, - 204, - 1, - 102, - 250, - 125, - 170, - 97, - 105, - 0, - 130, - 1, - 82, - 97, - 11, - 96, - 129, - 1, - 81, - 97, - 105, - 32, - 130, - 1, - 82, - 97, - 11, - 128, - 129, - 1, - 81, - 97, - 105, - 64, - 130, - 1, - 82, - 127, - 38, - 24, - 106, - 45, - 101, - 238, - 77, - 47, - 156, - 154, - 91, - 145, - 248, - 101, - 151, - 211, - 95, - 25, - 44, - 209, - 32, - 202, - 247, - 233, - 53, - 216, - 68, - 61, - 25, - 56, - 226, - 61, - 97, - 105, - 96, - 130, - 1, - 82, - 127, - 48, - 68, - 31, - 209, - 181, - 211, - 55, - 4, - 130, - 196, - 33, - 82, - 168, - 137, - 144, - 39, - 113, - 105, - 137, - 166, - 153, - 108, - 37, - 53, - 188, - 159, - 127, - 238, - 138, - 174, - 247, - 158, - 97, - 105, - 128, - 130, - 1, - 82, - 127, - 22, - 243, - 99, - 241, - 3, - 200, - 13, - 123, - 188, - 138, - 211, - 198, - 134, - 126, - 8, - 34, - 187, - 198, - 0, - 11, - 233, - 26, - 70, - 137, - 117, - 92, - 125, - 244, - 2, - 33, - 193, - 69, - 97, - 105, - 160, - 130, - 1, - 82, - 127, - 43, - 28, - 187, - 62, - 82, - 30, - 223, - 90, - 98, - 45, - 130, - 118, - 42, - 68, - 165, - 230, - 63, - 30, - 80, - 179, - 50, - 215, - 17, - 84, - 164, - 167, - 149, - 141, - 96, - 17, - 222, - 255, - 97, - 105, - 192, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 32, - 97, - 104, - 96, - 132, - 1, - 97, - 1, - 128, - 97, - 104, - 96, - 134, - 1, - 96, - 8, - 90, - 250, - 97, - 104, - 96, - 147, - 144, - 147, - 1, - 81, - 96, - 1, - 20, - 146, - 20, - 22, - 22, - 145, - 80, - 80, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 64, - 81, - 128, - 97, - 105, - 192, - 1, - 96, - 64, - 82, - 128, - 97, - 3, - 78, - 144, - 96, - 32, - 130, - 2, - 128, - 54, - 131, - 55, - 80, - 145, - 146, - 145, - 80, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 65, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 64, - 81, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 78, - 92, - 87, - 97, - 78, - 92, - 97, - 78, - 29, - 86, - 91, - 96, - 64, - 82, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 78, - 117, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 78, - 143, - 87, - 97, - 78, - 143, - 97, - 78, - 29, - 86, - 91, - 97, - 78, - 162, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 97, - 78, - 51, - 86, - 91, - 129, - 129, - 82, - 132, - 96, - 32, - 131, - 134, - 1, - 1, - 17, - 21, - 97, - 78, - 183, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 96, - 32, - 133, - 1, - 96, - 32, - 131, - 1, - 55, - 96, - 0, - 145, - 129, - 1, - 96, - 32, - 1, - 145, - 144, - 145, - 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 64, - 131, - 133, - 3, - 18, - 21, - 97, - 78, - 231, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 78, - 255, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 133, - 1, - 145, - 80, - 133, - 96, - 31, - 131, - 1, - 18, - 97, - 79, - 19, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 32, - 130, - 130, - 17, - 21, - 97, - 79, - 39, - 87, - 97, - 79, - 39, - 97, - 78, - 29, - 86, - 91, - 129, - 96, - 5, - 27, - 97, - 79, - 54, - 130, - 130, - 1, - 97, - 78, - 51, - 86, - 91, - 146, - 131, - 82, - 132, - 129, - 1, - 130, - 1, - 146, - 130, - 129, - 1, - 144, - 138, - 133, - 17, - 21, - 97, - 79, - 80, - 87, - 96, - 0, - 128, - 253, - 91, - 149, - 131, - 1, - 149, - 91, - 132, - 135, - 16, - 21, - 97, - 79, - 110, - 87, - 134, - 53, - 130, - 82, - 149, - 131, - 1, - 149, - 144, - 131, - 1, - 144, - 97, - 79, - 85, - 86, - 91, - 151, - 80, - 80, - 80, - 134, - 1, - 53, - 146, - 80, - 80, - 128, - 130, - 17, - 21, - 97, - 79, - 133, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 79, - 146, - 133, - 130, - 134, - 1, - 97, - 78, - 100, - 86, - 91, - 145, - 80, - 80, - 146, - 80, - 146, - 144, - 80, - 86, - 254, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 212, - 178, - 220, - 135, - 152, - 186, - 177, - 123, - 101, - 162, - 231, - 44, - 60, - 209, - 59, - 7, - 180, - 165, - 138, - 174, - 54, - 106, - 119, - 120, - 72, - 82, - 51, - 60, - 117, - 170, - 120, - 185, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static SOLVENCYVERIFIER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 189, - 32, - 90, - 144, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 78, - 212, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 96, - 1, - 97, - 0, - 99, - 97, - 77, - 253, - 86, - 91, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 0, - 217, - 86, - 91, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 128, - 131, - 16, - 129, - 131, - 16, - 22, - 144, - 131, - 128, - 9, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 131, - 132, - 9, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 132, - 130, - 9, - 144, - 80, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 157, - 131, - 57, - 129, - 81, - 145, - 82, - 96, - 3, - 130, - 8, - 145, - 144, - 145, - 20, - 145, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 128, - 96, - 32, - 135, - 1, - 81, - 6, - 96, - 32, - 131, - 1, - 82, - 128, - 96, - 64, - 135, - 1, - 81, - 6, - 96, - 64, - 131, - 1, - 82, - 128, - 96, - 96, - 135, - 1, - 81, - 6, - 96, - 96, - 131, - 1, - 82, - 126, - 174, - 153, - 177, - 55, - 145, - 111, - 244, - 34, - 11, - 13, - 167, - 23, - 154, - 70, - 1, - 48, - 28, - 130, - 52, - 111, - 198, - 101, - 205, - 51, - 105, - 165, - 78, - 31, - 2, - 212, - 234, - 96, - 0, - 131, - 1, - 82, - 96, - 32, - 133, - 1, - 81, - 128, - 96, - 128, - 132, - 1, - 82, - 96, - 64, - 134, - 1, - 81, - 128, - 96, - 160, - 133, - 1, - 82, - 132, - 97, - 1, - 67, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 96, - 133, - 1, - 81, - 128, - 96, - 192, - 132, - 1, - 82, - 96, - 128, - 134, - 1, - 81, - 128, - 96, - 224, - 133, - 1, - 82, - 132, - 97, - 1, - 105, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 160, - 133, - 1, - 81, - 128, - 97, - 1, - 0, - 132, - 1, - 82, - 96, - 192, - 134, - 1, - 81, - 128, - 97, - 1, - 32, - 133, - 1, - 82, - 132, - 97, - 1, - 145, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 64, - 96, - 0, - 131, - 1, - 32, - 97, - 1, - 64, - 131, - 1, - 82, - 97, - 1, - 64, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 1, - 96, - 132, - 1, - 82, - 128, - 97, - 1, - 128, - 132, - 1, - 82, - 80, - 96, - 224, - 133, - 1, - 81, - 128, - 97, - 1, - 160, - 132, - 1, - 82, - 97, - 1, - 0, - 134, - 1, - 81, - 128, - 97, - 1, - 192, - 133, - 1, - 82, - 132, - 97, - 1, - 223, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 32, - 133, - 1, - 81, - 128, - 97, - 1, - 224, - 132, - 1, - 82, - 97, - 1, - 64, - 134, - 1, - 81, - 128, - 97, - 2, - 0, - 133, - 1, - 82, - 132, - 97, - 2, - 9, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 96, - 160, - 97, - 1, - 128, - 135, - 1, - 32, - 97, - 2, - 32, - 135, - 1, - 129, - 144, - 82, - 133, - 129, - 6, - 97, - 2, - 64, - 136, - 1, - 82, - 97, - 2, - 96, - 135, - 1, - 82, - 22, - 148, - 80, - 96, - 1, - 145, - 80, - 80, - 97, - 2, - 128, - 131, - 1, - 83, - 96, - 33, - 97, - 2, - 96, - 131, - 1, - 32, - 97, - 2, - 128, - 131, - 1, - 129, - 144, - 82, - 129, - 129, - 6, - 97, - 2, - 160, - 132, - 1, - 82, - 97, - 2, - 192, - 131, - 1, - 82, - 97, - 1, - 96, - 133, - 1, - 81, - 97, - 2, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 1, - 128, - 134, - 1, - 81, - 97, - 3, - 0, - 132, - 1, - 129, - 144, - 82, - 132, - 97, - 2, - 124, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 160, - 133, - 1, - 81, - 128, - 97, - 3, - 32, - 132, - 1, - 82, - 97, - 1, - 192, - 134, - 1, - 81, - 128, - 97, - 3, - 64, - 133, - 1, - 82, - 132, - 97, - 2, - 166, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 224, - 133, - 1, - 81, - 128, - 97, - 3, - 96, - 132, - 1, - 82, - 97, - 2, - 0, - 134, - 1, - 81, - 128, - 97, - 3, - 128, - 133, - 1, - 82, - 132, - 97, - 2, - 208, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 32, - 133, - 1, - 81, - 128, - 97, - 3, - 160, - 132, - 1, - 82, - 97, - 2, - 64, - 134, - 1, - 81, - 128, - 97, - 3, - 192, - 133, - 1, - 82, - 132, - 97, - 2, - 250, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 32, - 97, - 2, - 192, - 131, - 1, - 32, - 97, - 3, - 224, - 131, - 1, - 82, - 97, - 3, - 224, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 4, - 0, - 132, - 1, - 82, - 128, - 97, - 4, - 32, - 132, - 1, - 82, - 80, - 97, - 2, - 96, - 133, - 1, - 81, - 128, - 97, - 4, - 64, - 132, - 1, - 82, - 97, - 2, - 128, - 134, - 1, - 81, - 128, - 97, - 4, - 96, - 133, - 1, - 82, - 132, - 97, - 3, - 74, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 160, - 133, - 1, - 81, - 128, - 97, - 4, - 128, - 132, - 1, - 82, - 97, - 2, - 192, - 134, - 1, - 81, - 128, - 97, - 4, - 160, - 133, - 1, - 82, - 132, - 97, - 3, - 116, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 2, - 224, - 133, - 1, - 81, - 128, - 97, - 4, - 192, - 132, - 1, - 82, - 97, - 3, - 0, - 134, - 1, - 81, - 128, - 97, - 4, - 224, - 133, - 1, - 82, - 132, - 97, - 3, - 158, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 3, - 32, - 133, - 1, - 81, - 128, - 97, - 5, - 0, - 132, - 1, - 82, - 97, - 3, - 64, - 134, - 1, - 81, - 128, - 97, - 5, - 32, - 133, - 1, - 82, - 132, - 97, - 3, - 200, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 3, - 96, - 133, - 1, - 81, - 128, - 97, - 5, - 64, - 132, - 1, - 82, - 97, - 3, - 128, - 134, - 1, - 81, - 128, - 97, - 5, - 96, - 133, - 1, - 82, - 132, - 97, - 3, - 242, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 97, - 1, - 96, - 97, - 4, - 32, - 131, - 1, - 32, - 97, - 5, - 128, - 131, - 1, - 82, - 97, - 5, - 128, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 5, - 160, - 132, - 1, - 82, - 128, - 97, - 5, - 192, - 132, - 1, - 82, - 80, - 128, - 97, - 3, - 160, - 134, - 1, - 81, - 6, - 97, - 5, - 224, - 131, - 1, - 82, - 128, - 97, - 3, - 192, - 134, - 1, - 81, - 6, - 97, - 6, - 0, - 131, - 1, - 82, - 128, - 97, - 3, - 224, - 134, - 1, - 81, - 6, - 97, - 6, - 32, - 131, - 1, - 82, - 128, - 97, - 4, - 0, - 134, - 1, - 81, - 6, - 97, - 6, - 64, - 131, - 1, - 82, - 128, - 97, - 4, - 32, - 134, - 1, - 81, - 6, - 97, - 6, - 96, - 131, - 1, - 82, - 128, - 97, - 4, - 64, - 134, - 1, - 81, - 6, - 97, - 6, - 128, - 131, - 1, - 82, - 128, - 97, - 4, - 96, - 134, - 1, - 81, - 6, - 97, - 6, - 160, - 131, - 1, - 82, - 128, - 97, - 4, - 128, - 134, - 1, - 81, - 6, - 97, - 6, - 192, - 131, - 1, - 82, - 128, - 97, - 4, - 160, - 134, - 1, - 81, - 6, - 97, - 6, - 224, - 131, - 1, - 82, - 128, - 97, - 4, - 192, - 134, - 1, - 81, - 6, - 97, - 7, - 0, - 131, - 1, - 82, - 128, - 97, - 4, - 224, - 134, - 1, - 81, - 6, - 97, - 7, - 32, - 131, - 1, - 82, - 128, - 97, - 5, - 0, - 134, - 1, - 81, - 6, - 97, - 7, - 64, - 131, - 1, - 82, - 128, - 97, - 5, - 32, - 134, - 1, - 81, - 6, - 97, - 7, - 96, - 131, - 1, - 82, - 128, - 97, - 5, - 64, - 134, - 1, - 81, - 6, - 97, - 7, - 128, - 131, - 1, - 82, - 128, - 97, - 5, - 96, - 134, - 1, - 81, - 6, - 97, - 7, - 160, - 131, - 1, - 82, - 128, - 97, - 5, - 128, - 134, - 1, - 81, - 6, - 97, - 7, - 192, - 131, - 1, - 82, - 128, - 97, - 5, - 160, - 134, - 1, - 81, - 6, - 97, - 7, - 224, - 131, - 1, - 82, - 128, - 97, - 5, - 192, - 134, - 1, - 81, - 6, - 97, - 8, - 0, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 134, - 1, - 81, - 6, - 97, - 8, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 134, - 1, - 81, - 6, - 97, - 8, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 134, - 1, - 81, - 6, - 97, - 8, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 134, - 1, - 81, - 6, - 97, - 8, - 128, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 134, - 1, - 81, - 6, - 97, - 8, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 128, - 134, - 1, - 81, - 6, - 97, - 8, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 160, - 134, - 1, - 81, - 6, - 97, - 8, - 224, - 131, - 1, - 82, - 128, - 97, - 6, - 192, - 134, - 1, - 81, - 6, - 97, - 9, - 0, - 131, - 1, - 82, - 128, - 97, - 6, - 224, - 134, - 1, - 81, - 6, - 97, - 9, - 32, - 131, - 1, - 82, - 128, - 97, - 7, - 0, - 134, - 1, - 81, - 6, - 97, - 9, - 64, - 131, - 1, - 82, - 128, - 97, - 7, - 32, - 134, - 1, - 81, - 6, - 97, - 9, - 96, - 131, - 1, - 82, - 128, - 97, - 7, - 64, - 134, - 1, - 81, - 6, - 97, - 9, - 128, - 131, - 1, - 82, - 128, - 97, - 7, - 96, - 134, - 1, - 81, - 6, - 97, - 9, - 160, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 134, - 1, - 81, - 6, - 97, - 9, - 192, - 131, - 1, - 82, - 128, - 97, - 7, - 160, - 134, - 1, - 81, - 6, - 97, - 9, - 224, - 131, - 1, - 82, - 97, - 4, - 64, - 97, - 5, - 192, - 131, - 1, - 32, - 97, - 10, - 0, - 131, - 1, - 82, - 97, - 10, - 0, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 10, - 32, - 132, - 1, - 82, - 128, - 97, - 10, - 64, - 132, - 1, - 82, - 80, - 96, - 1, - 97, - 10, - 96, - 131, - 1, - 83, - 96, - 33, - 97, - 10, - 64, - 131, - 1, - 32, - 97, - 10, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 129, - 6, - 97, - 10, - 128, - 132, - 1, - 82, - 97, - 10, - 160, - 131, - 1, - 82, - 97, - 7, - 192, - 133, - 1, - 81, - 97, - 10, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 224, - 134, - 1, - 81, - 97, - 10, - 224, - 132, - 1, - 129, - 144, - 82, - 132, - 97, - 6, - 95, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 96, - 96, - 97, - 10, - 160, - 131, - 1, - 32, - 97, - 11, - 0, - 131, - 1, - 82, - 97, - 11, - 0, - 130, - 1, - 81, - 129, - 129, - 6, - 97, - 11, - 32, - 132, - 1, - 82, - 128, - 97, - 11, - 64, - 132, - 1, - 82, - 80, - 97, - 8, - 0, - 133, - 1, - 81, - 128, - 97, - 11, - 96, - 132, - 1, - 82, - 97, - 8, - 32, - 134, - 1, - 81, - 128, - 97, - 11, - 128, - 133, - 1, - 82, - 132, - 97, - 6, - 174, - 130, - 132, - 97, - 0, - 119, - 86, - 91, - 22, - 148, - 80, - 80, - 80, - 128, - 97, - 5, - 160, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 11, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 11, - 192, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 11, - 224, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 0, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 32, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 128, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 12, - 192, - 131, - 1, - 82, - 128, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 12, - 192, - 132, - 1, - 81, - 8, - 97, - 12, - 224, - 131, - 1, - 82, - 128, - 127, - 48, - 88, - 53, - 95, - 68, - 121, - 83, - 193, - 173, - 226, - 49, - 165, - 19, - 224, - 248, - 7, - 16, - 233, - 219, - 78, - 103, - 155, - 2, - 53, - 31, - 144, - 253, - 22, - 139, - 4, - 0, - 1, - 97, - 12, - 224, - 132, - 1, - 81, - 9, - 97, - 13, - 0, - 131, - 1, - 82, - 128, - 127, - 21, - 247, - 157, - 185, - 195, - 145, - 129, - 188, - 62, - 49, - 200, - 63, - 146, - 145, - 218, - 118, - 238, - 223, - 27, - 35, - 196, - 16, - 173, - 215, - 233, - 9, - 132, - 100, - 170, - 164, - 251, - 38, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 32, - 131, - 1, - 82, - 128, - 127, - 26, - 108, - 176, - 185, - 29, - 160, - 30, - 109, - 122, - 30, - 125, - 118, - 238, - 239, - 125, - 230, - 57, - 84, - 205, - 36, - 181, - 168, - 194, - 185, - 90, - 216, - 113, - 47, - 69, - 91, - 4, - 219, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 64, - 131, - 1, - 82, - 128, - 127, - 3, - 183, - 67, - 215, - 79, - 217, - 221, - 180, - 31, - 146, - 1, - 121, - 172, - 48, - 224, - 75, - 14, - 189, - 147, - 229, - 128, - 185, - 192, - 181, - 0, - 97, - 8, - 121, - 4, - 17, - 11, - 212, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 96, - 131, - 1, - 82, - 128, - 127, - 44, - 173, - 10, - 155, - 145, - 87, - 194, - 117, - 152, - 190, - 68, - 60, - 213, - 80, - 120, - 18, - 25, - 118, - 84, - 98, - 248, - 255, - 175, - 220, - 67, - 128, - 237, - 26, - 235, - 238, - 244, - 45, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 128, - 131, - 1, - 82, - 128, - 127, - 31, - 77, - 113, - 128, - 223, - 80, - 20, - 132, - 152, - 37, - 243, - 201, - 176, - 232, - 157, - 121, - 67, - 44, - 81, - 244, - 142, - 181, - 132, - 106, - 230, - 59, - 67, - 63, - 40, - 171, - 161, - 11, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 160, - 131, - 1, - 82, - 128, - 127, - 17, - 22, - 220, - 242, - 1, - 225, - 139, - 165, - 32, - 42, - 81, - 236, - 208, - 152, - 186, - 227, - 229, - 7, - 150, - 83, - 235, - 3, - 236, - 38, - 93, - 166, - 178, - 84, - 199, - 84, - 94, - 246, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 13, - 192, - 131, - 1, - 82, - 128, - 127, - 34, - 181, - 86, - 3, - 88, - 109, - 95, - 196, - 44, - 108, - 20, - 194, - 252, - 39, - 160, - 40, - 194, - 7, - 218, - 139, - 44, - 113, - 203, - 51, - 213, - 73, - 250, - 74, - 43, - 229, - 211, - 2, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 13, - 224, - 131, - 1, - 82, - 128, - 127, - 13, - 174, - 248, - 111, - 136, - 196, - 64, - 101, - 139, - 228, - 48, - 243, - 133, - 89, - 184, - 52, - 102, - 44, - 13, - 189, - 77, - 71, - 165, - 93, - 110, - 151, - 251, - 73, - 196, - 26, - 44, - 255, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 0, - 131, - 1, - 82, - 128, - 127, - 9, - 107, - 159, - 139, - 133, - 152, - 183, - 195, - 135, - 251, - 105, - 171, - 242, - 54, - 176, - 213, - 224, - 78, - 36, - 210, - 117, - 238, - 152, - 36, - 68, - 67, - 237, - 165, - 211, - 188, - 64, - 53, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 32, - 131, - 1, - 82, - 128, - 127, - 38, - 248, - 174, - 231, - 91, - 152, - 232, - 102, - 48, - 84, - 220, - 10, - 143, - 74, - 167, - 135, - 71, - 229, - 195, - 118, - 3, - 202, - 216, - 108, - 255, - 158, - 7, - 238, - 28, - 67, - 191, - 204, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 64, - 131, - 1, - 82, - 128, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 227, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 96, - 131, - 1, - 82, - 128, - 127, - 37, - 128, - 133, - 19, - 32, - 245, - 149, - 202, - 138, - 103, - 156, - 194, - 21, - 125, - 139, - 125, - 72, - 70, - 188, - 142, - 237, - 27, - 37, - 176, - 146, - 214, - 223, - 166, - 75, - 28, - 78, - 30, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 128, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 160, - 131, - 1, - 82, - 128, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 14, - 192, - 131, - 1, - 82, - 128, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 125, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 14, - 224, - 131, - 1, - 82, - 128, - 127, - 5, - 139, - 76, - 84, - 16, - 181, - 93, - 126, - 158, - 88, - 201, - 89, - 142, - 181, - 133, - 126, - 118, - 253, - 254, - 21, - 106, - 158, - 91, - 29, - 134, - 217, - 28, - 0, - 230, - 59, - 68, - 132, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 15, - 0, - 131, - 1, - 82, - 128, - 127, - 13, - 211, - 11, - 154, - 216, - 193, - 115, - 85, - 93, - 42, - 51, - 2, - 155, - 200, - 7, - 172, - 22, - 91, - 97, - 40, - 30, - 144, - 84, - 161, - 115, - 175, - 127, - 244, - 228, - 252, - 136, - 252, - 97, - 13, - 0, - 132, - 1, - 81, - 9, - 97, - 15, - 32, - 131, - 1, - 82, - 128, - 127, - 34, - 145, - 66, - 216, - 8, - 112, - 44, - 212, - 91, - 38, - 18, - 179, - 229, - 185, - 80, - 177, - 17, - 216, - 135, - 32, - 91, - 41, - 27, - 239, - 208, - 50, - 117, - 159, - 11, - 3, - 119, - 5, - 97, - 5, - 160, - 132, - 1, - 81, - 8, - 97, - 15, - 64, - 131, - 1, - 82, - 97, - 13, - 64, - 130, - 1, - 81, - 129, - 129, - 97, - 13, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 13, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 15, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 14, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 15, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 32, - 132, - 1, - 82, - 129, - 129, - 97, - 15, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 12, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 16, - 96, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 16, - 160, - 131, - 1, - 82, - 96, - 32, - 97, - 16, - 192, - 131, - 1, - 82, - 96, - 32, - 97, - 16, - 224, - 131, - 1, - 82, - 97, - 16, - 96, - 130, - 1, - 81, - 97, - 17, - 0, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 17, - 32, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 17, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 16, - 128, - 133, - 1, - 96, - 192, - 97, - 16, - 160, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 16, - 128, - 130, - 1, - 81, - 96, - 0, - 97, - 12, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 64, - 134, - 1, - 81, - 9, - 97, - 12, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 15, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 32, - 134, - 1, - 81, - 9, - 97, - 15, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 15, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 16, - 0, - 134, - 1, - 81, - 9, - 97, - 15, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 224, - 134, - 1, - 81, - 9, - 97, - 14, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 192, - 134, - 1, - 81, - 9, - 97, - 14, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 160, - 134, - 1, - 81, - 9, - 97, - 14, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 14, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 128, - 134, - 1, - 81, - 9, - 97, - 14, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 13, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 15, - 96, - 134, - 1, - 81, - 9, - 97, - 13, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 13, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 13, - 64, - 134, - 1, - 81, - 9, - 97, - 13, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 13, - 64, - 133, - 1, - 129, - 144, - 82, - 97, - 13, - 32, - 133, - 1, - 81, - 132, - 147, - 80, - 144, - 145, - 80, - 9, - 97, - 17, - 96, - 131, - 1, - 82, - 128, - 97, - 13, - 128, - 131, - 1, - 81, - 97, - 13, - 96, - 132, - 1, - 81, - 9, - 97, - 17, - 128, - 131, - 1, - 82, - 128, - 97, - 13, - 192, - 131, - 1, - 81, - 97, - 13, - 160, - 132, - 1, - 81, - 9, - 97, - 17, - 160, - 131, - 1, - 82, - 128, - 97, - 14, - 0, - 131, - 1, - 81, - 97, - 13, - 224, - 132, - 1, - 81, - 9, - 97, - 17, - 192, - 131, - 1, - 82, - 128, - 97, - 14, - 64, - 131, - 1, - 81, - 97, - 14, - 32, - 132, - 1, - 81, - 9, - 97, - 17, - 224, - 131, - 1, - 82, - 128, - 97, - 14, - 128, - 131, - 1, - 81, - 97, - 14, - 96, - 132, - 1, - 81, - 9, - 97, - 18, - 0, - 131, - 1, - 82, - 128, - 97, - 14, - 192, - 131, - 1, - 81, - 97, - 14, - 160, - 132, - 1, - 81, - 9, - 97, - 18, - 32, - 131, - 1, - 82, - 128, - 97, - 15, - 0, - 131, - 1, - 81, - 97, - 14, - 224, - 132, - 1, - 81, - 9, - 97, - 18, - 64, - 131, - 1, - 82, - 128, - 97, - 15, - 64, - 131, - 1, - 81, - 97, - 15, - 32, - 132, - 1, - 81, - 9, - 97, - 18, - 96, - 131, - 1, - 82, - 128, - 96, - 32, - 131, - 1, - 81, - 97, - 18, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 96, - 64, - 134, - 1, - 81, - 97, - 18, - 64, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 96, - 96, - 134, - 1, - 81, - 97, - 18, - 96, - 135, - 1, - 81, - 9, - 8, - 97, - 18, - 128, - 132, - 1, - 82, - 80, - 97, - 7, - 32, - 130, - 1, - 81, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 145, - 144, - 8, - 97, - 18, - 160, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 18, - 192, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 18, - 224, - 131, - 1, - 82, - 128, - 97, - 18, - 224, - 131, - 1, - 81, - 97, - 18, - 160, - 132, - 1, - 81, - 9, - 97, - 19, - 0, - 131, - 1, - 82, - 128, - 127, - 6, - 111, - 111, - 133, - 214, - 246, - 138, - 133, - 236, - 16, - 52, - 83, - 81, - 162, - 58, - 58, - 175, - 7, - 243, - 138, - 248, - 201, - 82, - 167, - 188, - 236, - 167, - 11, - 210, - 175, - 122, - 213, - 97, - 19, - 0, - 132, - 1, - 81, - 9, - 97, - 19, - 32, - 131, - 1, - 82, - 128, - 97, - 7, - 64, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 19, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 19, - 96, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 19, - 128, - 131, - 1, - 82, - 128, - 97, - 19, - 128, - 131, - 1, - 81, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 19, - 160, - 131, - 1, - 82, - 128, - 127, - 43, - 157, - 75, - 65, - 16, - 201, - 174, - 153, - 119, - 130, - 225, - 80, - 155, - 29, - 15, - 219, - 32, - 167, - 192, - 43, - 189, - 139, - 234, - 115, - 5, - 70, - 43, - 159, - 129, - 37, - 177, - 232, - 97, - 19, - 160, - 132, - 1, - 81, - 9, - 97, - 19, - 192, - 131, - 1, - 82, - 128, - 97, - 19, - 192, - 131, - 1, - 81, - 97, - 19, - 32, - 132, - 1, - 81, - 8, - 97, - 19, - 224, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 19, - 224, - 132, - 1, - 81, - 8, - 97, - 20, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 160, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 20, - 32, - 131, - 1, - 82, - 128, - 97, - 20, - 32, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 20, - 64, - 131, - 1, - 82, - 128, - 127, - 12, - 197, - 124, - 219, - 176, - 133, - 7, - 214, - 43, - 246, - 122, - 68, - 147, - 204, - 38, - 47, - 182, - 192, - 157, - 85, - 112, - 19, - 255, - 241, - 245, - 115, - 244, - 49, - 34, - 31, - 143, - 249, - 97, - 19, - 0, - 132, - 1, - 81, - 9, - 97, - 20, - 96, - 131, - 1, - 82, - 128, - 127, - 18, - 116, - 230, - 73, - 163, - 46, - 211, - 85, - 163, - 26, - 110, - 214, - 151, - 36, - 225, - 173, - 173, - 232, - 87, - 232, - 110, - 181, - 195, - 161, - 33, - 188, - 209, - 71, - 148, - 50, - 3, - 200, - 97, - 19, - 160, - 132, - 1, - 81, - 9, - 97, - 20, - 128, - 131, - 1, - 82, - 128, - 97, - 20, - 128, - 131, - 1, - 81, - 97, - 20, - 96, - 132, - 1, - 81, - 8, - 97, - 20, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 20, - 160, - 132, - 1, - 81, - 8, - 97, - 20, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 160, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 20, - 224, - 131, - 1, - 82, - 128, - 97, - 20, - 224, - 131, - 1, - 81, - 97, - 20, - 64, - 132, - 1, - 81, - 8, - 97, - 21, - 0, - 131, - 1, - 82, - 128, - 97, - 21, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 21, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 19, - 0, - 132, - 1, - 81, - 8, - 97, - 21, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 21, - 96, - 131, - 1, - 82, - 128, - 97, - 21, - 96, - 131, - 1, - 81, - 97, - 21, - 32, - 132, - 1, - 81, - 8, - 97, - 21, - 128, - 131, - 1, - 82, - 128, - 97, - 21, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 21, - 160, - 131, - 1, - 82, - 128, - 127, - 6, - 111, - 111, - 133, - 214, - 246, - 138, - 133, - 236, - 16, - 52, - 83, - 81, - 162, - 58, - 58, - 175, - 7, - 243, - 138, - 248, - 201, - 82, - 167, - 188, - 236, - 167, - 11, - 210, - 175, - 122, - 213, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 21, - 192, - 131, - 1, - 82, - 128, - 127, - 43, - 157, - 75, - 65, - 16, - 201, - 174, - 153, - 119, - 130, - 225, - 80, - 155, - 29, - 15, - 219, - 32, - 167, - 192, - 43, - 189, - 139, - 234, - 115, - 5, - 70, - 43, - 159, - 129, - 37, - 177, - 232, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 21, - 224, - 131, - 1, - 82, - 128, - 97, - 21, - 224, - 131, - 1, - 81, - 97, - 21, - 192, - 132, - 1, - 81, - 8, - 97, - 22, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 6, - 224, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 22, - 32, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 22, - 64, - 131, - 1, - 129, - 144, - 82, - 129, - 144, - 128, - 9, - 97, - 22, - 96, - 131, - 1, - 82, - 128, - 97, - 22, - 96, - 131, - 1, - 81, - 97, - 22, - 32, - 132, - 1, - 81, - 9, - 97, - 22, - 128, - 131, - 1, - 82, - 128, - 127, - 19, - 171, - 236, - 57, - 10, - 218, - 127, - 67, - 112, - 129, - 154, - 177, - 199, - 132, - 111, - 33, - 5, - 84, - 86, - 157, - 155, - 41, - 209, - 234, - 141, - 190, - 189, - 15, - 168, - 197, - 62, - 102, - 97, - 6, - 32, - 132, - 1, - 81, - 9, - 97, - 22, - 160, - 131, - 1, - 82, - 128, - 127, - 30, - 185, - 225, - 220, - 25, - 163, - 58, - 98, - 76, - 152, - 98, - 161, - 217, - 125, - 21, - 16, - 189, - 82, - 30, - 173, - 93, - 254, - 3, - 69, - 170, - 246, - 24, - 91, - 26, - 30, - 96, - 254, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 22, - 192, - 131, - 1, - 82, - 128, - 97, - 22, - 192, - 131, - 1, - 81, - 97, - 22, - 160, - 132, - 1, - 81, - 8, - 97, - 22, - 224, - 131, - 1, - 82, - 128, - 97, - 22, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 22, - 128, - 132, - 1, - 81, - 8, - 97, - 23, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 23, - 32, - 131, - 1, - 82, - 128, - 97, - 23, - 32, - 131, - 1, - 81, - 97, - 21, - 160, - 132, - 1, - 81, - 8, - 97, - 23, - 64, - 131, - 1, - 82, - 128, - 97, - 23, - 64, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 23, - 96, - 131, - 1, - 82, - 128, - 127, - 12, - 197, - 124, - 219, - 176, - 133, - 7, - 214, - 43, - 246, - 122, - 68, - 147, - 204, - 38, - 47, - 182, - 192, - 157, - 85, - 112, - 19, - 255, - 241, - 245, - 115, - 244, - 49, - 34, - 31, - 143, - 249, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 23, - 128, - 131, - 1, - 82, - 128, - 127, - 18, - 116, - 230, - 73, - 163, - 46, - 211, - 85, - 163, - 26, - 110, - 214, - 151, - 36, - 225, - 173, - 173, - 232, - 87, - 232, - 110, - 181, - 195, - 161, - 33, - 188, - 209, - 71, - 148, - 50, - 3, - 200, - 97, - 19, - 64, - 132, - 1, - 81, - 9, - 97, - 23, - 160, - 131, - 1, - 82, - 128, - 97, - 23, - 160, - 131, - 1, - 81, - 97, - 23, - 128, - 132, - 1, - 81, - 8, - 97, - 23, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 0, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 23, - 224, - 131, - 1, - 82, - 128, - 127, - 15, - 193, - 201, - 57, - 77, - 184, - 155, - 178, - 96, - 26, - 188, - 73, - 253, - 173, - 79, - 3, - 140, - 229, - 22, - 144, - 48, - 162, - 173, - 105, - 118, - 63, - 120, - 117, - 3, - 107, - 203, - 2, - 97, - 6, - 32, - 132, - 1, - 81, - 9, - 97, - 24, - 0, - 131, - 1, - 82, - 128, - 127, - 22, - 169, - 233, - 140, - 73, - 58, - 144, - 43, - 149, - 2, - 5, - 78, - 220, - 3, - 231, - 178, - 43, - 126, - 172, - 52, - 52, - 89, - 97, - 188, - 138, - 188, - 237, - 107, - 209, - 71, - 200, - 190, - 97, - 6, - 64, - 132, - 1, - 81, - 9, - 97, - 24, - 32, - 131, - 1, - 82, - 128, - 97, - 24, - 32, - 131, - 1, - 81, - 97, - 24, - 0, - 132, - 1, - 81, - 8, - 97, - 24, - 64, - 131, - 1, - 82, - 128, - 97, - 24, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 23, - 224, - 132, - 1, - 81, - 8, - 97, - 24, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 24, - 128, - 131, - 1, - 82, - 128, - 97, - 24, - 128, - 131, - 1, - 81, - 97, - 23, - 96, - 132, - 1, - 81, - 8, - 97, - 24, - 160, - 131, - 1, - 82, - 128, - 97, - 24, - 160, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 24, - 192, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 24, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 0, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 2, - 8, - 97, - 25, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 64, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 3, - 8, - 97, - 25, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 128, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 97, - 6, - 160, - 132, - 1, - 81, - 8, - 97, - 25, - 160, - 131, - 1, - 82, - 128, - 97, - 6, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 25, - 160, - 132, - 1, - 81, - 8, - 97, - 25, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 25, - 224, - 131, - 1, - 82, - 128, - 97, - 25, - 224, - 131, - 1, - 81, - 97, - 24, - 192, - 132, - 1, - 81, - 8, - 97, - 26, - 0, - 131, - 1, - 82, - 128, - 97, - 26, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 26, - 32, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 128, - 132, - 1, - 81, - 8, - 97, - 26, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 25, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 26, - 96, - 131, - 1, - 82, - 128, - 97, - 26, - 96, - 131, - 1, - 81, - 97, - 26, - 32, - 132, - 1, - 81, - 8, - 97, - 26, - 128, - 131, - 1, - 82, - 128, - 97, - 26, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 26, - 160, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 97, - 25, - 32, - 132, - 1, - 81, - 9, - 97, - 26, - 192, - 131, - 1, - 82, - 128, - 97, - 26, - 192, - 131, - 1, - 81, - 97, - 25, - 96, - 132, - 1, - 81, - 9, - 97, - 26, - 224, - 131, - 1, - 82, - 128, - 97, - 7, - 128, - 131, - 1, - 81, - 130, - 3, - 96, - 4, - 8, - 97, - 27, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 26, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 27, - 32, - 131, - 1, - 82, - 128, - 97, - 27, - 32, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 97, - 27, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 27, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 27, - 128, - 131, - 1, - 82, - 128, - 97, - 27, - 128, - 131, - 1, - 81, - 97, - 26, - 160, - 132, - 1, - 81, - 8, - 97, - 27, - 160, - 131, - 1, - 82, - 128, - 97, - 27, - 160, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 27, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 96, - 2, - 9, - 97, - 27, - 224, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 28, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 28, - 32, - 131, - 1, - 82, - 128, - 97, - 5, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 32, - 132, - 1, - 81, - 8, - 97, - 28, - 64, - 131, - 1, - 82, - 128, - 97, - 28, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 28, - 32, - 132, - 1, - 81, - 8, - 97, - 28, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 28, - 128, - 131, - 1, - 82, - 128, - 97, - 28, - 128, - 131, - 1, - 81, - 130, - 3, - 97, - 28, - 96, - 132, - 1, - 81, - 8, - 97, - 28, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 27, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 28, - 192, - 131, - 1, - 82, - 128, - 97, - 28, - 192, - 131, - 1, - 81, - 97, - 27, - 192, - 132, - 1, - 81, - 8, - 97, - 28, - 224, - 131, - 1, - 82, - 128, - 97, - 28, - 224, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 0, - 131, - 1, - 82, - 128, - 97, - 25, - 0, - 131, - 1, - 81, - 97, - 25, - 96, - 132, - 1, - 81, - 9, - 97, - 29, - 32, - 131, - 1, - 82, - 128, - 97, - 29, - 32, - 131, - 1, - 81, - 97, - 27, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 29, - 96, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 29, - 96, - 132, - 1, - 81, - 8, - 97, - 29, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 29, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 29, - 160, - 131, - 1, - 82, - 128, - 97, - 29, - 160, - 131, - 1, - 81, - 97, - 29, - 0, - 132, - 1, - 81, - 8, - 97, - 29, - 192, - 131, - 1, - 82, - 128, - 97, - 29, - 192, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 29, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 29, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 30, - 0, - 131, - 1, - 82, - 128, - 97, - 30, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 30, - 32, - 131, - 1, - 82, - 128, - 97, - 25, - 64, - 131, - 1, - 81, - 97, - 27, - 0, - 132, - 1, - 81, - 9, - 97, - 30, - 64, - 131, - 1, - 82, - 128, - 97, - 6, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 30, - 96, - 131, - 1, - 82, - 128, - 96, - 1, - 96, - 112, - 27, - 97, - 30, - 96, - 132, - 1, - 81, - 8, - 97, - 30, - 128, - 131, - 1, - 82, - 128, - 97, - 6, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 30, - 128, - 132, - 1, - 81, - 8, - 97, - 30, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 30, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 30, - 192, - 131, - 1, - 82, - 128, - 97, - 30, - 192, - 131, - 1, - 81, - 97, - 30, - 32, - 132, - 1, - 81, - 8, - 97, - 30, - 224, - 131, - 1, - 82, - 128, - 97, - 30, - 224, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 31, - 0, - 131, - 1, - 82, - 128, - 97, - 8, - 192, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 31, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 31, - 64, - 131, - 1, - 82, - 128, - 97, - 31, - 64, - 131, - 1, - 81, - 97, - 31, - 0, - 132, - 1, - 81, - 8, - 97, - 31, - 96, - 131, - 1, - 82, - 128, - 97, - 31, - 96, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 31, - 128, - 131, - 1, - 82, - 97, - 9, - 32, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 31, - 160, - 131, - 1, - 82, - 128, - 97, - 9, - 32, - 131, - 1, - 81, - 130, - 3, - 97, - 31, - 160, - 132, - 1, - 81, - 8, - 97, - 31, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 31, - 224, - 131, - 1, - 82, - 128, - 97, - 31, - 224, - 131, - 1, - 81, - 97, - 31, - 128, - 132, - 1, - 81, - 8, - 97, - 32, - 0, - 131, - 1, - 82, - 128, - 97, - 32, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 32, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 32, - 132, - 1, - 81, - 8, - 97, - 32, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 32, - 96, - 131, - 1, - 82, - 128, - 97, - 32, - 96, - 131, - 1, - 81, - 97, - 32, - 32, - 132, - 1, - 81, - 8, - 97, - 32, - 128, - 131, - 1, - 82, - 128, - 97, - 32, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 32, - 160, - 131, - 1, - 82, - 128, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 32, - 192, - 131, - 1, - 82, - 128, - 97, - 17, - 160, - 131, - 1, - 81, - 97, - 17, - 128, - 132, - 1, - 81, - 8, - 97, - 32, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 192, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 224, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 0, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 64, - 131, - 1, - 82, - 128, - 97, - 33, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 32, - 192, - 132, - 1, - 81, - 8, - 97, - 33, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 0, - 132, - 1, - 81, - 9, - 97, - 33, - 128, - 131, - 1, - 82, - 128, - 97, - 33, - 128, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 8, - 97, - 33, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 33, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 32, - 132, - 1, - 81, - 9, - 97, - 33, - 224, - 131, - 1, - 82, - 128, - 97, - 33, - 224, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 34, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 34, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 34, - 64, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 64, - 132, - 1, - 81, - 9, - 97, - 34, - 96, - 131, - 1, - 82, - 128, - 97, - 34, - 96, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 34, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 34, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 34, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 34, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 96, - 132, - 1, - 81, - 9, - 97, - 34, - 224, - 131, - 1, - 82, - 128, - 97, - 34, - 224, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 8, - 97, - 35, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 35, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 34, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 35, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 8, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 35, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 35, - 128, - 131, - 1, - 82, - 128, - 97, - 35, - 128, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 35, - 160, - 131, - 1, - 82, - 128, - 97, - 35, - 160, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 8, - 97, - 35, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 35, - 224, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 9, - 34, - 107, - 110, - 34, - 198, - 240, - 202, - 100, - 236, - 38, - 170, - 212, - 200, - 110, - 113, - 91, - 95, - 137, - 142, - 94, - 150, - 63, - 37, - 135, - 14, - 86, - 187, - 229, - 51, - 233, - 162, - 9, - 97, - 36, - 0, - 131, - 1, - 82, - 128, - 97, - 36, - 0, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 36, - 32, - 131, - 1, - 82, - 128, - 97, - 36, - 32, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 8, - 97, - 36, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 36, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 35, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 36, - 128, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 19, - 179, - 96, - 212, - 232, - 47, - 233, - 21, - 254, - 209, - 96, - 129, - 3, - 143, - 152, - 194, - 17, - 66, - 123, - 135, - 162, - 129, - 189, - 115, - 60, - 39, - 125, - 186, - 223, - 16, - 55, - 43, - 9, - 97, - 36, - 160, - 131, - 1, - 82, - 128, - 97, - 36, - 160, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 36, - 192, - 131, - 1, - 82, - 128, - 97, - 36, - 192, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 8, - 97, - 36, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 37, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 36, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 32, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 24, - 175, - 223, - 35, - 233, - 189, - 147, - 2, - 103, - 63, - 193, - 224, - 118, - 164, - 146, - 212, - 214, - 91, - 209, - 142, - 188, - 77, - 133, - 78, - 209, - 137, - 19, - 155, - 171, - 49, - 62, - 82, - 9, - 97, - 37, - 64, - 131, - 1, - 82, - 128, - 97, - 37, - 64, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 37, - 96, - 131, - 1, - 82, - 128, - 97, - 37, - 96, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 8, - 97, - 37, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 37, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 37, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 8, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 37, - 224, - 131, - 1, - 82, - 128, - 97, - 37, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 35, - 96, - 132, - 1, - 81, - 8, - 97, - 38, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 38, - 32, - 131, - 1, - 82, - 128, - 97, - 38, - 32, - 131, - 1, - 81, - 97, - 32, - 160, - 132, - 1, - 81, - 8, - 97, - 38, - 64, - 131, - 1, - 82, - 128, - 97, - 38, - 64, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 38, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 128, - 132, - 1, - 81, - 9, - 97, - 38, - 128, - 131, - 1, - 82, - 128, - 97, - 38, - 128, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 38, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 38, - 192, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 8, - 160, - 132, - 1, - 81, - 9, - 97, - 38, - 224, - 131, - 1, - 82, - 128, - 97, - 38, - 224, - 131, - 1, - 81, - 97, - 18, - 128, - 132, - 1, - 81, - 8, - 97, - 39, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 39, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 38, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 39, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 64, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 39, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 126, - 161, - 54, - 186, - 19, - 175, - 166, - 200, - 62, - 183, - 184, - 47, - 179, - 112, - 226, - 40, - 231, - 65, - 85, - 228, - 143, - 184, - 241, - 193, - 207, - 195, - 63, - 176, - 218, - 138, - 251, - 66, - 9, - 97, - 39, - 128, - 131, - 1, - 82, - 128, - 97, - 39, - 128, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 39, - 160, - 131, - 1, - 82, - 128, - 97, - 39, - 160, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 39, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 39, - 224, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 127, - 46, - 185, - 117, - 13, - 206, - 84, - 95, - 23, - 212, - 146, - 5, - 141, - 210, - 1, - 161, - 37, - 31, - 243, - 217, - 7, - 120, - 100, - 88, - 61, - 68, - 234, - 249, - 190, - 144, - 8, - 105, - 157, - 9, - 97, - 40, - 0, - 131, - 1, - 82, - 128, - 97, - 40, - 0, - 131, - 1, - 81, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 40, - 32, - 131, - 1, - 82, - 128, - 97, - 40, - 32, - 131, - 1, - 81, - 97, - 18, - 128, - 132, - 1, - 81, - 8, - 97, - 40, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 160, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 40, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 39, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 160, - 131, - 1, - 82, - 128, - 97, - 40, - 160, - 131, - 1, - 81, - 130, - 3, - 97, - 39, - 96, - 132, - 1, - 81, - 8, - 97, - 40, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 40, - 224, - 131, - 1, - 82, - 128, - 97, - 40, - 224, - 131, - 1, - 81, - 97, - 38, - 96, - 132, - 1, - 81, - 8, - 97, - 41, - 0, - 131, - 1, - 82, - 128, - 97, - 41, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 41, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 3, - 96, - 1, - 8, - 97, - 41, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 41, - 96, - 131, - 1, - 82, - 128, - 97, - 41, - 96, - 131, - 1, - 81, - 97, - 41, - 32, - 132, - 1, - 81, - 8, - 97, - 41, - 128, - 131, - 1, - 82, - 128, - 97, - 41, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 41, - 160, - 131, - 1, - 82, - 97, - 9, - 96, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 41, - 192, - 131, - 1, - 82, - 128, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 3, - 97, - 41, - 192, - 132, - 1, - 81, - 8, - 97, - 41, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 17, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 0, - 131, - 1, - 82, - 128, - 97, - 42, - 0, - 131, - 1, - 81, - 97, - 41, - 160, - 132, - 1, - 81, - 8, - 97, - 42, - 32, - 131, - 1, - 82, - 128, - 97, - 42, - 32, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 42, - 64, - 131, - 1, - 82, - 128, - 97, - 2, - 64, - 131, - 1, - 81, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 42, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 128, - 131, - 1, - 82, - 128, - 97, - 2, - 160, - 131, - 1, - 81, - 97, - 9, - 224, - 132, - 1, - 81, - 8, - 97, - 42, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 42, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 42, - 192, - 131, - 1, - 82, - 128, - 97, - 6, - 192, - 131, - 1, - 81, - 97, - 1, - 0, - 9, - 97, - 42, - 224, - 131, - 1, - 82, - 128, - 97, - 42, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 6, - 96, - 132, - 1, - 81, - 8, - 97, - 43, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 7, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 2, - 64, - 131, - 1, - 81, - 130, - 145, - 8, - 97, - 43, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 9, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 96, - 131, - 1, - 82, - 128, - 97, - 2, - 160, - 131, - 1, - 81, - 97, - 7, - 32, - 132, - 1, - 81, - 8, - 97, - 43, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 43, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 160, - 131, - 1, - 82, - 128, - 97, - 43, - 160, - 131, - 1, - 81, - 130, - 3, - 97, - 42, - 192, - 132, - 1, - 81, - 8, - 97, - 43, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 33, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 43, - 224, - 131, - 1, - 82, - 128, - 97, - 43, - 224, - 131, - 1, - 81, - 97, - 42, - 64, - 132, - 1, - 81, - 8, - 97, - 44, - 0, - 131, - 1, - 82, - 128, - 97, - 44, - 0, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 44, - 32, - 131, - 1, - 82, - 128, - 97, - 9, - 224, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 44, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 18, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 44, - 96, - 131, - 1, - 82, - 128, - 97, - 44, - 96, - 131, - 1, - 81, - 97, - 44, - 32, - 132, - 1, - 81, - 8, - 97, - 44, - 128, - 131, - 1, - 82, - 128, - 97, - 44, - 128, - 131, - 1, - 81, - 97, - 4, - 0, - 132, - 1, - 81, - 9, - 97, - 44, - 160, - 131, - 1, - 82, - 128, - 97, - 33, - 96, - 131, - 1, - 81, - 97, - 44, - 64, - 132, - 1, - 81, - 9, - 97, - 44, - 192, - 131, - 1, - 82, - 128, - 97, - 9, - 192, - 131, - 1, - 81, - 130, - 3, - 97, - 9, - 160, - 132, - 1, - 81, - 8, - 97, - 44, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 44, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 0, - 131, - 1, - 82, - 128, - 97, - 45, - 0, - 131, - 1, - 81, - 97, - 44, - 160, - 132, - 1, - 81, - 8, - 97, - 45, - 32, - 131, - 1, - 82, - 97, - 12, - 192, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 45, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 12, - 192, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 45, - 160, - 131, - 1, - 82, - 128, - 97, - 12, - 192, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 45, - 192, - 131, - 1, - 82, - 128, - 97, - 45, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 45, - 224, - 131, - 1, - 82, - 128, - 97, - 45, - 96, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 46, - 0, - 131, - 1, - 82, - 128, - 97, - 45, - 128, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 46, - 32, - 131, - 1, - 82, - 128, - 97, - 12, - 224, - 131, - 1, - 81, - 97, - 45, - 32, - 132, - 1, - 81, - 9, - 97, - 46, - 64, - 131, - 1, - 82, - 128, - 97, - 5, - 160, - 131, - 1, - 81, - 97, - 11, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 96, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 128, - 131, - 1, - 82, - 128, - 97, - 46, - 128, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 46, - 160, - 131, - 1, - 82, - 128, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 227, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 46, - 192, - 131, - 1, - 82, - 128, - 97, - 46, - 192, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 46, - 224, - 131, - 1, - 82, - 128, - 127, - 21, - 247, - 157, - 185, - 195, - 145, - 129, - 188, - 62, - 49, - 200, - 63, - 146, - 145, - 218, - 118, - 238, - 223, - 27, - 35, - 196, - 16, - 173, - 215, - 233, - 9, - 132, - 100, - 170, - 164, - 251, - 38, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 47, - 0, - 131, - 1, - 82, - 128, - 97, - 47, - 0, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 47, - 32, - 131, - 1, - 82, - 128, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 125, - 97, - 5, - 160, - 132, - 1, - 81, - 9, - 97, - 47, - 64, - 131, - 1, - 82, - 128, - 97, - 47, - 64, - 131, - 1, - 81, - 130, - 3, - 97, - 11, - 32, - 132, - 1, - 81, - 8, - 97, - 47, - 96, - 131, - 1, - 82, - 128, - 129, - 127, - 43, - 11, - 209, - 103, - 49, - 170, - 243, - 73, - 40, - 192, - 102, - 27, - 164, - 51, - 16, - 251, - 191, - 68, - 186, - 164, - 87, - 185, - 128, - 206, - 25, - 175, - 251, - 167, - 49, - 87, - 146, - 164, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 5, - 88, - 125, - 11, - 175, - 134, - 172, - 224, - 143, - 143, - 223, - 154, - 221, - 78, - 71, - 97, - 104, - 239, - 45, - 164, - 33, - 255, - 239, - 195, - 42, - 49, - 249, - 236, - 190, - 168, - 109, - 93, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 47, - 128, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 30, - 66, - 33, - 78, - 169, - 178, - 219, - 51, - 41, - 107, - 165, - 80, - 150, - 129, - 90, - 10, - 109, - 70, - 138, - 247, - 21, - 204, - 250, - 159, - 171, - 147, - 177, - 227, - 112, - 27, - 127, - 98, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 22, - 72, - 204, - 5, - 91, - 17, - 175, - 78, - 15, - 98, - 146, - 61, - 150, - 39, - 227, - 119, - 177, - 212, - 19, - 192, - 134, - 74, - 244, - 150, - 58, - 130, - 111, - 204, - 106, - 2, - 49, - 250, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 47, - 160, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 41, - 96, - 216, - 74, - 149, - 216, - 240, - 15, - 116, - 10, - 61, - 20, - 120, - 254, - 182, - 212, - 177, - 150, - 227, - 75, - 248, - 107, - 98, - 183, - 80, - 65, - 177, - 75, - 56, - 157, - 73, - 206, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 33, - 254, - 97, - 90, - 206, - 153, - 2, - 136, - 65, - 200, - 67, - 147, - 227, - 148, - 53, - 234, - 38, - 103, - 94, - 73, - 79, - 212, - 136, - 98, - 99, - 230, - 254, - 221, - 60, - 186, - 31, - 22, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 47, - 192, - 132, - 1, - 82, - 80, - 97, - 46, - 160, - 130, - 1, - 81, - 129, - 144, - 96, - 1, - 9, - 97, - 47, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 47, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 48, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 46, - 224, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 48, - 32, - 131, - 1, - 82, - 128, - 129, - 127, - 5, - 139, - 76, - 84, - 16, - 181, - 93, - 126, - 158, - 88, - 201, - 89, - 142, - 181, - 133, - 126, - 118, - 253, - 254, - 21, - 106, - 158, - 91, - 29, - 134, - 217, - 28, - 0, - 230, - 59, - 68, - 133, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 124, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 64, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 42, - 217, - 2, - 30, - 208, - 124, - 66, - 171, - 25, - 247, - 124, - 92, - 242, - 203, - 210, - 222, - 177, - 53, - 234, - 51, - 15, - 27, - 21, - 115, - 189, - 8, - 217, - 147, - 9, - 196, - 187, - 124, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 29, - 5, - 246, - 131, - 247, - 186, - 207, - 85, - 188, - 205, - 73, - 90, - 87, - 3, - 203, - 50, - 154, - 218, - 137, - 10, - 240, - 138, - 192, - 210, - 73, - 89, - 89, - 158, - 36, - 200, - 50, - 129, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 96, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 35, - 175, - 64, - 228, - 126, - 47, - 89, - 160, - 56, - 9, - 72, - 74, - 41, - 213, - 227, - 175, - 191, - 16, - 95, - 31, - 161, - 0, - 222, - 139, - 226, - 18, - 149, - 169, - 47, - 167, - 85, - 52, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 12, - 181, - 13, - 142, - 99, - 2, - 70, - 137, - 128, - 70, - 253, - 108, - 87, - 171, - 116, - 173, - 105, - 35, - 137, - 40, - 216, - 184, - 146, - 5, - 97, - 207, - 95, - 234, - 192, - 88, - 170, - 205, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 128, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 37, - 158, - 177, - 209, - 93, - 46, - 116, - 220, - 26, - 34, - 195, - 34, - 16, - 222, - 135, - 86, - 109, - 122, - 230, - 123, - 204, - 133, - 156, - 225, - 227, - 49, - 23, - 225, - 113, - 203, - 188, - 210, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 7, - 5, - 247, - 144, - 26, - 11, - 163, - 115, - 109, - 255, - 8, - 48, - 168, - 19, - 205, - 199, - 53, - 12, - 231, - 156, - 133, - 43, - 162, - 216, - 99, - 83, - 208, - 255, - 132, - 216, - 11, - 181, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 48, - 160, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 42, - 107, - 190, - 181, - 99, - 50, - 242, - 32, - 195, - 15, - 202, - 172, - 115, - 127, - 216, - 133, - 195, - 89, - 100, - 128, - 240, - 202, - 47, - 240, - 125, - 39, - 51, - 86, - 25, - 17, - 183, - 189, - 97, - 11, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 38, - 160, - 248, - 77, - 118, - 68, - 75, - 94, - 10, - 96, - 248, - 150, - 108, - 198, - 200, - 140, - 9, - 207, - 7, - 19, - 189, - 4, - 75, - 169, - 254, - 108, - 155, - 46, - 139, - 98, - 99, - 183, - 97, - 11, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 48, - 192, - 132, - 1, - 82, - 80, - 97, - 47, - 32, - 130, - 1, - 81, - 97, - 48, - 0, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 48, - 224, - 131, - 1, - 82, - 128, - 129, - 127, - 37, - 128, - 133, - 19, - 32, - 245, - 149, - 202, - 138, - 103, - 156, - 194, - 21, - 125, - 139, - 125, - 72, - 70, - 188, - 142, - 237, - 27, - 37, - 176, - 146, - 214, - 223, - 166, - 75, - 28, - 78, - 31, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 226, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 128, - 97, - 49, - 0, - 132, - 1, - 82, - 80, - 128, - 129, - 127, - 10, - 227, - 201, - 95, - 192, - 60, - 10, - 95, - 45, - 232, - 168, - 244, - 108, - 3, - 204, - 223, - 223, - 237, - 43, - 185, - 140, - 158, - 74, - 224, - 177, - 11, - 21, - 237, - 164, - 227, - 177, - 226, - 97, - 5, - 160, - 133, - 1, - 81, - 9, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 132, - 127, - 1, - 120, - 41, - 212, - 58, - 163, - 82, - 155, - 165, - 237, - 63, - 72, - 121, - 205, - 28, - 9, - 255, - 159, - 6, - 231, - 22, - 175, - 178, - 188, - 108, - 199, - 40, - 71, - 209, - 39, - 113, - 174, - 97, - 5, - 160, - 136, - 1, - 81, - 9, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 49, - 32, - 132, - 1, - 82, - 80, - 97, - 46, - 224, - 130, - 1, - 81, - 97, - 47, - 224, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 49, - 64, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 11, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 0, - 97, - 5, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 49, - 96, - 132, - 1, - 82, - 80, - 97, - 47, - 128, - 130, - 1, - 81, - 97, - 47, - 160, - 131, - 1, - 81, - 130, - 144, - 130, - 144, - 9, - 144, - 80, - 128, - 97, - 49, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 47, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 49, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 128, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 32, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 160, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 192, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 48, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 0, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 160, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 32, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 192, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 64, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 50, - 224, - 132, - 1, - 82, - 129, - 129, - 97, - 49, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 51, - 0, - 132, - 1, - 82, - 129, - 129, - 97, - 47, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 51, - 32, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 51, - 96, - 131, - 1, - 82, - 96, - 32, - 97, - 51, - 128, - 131, - 1, - 82, - 96, - 32, - 97, - 51, - 160, - 131, - 1, - 82, - 97, - 51, - 32, - 130, - 1, - 81, - 97, - 51, - 192, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 51, - 224, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 52, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 51, - 64, - 133, - 1, - 96, - 192, - 97, - 51, - 96, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 51, - 64, - 130, - 1, - 81, - 96, - 0, - 97, - 47, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 51, - 0, - 134, - 1, - 81, - 9, - 97, - 47, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 224, - 134, - 1, - 81, - 9, - 97, - 49, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 192, - 134, - 1, - 81, - 9, - 97, - 49, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 32, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 160, - 134, - 1, - 81, - 9, - 97, - 49, - 32, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 49, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 128, - 134, - 1, - 81, - 9, - 97, - 49, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 96, - 134, - 1, - 81, - 9, - 97, - 48, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 64, - 134, - 1, - 81, - 9, - 97, - 48, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 32, - 134, - 1, - 81, - 9, - 97, - 48, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 128, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 50, - 0, - 134, - 1, - 81, - 9, - 97, - 48, - 128, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 0, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 224, - 134, - 1, - 81, - 9, - 97, - 48, - 0, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 192, - 134, - 1, - 81, - 9, - 97, - 48, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 48, - 64, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 160, - 134, - 1, - 81, - 9, - 97, - 48, - 64, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 47, - 192, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 49, - 128, - 134, - 1, - 81, - 9, - 97, - 47, - 192, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 47, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 47, - 128, - 134, - 1, - 81, - 9, - 97, - 47, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 47, - 128, - 133, - 1, - 129, - 144, - 82, - 97, - 47, - 160, - 133, - 1, - 81, - 144, - 146, - 80, - 131, - 145, - 80, - 130, - 144, - 8, - 144, - 80, - 129, - 129, - 97, - 47, - 192, - 133, - 1, - 81, - 8, - 97, - 52, - 32, - 132, - 1, - 82, - 80, - 97, - 48, - 0, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 64, - 131, - 1, - 82, - 97, - 48, - 64, - 130, - 1, - 81, - 129, - 129, - 97, - 48, - 96, - 133, - 1, - 81, - 8, - 97, - 52, - 96, - 132, - 1, - 82, - 80, - 97, - 48, - 224, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 128, - 131, - 1, - 82, - 97, - 48, - 128, - 130, - 1, - 81, - 129, - 129, - 97, - 48, - 160, - 133, - 1, - 81, - 8, - 144, - 80, - 129, - 129, - 97, - 48, - 192, - 133, - 1, - 81, - 8, - 97, - 52, - 160, - 132, - 1, - 82, - 80, - 97, - 49, - 64, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 52, - 192, - 131, - 1, - 82, - 97, - 49, - 0, - 130, - 1, - 81, - 129, - 129, - 97, - 49, - 32, - 133, - 1, - 81, - 8, - 97, - 52, - 224, - 132, - 1, - 82, - 80, - 97, - 47, - 224, - 130, - 1, - 81, - 97, - 48, - 32, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 53, - 0, - 131, - 1, - 82, - 97, - 49, - 96, - 130, - 1, - 81, - 128, - 97, - 53, - 32, - 132, - 1, - 82, - 80, - 97, - 52, - 32, - 130, - 1, - 81, - 129, - 129, - 97, - 52, - 96, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 64, - 132, - 1, - 82, - 129, - 129, - 97, - 52, - 160, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 96, - 132, - 1, - 82, - 129, - 129, - 97, - 52, - 224, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 128, - 132, - 1, - 82, - 129, - 129, - 97, - 53, - 32, - 133, - 1, - 81, - 9, - 144, - 80, - 128, - 97, - 53, - 160, - 132, - 1, - 82, - 80, - 96, - 32, - 97, - 53, - 224, - 131, - 1, - 82, - 96, - 32, - 97, - 54, - 0, - 131, - 1, - 82, - 96, - 32, - 97, - 54, - 32, - 131, - 1, - 82, - 97, - 53, - 160, - 130, - 1, - 81, - 97, - 54, - 64, - 131, - 1, - 82, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 239, - 255, - 255, - 255, - 97, - 54, - 96, - 131, - 1, - 82, - 96, - 0, - 128, - 81, - 96, - 32, - 97, - 79, - 189, - 131, - 57, - 129, - 81, - 145, - 82, - 97, - 54, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 32, - 97, - 53, - 192, - 133, - 1, - 96, - 192, - 97, - 53, - 224, - 135, - 1, - 96, - 5, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 53, - 192, - 130, - 1, - 81, - 96, - 0, - 97, - 53, - 32, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 128, - 134, - 1, - 81, - 9, - 97, - 53, - 32, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 224, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 96, - 134, - 1, - 81, - 9, - 97, - 52, - 224, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 160, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 53, - 64, - 134, - 1, - 81, - 9, - 97, - 52, - 160, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 145, - 80, - 97, - 52, - 96, - 132, - 1, - 81, - 144, - 80, - 130, - 130, - 97, - 52, - 32, - 134, - 1, - 81, - 9, - 97, - 52, - 96, - 133, - 1, - 82, - 130, - 130, - 130, - 9, - 97, - 52, - 32, - 133, - 1, - 82, - 80, - 80, - 97, - 52, - 96, - 130, - 1, - 81, - 97, - 52, - 64, - 131, - 1, - 81, - 130, - 145, - 144, - 9, - 97, - 54, - 160, - 131, - 1, - 82, - 128, - 97, - 52, - 160, - 131, - 1, - 81, - 97, - 52, - 128, - 132, - 1, - 81, - 9, - 97, - 54, - 192, - 131, - 1, - 82, - 128, - 97, - 52, - 224, - 131, - 1, - 81, - 97, - 52, - 192, - 132, - 1, - 81, - 9, - 97, - 54, - 224, - 131, - 1, - 82, - 128, - 97, - 53, - 32, - 131, - 1, - 81, - 97, - 53, - 0, - 132, - 1, - 81, - 9, - 97, - 55, - 0, - 131, - 1, - 82, - 97, - 10, - 32, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 55, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 55, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 56, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 0, - 131, - 1, - 82, - 97, - 10, - 128, - 130, - 1, - 81, - 129, - 144, - 128, - 9, - 97, - 57, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 57, - 128, - 131, - 1, - 82, - 128, - 97, - 47, - 128, - 131, - 1, - 81, - 97, - 5, - 224, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 47, - 160, - 134, - 1, - 81, - 97, - 6, - 32, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 47, - 192, - 134, - 1, - 81, - 97, - 6, - 160, - 135, - 1, - 81, - 9, - 8, - 97, - 57, - 160, - 132, - 1, - 129, - 144, - 82, - 97, - 52, - 32, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 57, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 57, - 192, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 57, - 224, - 131, - 1, - 82, - 128, - 97, - 47, - 128, - 131, - 1, - 81, - 97, - 6, - 0, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 47, - 160, - 134, - 1, - 81, - 97, - 6, - 64, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 47, - 192, - 134, - 1, - 81, - 97, - 6, - 128, - 135, - 1, - 81, - 9, - 8, - 97, - 58, - 0, - 132, - 1, - 129, - 144, - 82, - 97, - 52, - 32, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 58, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 58, - 64, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 58, - 96, - 131, - 1, - 82, - 128, - 97, - 58, - 64, - 131, - 1, - 81, - 97, - 57, - 224, - 132, - 1, - 81, - 8, - 97, - 58, - 128, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 128, - 132, - 1, - 81, - 9, - 97, - 58, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 96, - 132, - 1, - 81, - 9, - 97, - 58, - 192, - 131, - 1, - 82, - 128, - 97, - 52, - 64, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 58, - 224, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 6, - 96, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 6, - 192, - 135, - 1, - 81, - 9, - 8, - 97, - 59, - 0, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 59, - 32, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 59, - 32, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 59, - 64, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 59, - 96, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 9, - 32, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 9, - 64, - 135, - 1, - 81, - 9, - 8, - 97, - 59, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 59, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 59, - 192, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 59, - 224, - 131, - 1, - 82, - 128, - 97, - 59, - 192, - 131, - 1, - 81, - 97, - 59, - 64, - 132, - 1, - 81, - 8, - 97, - 60, - 0, - 131, - 1, - 82, - 128, - 97, - 48, - 64, - 131, - 1, - 81, - 97, - 9, - 96, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 96, - 134, - 1, - 81, - 97, - 9, - 128, - 135, - 1, - 81, - 9, - 8, - 97, - 60, - 32, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 160, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 60, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 60, - 96, - 131, - 1, - 82, - 128, - 97, - 55, - 32, - 131, - 1, - 81, - 97, - 58, - 224, - 132, - 1, - 81, - 9, - 97, - 60, - 128, - 131, - 1, - 82, - 128, - 97, - 60, - 96, - 131, - 1, - 81, - 97, - 60, - 0, - 132, - 1, - 81, - 8, - 97, - 60, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 128, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 60, - 192, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 59, - 96, - 132, - 1, - 81, - 9, - 97, - 60, - 224, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 59, - 224, - 132, - 1, - 81, - 9, - 97, - 61, - 0, - 131, - 1, - 82, - 128, - 97, - 10, - 128, - 131, - 1, - 81, - 97, - 60, - 128, - 132, - 1, - 81, - 9, - 97, - 61, - 32, - 131, - 1, - 82, - 128, - 97, - 60, - 192, - 131, - 1, - 81, - 97, - 58, - 160, - 132, - 1, - 81, - 8, - 97, - 61, - 64, - 131, - 1, - 82, - 128, - 97, - 52, - 128, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 61, - 96, - 131, - 1, - 82, - 128, - 97, - 48, - 128, - 131, - 1, - 81, - 97, - 8, - 192, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 48, - 160, - 134, - 1, - 81, - 97, - 8, - 224, - 135, - 1, - 81, - 9, - 8, - 144, - 80, - 129, - 129, - 131, - 97, - 48, - 192, - 134, - 1, - 81, - 97, - 9, - 0, - 135, - 1, - 81, - 9, - 8, - 97, - 61, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 192, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 61, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 61, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 61, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 61, - 96, - 132, - 1, - 81, - 9, - 97, - 61, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 32, - 131, - 1, - 81, - 97, - 61, - 192, - 132, - 1, - 81, - 9, - 97, - 62, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 32, - 131, - 1, - 81, - 97, - 61, - 224, - 132, - 1, - 81, - 9, - 97, - 62, - 32, - 131, - 1, - 82, - 128, - 97, - 62, - 0, - 131, - 1, - 81, - 97, - 61, - 64, - 132, - 1, - 81, - 8, - 97, - 62, - 64, - 131, - 1, - 82, - 128, - 97, - 52, - 192, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 62, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 0, - 131, - 1, - 81, - 97, - 9, - 160, - 132, - 1, - 81, - 9, - 129, - 129, - 131, - 97, - 49, - 32, - 134, - 1, - 81, - 97, - 9, - 192, - 135, - 1, - 81, - 9, - 8, - 97, - 62, - 128, - 132, - 1, - 129, - 144, - 82, - 97, - 54, - 224, - 132, - 1, - 81, - 131, - 146, - 80, - 144, - 9, - 97, - 62, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 62, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 62, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 62, - 96, - 132, - 1, - 81, - 9, - 97, - 62, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 64, - 131, - 1, - 81, - 97, - 62, - 192, - 132, - 1, - 81, - 9, - 97, - 63, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 64, - 131, - 1, - 81, - 97, - 62, - 224, - 132, - 1, - 81, - 9, - 97, - 63, - 32, - 131, - 1, - 82, - 128, - 97, - 63, - 0, - 131, - 1, - 81, - 97, - 62, - 64, - 132, - 1, - 81, - 8, - 97, - 63, - 64, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 63, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 9, - 224, - 132, - 1, - 81, - 9, - 97, - 63, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 63, - 160, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 63, - 160, - 132, - 1, - 81, - 131, - 3, - 9, - 97, - 63, - 192, - 131, - 1, - 82, - 128, - 96, - 1, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 63, - 224, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 6, - 224, - 132, - 1, - 81, - 9, - 97, - 64, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 64, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 10, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 64, - 64, - 131, - 1, - 82, - 128, - 97, - 10, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 64, - 96, - 131, - 1, - 82, - 128, - 97, - 64, - 64, - 131, - 1, - 81, - 97, - 63, - 192, - 132, - 1, - 81, - 8, - 97, - 64, - 128, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 0, - 132, - 1, - 81, - 9, - 97, - 64, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 64, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 64, - 224, - 131, - 1, - 82, - 128, - 97, - 55, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 65, - 0, - 131, - 1, - 82, - 128, - 97, - 64, - 224, - 131, - 1, - 81, - 97, - 64, - 128, - 132, - 1, - 81, - 8, - 97, - 65, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 32, - 132, - 1, - 81, - 9, - 97, - 65, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 65, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 64, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 65, - 128, - 131, - 1, - 82, - 128, - 97, - 55, - 64, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 65, - 160, - 131, - 1, - 82, - 128, - 97, - 65, - 128, - 131, - 1, - 81, - 97, - 65, - 32, - 132, - 1, - 81, - 8, - 97, - 65, - 192, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 64, - 132, - 1, - 81, - 9, - 97, - 65, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 66, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 96, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 66, - 32, - 131, - 1, - 82, - 128, - 97, - 55, - 96, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 64, - 131, - 1, - 82, - 128, - 97, - 66, - 32, - 131, - 1, - 81, - 97, - 65, - 192, - 132, - 1, - 81, - 8, - 97, - 66, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 66, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 128, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 66, - 192, - 131, - 1, - 82, - 128, - 97, - 55, - 128, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 66, - 224, - 131, - 1, - 82, - 128, - 97, - 66, - 192, - 131, - 1, - 81, - 97, - 66, - 96, - 132, - 1, - 81, - 8, - 97, - 67, - 0, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 128, - 132, - 1, - 81, - 9, - 97, - 67, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 67, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 160, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 67, - 96, - 131, - 1, - 82, - 128, - 97, - 55, - 160, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 67, - 128, - 131, - 1, - 82, - 128, - 97, - 67, - 96, - 131, - 1, - 81, - 97, - 67, - 0, - 132, - 1, - 81, - 8, - 97, - 67, - 160, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 160, - 132, - 1, - 81, - 9, - 97, - 67, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 67, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 192, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 68, - 0, - 131, - 1, - 82, - 128, - 97, - 55, - 192, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 68, - 32, - 131, - 1, - 82, - 128, - 97, - 68, - 0, - 131, - 1, - 81, - 97, - 67, - 160, - 132, - 1, - 81, - 8, - 97, - 68, - 64, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 192, - 132, - 1, - 81, - 9, - 97, - 68, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 68, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 224, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 68, - 160, - 131, - 1, - 82, - 128, - 97, - 55, - 224, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 68, - 192, - 131, - 1, - 82, - 128, - 97, - 68, - 160, - 131, - 1, - 81, - 97, - 68, - 64, - 132, - 1, - 81, - 8, - 97, - 68, - 224, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 0, - 132, - 1, - 81, - 9, - 97, - 69, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 69, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 0, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 69, - 64, - 131, - 1, - 82, - 128, - 97, - 56, - 0, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 69, - 96, - 131, - 1, - 82, - 128, - 97, - 69, - 64, - 131, - 1, - 81, - 97, - 68, - 224, - 132, - 1, - 81, - 8, - 97, - 69, - 128, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 32, - 132, - 1, - 81, - 9, - 97, - 69, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 69, - 192, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 32, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 69, - 224, - 131, - 1, - 82, - 128, - 97, - 56, - 32, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 0, - 131, - 1, - 82, - 128, - 97, - 69, - 224, - 131, - 1, - 81, - 97, - 69, - 128, - 132, - 1, - 81, - 8, - 97, - 70, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 64, - 132, - 1, - 81, - 9, - 97, - 70, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 70, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 64, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 70, - 128, - 131, - 1, - 82, - 128, - 97, - 56, - 64, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 160, - 131, - 1, - 82, - 128, - 97, - 70, - 128, - 131, - 1, - 81, - 97, - 70, - 32, - 132, - 1, - 81, - 8, - 97, - 70, - 192, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 96, - 132, - 1, - 81, - 9, - 97, - 70, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 71, - 0, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 96, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 71, - 32, - 131, - 1, - 82, - 128, - 97, - 56, - 96, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 71, - 64, - 131, - 1, - 82, - 128, - 97, - 71, - 32, - 131, - 1, - 81, - 97, - 70, - 192, - 132, - 1, - 81, - 8, - 97, - 71, - 96, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 128, - 132, - 1, - 81, - 9, - 97, - 71, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 71, - 160, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 128, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 71, - 192, - 131, - 1, - 82, - 128, - 97, - 56, - 128, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 71, - 224, - 131, - 1, - 82, - 128, - 97, - 71, - 192, - 131, - 1, - 81, - 97, - 71, - 96, - 132, - 1, - 81, - 8, - 97, - 72, - 0, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 8, - 160, - 132, - 1, - 81, - 9, - 97, - 72, - 32, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 72, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 160, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 72, - 96, - 131, - 1, - 82, - 128, - 97, - 56, - 160, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 72, - 128, - 131, - 1, - 82, - 128, - 97, - 72, - 96, - 131, - 1, - 81, - 97, - 72, - 0, - 132, - 1, - 81, - 8, - 97, - 72, - 160, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 45, - 192, - 132, - 1, - 81, - 9, - 97, - 72, - 192, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 45, - 224, - 132, - 1, - 81, - 9, - 97, - 72, - 224, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 46, - 0, - 132, - 1, - 81, - 9, - 97, - 73, - 0, - 131, - 1, - 82, - 128, - 97, - 53, - 0, - 131, - 1, - 81, - 97, - 46, - 32, - 132, - 1, - 81, - 9, - 97, - 73, - 32, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 46, - 64, - 132, - 1, - 81, - 9, - 97, - 73, - 64, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 73, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 192, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 73, - 128, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 73, - 160, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 72, - 192, - 132, - 1, - 81, - 9, - 97, - 73, - 192, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 72, - 224, - 132, - 1, - 81, - 9, - 97, - 73, - 224, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 73, - 0, - 132, - 1, - 81, - 9, - 97, - 74, - 0, - 131, - 1, - 82, - 128, - 97, - 56, - 192, - 131, - 1, - 81, - 97, - 73, - 32, - 132, - 1, - 81, - 9, - 97, - 74, - 32, - 131, - 1, - 82, - 128, - 97, - 73, - 128, - 131, - 1, - 81, - 97, - 72, - 160, - 132, - 1, - 81, - 8, - 97, - 74, - 64, - 131, - 1, - 82, - 128, - 97, - 49, - 96, - 131, - 1, - 81, - 97, - 7, - 224, - 132, - 1, - 81, - 9, - 97, - 74, - 96, - 131, - 1, - 129, - 144, - 82, - 97, - 55, - 0, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 74, - 128, - 131, - 1, - 129, - 144, - 82, - 97, - 56, - 224, - 131, - 1, - 81, - 130, - 145, - 130, - 3, - 9, - 97, - 74, - 160, - 131, - 1, - 82, - 128, - 97, - 56, - 224, - 131, - 1, - 81, - 97, - 63, - 96, - 132, - 1, - 81, - 9, - 97, - 74, - 192, - 131, - 1, - 82, - 128, - 97, - 74, - 160, - 131, - 1, - 81, - 97, - 74, - 64, - 132, - 1, - 81, - 8, - 97, - 74, - 224, - 131, - 1, - 129, - 144, - 82, - 97, - 57, - 96, - 131, - 1, - 81, - 130, - 145, - 9, - 97, - 75, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 63, - 224, - 132, - 1, - 81, - 9, - 97, - 75, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 64, - 96, - 132, - 1, - 81, - 9, - 97, - 75, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 65, - 0, - 132, - 1, - 81, - 9, - 97, - 75, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 65, - 160, - 132, - 1, - 81, - 9, - 97, - 75, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 66, - 64, - 132, - 1, - 81, - 9, - 97, - 75, - 160, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 66, - 224, - 132, - 1, - 81, - 9, - 97, - 75, - 192, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 67, - 128, - 132, - 1, - 81, - 9, - 97, - 75, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 68, - 32, - 132, - 1, - 81, - 9, - 97, - 76, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 68, - 192, - 132, - 1, - 81, - 9, - 97, - 76, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 69, - 96, - 132, - 1, - 81, - 9, - 97, - 76, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 70, - 0, - 132, - 1, - 81, - 9, - 97, - 76, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 70, - 160, - 132, - 1, - 81, - 9, - 97, - 76, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 71, - 64, - 132, - 1, - 81, - 9, - 97, - 76, - 160, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 71, - 224, - 132, - 1, - 81, - 9, - 97, - 76, - 192, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 72, - 128, - 132, - 1, - 81, - 9, - 97, - 76, - 224, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 160, - 132, - 1, - 81, - 9, - 97, - 77, - 0, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 192, - 132, - 1, - 81, - 9, - 97, - 77, - 32, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 73, - 224, - 132, - 1, - 81, - 9, - 97, - 77, - 64, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 0, - 132, - 1, - 81, - 9, - 97, - 77, - 96, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 32, - 132, - 1, - 81, - 9, - 97, - 77, - 128, - 131, - 1, - 82, - 128, - 97, - 57, - 96, - 131, - 1, - 81, - 97, - 74, - 192, - 132, - 1, - 81, - 9, - 97, - 77, - 160, - 131, - 1, - 82, - 128, - 97, - 75, - 0, - 131, - 1, - 81, - 97, - 63, - 64, - 132, - 1, - 81, - 8, - 97, - 77, - 192, - 131, - 1, - 82, - 128, - 97, - 48, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 77, - 224, - 131, - 1, - 82, - 128, - 97, - 11, - 32, - 131, - 1, - 81, - 96, - 1, - 9, - 97, - 78, - 0, - 131, - 1, - 82, - 96, - 1, - 97, - 78, - 32, - 131, - 1, - 129, - 129, - 82, - 96, - 2, - 97, - 78, - 64, - 133, - 1, - 82, - 97, - 77, - 192, - 132, - 1, - 81, - 97, - 78, - 96, - 133, - 1, - 82, - 132, - 145, - 144, - 96, - 64, - 144, - 96, - 96, - 129, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 78, - 32, - 130, - 1, - 81, - 97, - 78, - 128, - 131, - 1, - 82, - 97, - 78, - 64, - 130, - 1, - 81, - 97, - 78, - 160, - 131, - 1, - 82, - 96, - 128, - 130, - 1, - 81, - 97, - 78, - 192, - 131, - 1, - 82, - 96, - 160, - 130, - 1, - 81, - 97, - 78, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 78, - 128, - 133, - 1, - 96, - 128, - 97, - 78, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 96, - 192, - 130, - 1, - 81, - 97, - 79, - 0, - 131, - 1, - 82, - 96, - 224, - 130, - 1, - 81, - 97, - 79, - 32, - 131, - 1, - 82, - 97, - 58, - 192, - 130, - 1, - 81, - 97, - 79, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 0, - 133, - 1, - 96, - 96, - 97, - 79, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 78, - 128, - 130, - 1, - 81, - 97, - 79, - 96, - 131, - 1, - 82, - 97, - 78, - 160, - 130, - 1, - 81, - 97, - 79, - 128, - 131, - 1, - 82, - 97, - 79, - 0, - 130, - 1, - 81, - 97, - 79, - 160, - 131, - 1, - 82, - 97, - 79, - 32, - 130, - 1, - 81, - 97, - 79, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 96, - 133, - 1, - 96, - 128, - 97, - 79, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 0, - 130, - 1, - 81, - 97, - 79, - 224, - 131, - 1, - 82, - 97, - 1, - 32, - 130, - 1, - 81, - 97, - 80, - 0, - 131, - 1, - 82, - 97, - 60, - 224, - 130, - 1, - 81, - 97, - 80, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 79, - 224, - 133, - 1, - 96, - 96, - 97, - 79, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 79, - 96, - 130, - 1, - 81, - 97, - 80, - 64, - 131, - 1, - 82, - 97, - 79, - 128, - 130, - 1, - 81, - 97, - 80, - 96, - 131, - 1, - 82, - 97, - 79, - 224, - 130, - 1, - 81, - 97, - 80, - 128, - 131, - 1, - 82, - 97, - 80, - 0, - 130, - 1, - 81, - 97, - 80, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 80, - 64, - 133, - 1, - 96, - 128, - 97, - 80, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 32, - 130, - 1, - 81, - 97, - 80, - 192, - 131, - 1, - 82, - 97, - 3, - 64, - 130, - 1, - 81, - 97, - 80, - 224, - 131, - 1, - 82, - 97, - 61, - 0, - 130, - 1, - 81, - 97, - 81, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 80, - 192, - 133, - 1, - 96, - 96, - 97, - 80, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 80, - 64, - 130, - 1, - 81, - 97, - 81, - 32, - 131, - 1, - 82, - 97, - 80, - 96, - 130, - 1, - 81, - 97, - 81, - 64, - 131, - 1, - 82, - 97, - 80, - 192, - 130, - 1, - 81, - 97, - 81, - 96, - 131, - 1, - 82, - 97, - 80, - 224, - 130, - 1, - 81, - 97, - 81, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 81, - 32, - 133, - 1, - 96, - 128, - 97, - 81, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 96, - 130, - 1, - 81, - 97, - 81, - 160, - 131, - 1, - 82, - 97, - 3, - 128, - 130, - 1, - 81, - 97, - 81, - 192, - 131, - 1, - 82, - 97, - 61, - 32, - 130, - 1, - 81, - 97, - 81, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 81, - 160, - 133, - 1, - 96, - 96, - 97, - 81, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 81, - 32, - 130, - 1, - 81, - 97, - 82, - 0, - 131, - 1, - 82, - 97, - 81, - 64, - 130, - 1, - 81, - 97, - 82, - 32, - 131, - 1, - 82, - 97, - 81, - 160, - 130, - 1, - 81, - 97, - 82, - 64, - 131, - 1, - 82, - 97, - 81, - 192, - 130, - 1, - 81, - 97, - 82, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 0, - 133, - 1, - 96, - 128, - 97, - 82, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 2, - 224, - 130, - 1, - 81, - 97, - 82, - 128, - 131, - 1, - 82, - 97, - 3, - 0, - 130, - 1, - 81, - 97, - 82, - 160, - 131, - 1, - 82, - 97, - 62, - 32, - 130, - 1, - 81, - 97, - 82, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 128, - 133, - 1, - 96, - 96, - 97, - 82, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 82, - 0, - 130, - 1, - 81, - 97, - 82, - 224, - 131, - 1, - 82, - 97, - 82, - 32, - 130, - 1, - 81, - 97, - 83, - 0, - 131, - 1, - 82, - 97, - 82, - 128, - 130, - 1, - 81, - 97, - 83, - 32, - 131, - 1, - 82, - 97, - 82, - 160, - 130, - 1, - 81, - 97, - 83, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 82, - 224, - 133, - 1, - 96, - 128, - 97, - 82, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 160, - 130, - 1, - 81, - 97, - 83, - 96, - 131, - 1, - 82, - 97, - 1, - 192, - 130, - 1, - 81, - 97, - 83, - 128, - 131, - 1, - 82, - 97, - 63, - 32, - 130, - 1, - 81, - 97, - 83, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 96, - 133, - 1, - 96, - 96, - 97, - 83, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 82, - 224, - 130, - 1, - 81, - 97, - 83, - 192, - 131, - 1, - 82, - 97, - 83, - 0, - 130, - 1, - 81, - 97, - 83, - 224, - 131, - 1, - 82, - 97, - 83, - 96, - 130, - 1, - 81, - 97, - 84, - 0, - 131, - 1, - 82, - 97, - 83, - 128, - 130, - 1, - 81, - 97, - 84, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 83, - 192, - 133, - 1, - 96, - 128, - 97, - 83, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 1, - 224, - 130, - 1, - 81, - 97, - 84, - 64, - 131, - 1, - 82, - 97, - 2, - 0, - 130, - 1, - 81, - 97, - 84, - 96, - 131, - 1, - 82, - 97, - 75, - 32, - 130, - 1, - 81, - 97, - 84, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 84, - 64, - 133, - 1, - 96, - 96, - 97, - 84, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 83, - 192, - 130, - 1, - 81, - 97, - 84, - 160, - 131, - 1, - 82, - 97, - 83, - 224, - 130, - 1, - 81, - 97, - 84, - 192, - 131, - 1, - 82, - 97, - 84, - 64, - 130, - 1, - 81, - 97, - 84, - 224, - 131, - 1, - 82, - 97, - 84, - 96, - 130, - 1, - 81, - 97, - 85, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 84, - 160, - 133, - 1, - 96, - 128, - 97, - 84, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 6, - 85, - 214, - 41, - 121, - 220, - 6, - 45, - 193, - 232, - 193, - 83, - 52, - 191, - 23, - 207, - 92, - 126, - 99, - 82, - 33, - 156, - 11, - 208, - 176, - 204, - 3, - 149, - 152, - 217, - 166, - 105, - 97, - 85, - 32, - 131, - 1, - 82, - 127, - 1, - 149, - 137, - 211, - 0, - 47, - 106, - 13, - 237, - 70, - 166, - 144, - 83, - 240, - 192, - 94, - 122, - 124, - 164, - 83, - 57, - 179, - 210, - 186, - 232, - 93, - 0, - 242, - 106, - 192, - 243, - 62, - 97, - 85, - 64, - 131, - 1, - 82, - 97, - 75, - 64, - 130, - 1, - 81, - 97, - 85, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 85, - 32, - 133, - 1, - 96, - 96, - 97, - 85, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 84, - 160, - 130, - 1, - 81, - 97, - 85, - 128, - 131, - 1, - 82, - 97, - 84, - 192, - 130, - 1, - 81, - 97, - 85, - 160, - 131, - 1, - 82, - 97, - 85, - 32, - 130, - 1, - 81, - 97, - 85, - 192, - 131, - 1, - 82, - 97, - 85, - 64, - 130, - 1, - 81, - 97, - 85, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 85, - 128, - 133, - 1, - 96, - 128, - 97, - 85, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 30, - 171, - 153, - 149, - 146, - 56, - 82, - 8, - 180, - 42, - 18, - 220, - 192, - 71, - 118, - 62, - 229, - 207, - 18, - 5, - 46, - 180, - 176, - 217, - 167, - 162, - 134, - 224, - 67, - 243, - 223, - 159, - 97, - 86, - 0, - 131, - 1, - 82, - 127, - 24, - 136, - 126, - 179, - 198, - 70, - 255, - 212, - 150, - 18, - 38, - 201, - 27, - 172, - 150, - 97, - 0, - 71, - 152, - 177, - 252, - 106, - 57, - 196, - 63, - 154, - 109, - 29, - 3, - 118, - 113, - 148, - 97, - 86, - 32, - 131, - 1, - 82, - 97, - 75, - 96, - 130, - 1, - 81, - 97, - 86, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 0, - 133, - 1, - 96, - 96, - 97, - 86, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 85, - 128, - 130, - 1, - 81, - 97, - 86, - 96, - 131, - 1, - 82, - 97, - 85, - 160, - 130, - 1, - 81, - 97, - 86, - 128, - 131, - 1, - 82, - 97, - 86, - 0, - 130, - 1, - 81, - 97, - 86, - 160, - 131, - 1, - 82, - 97, - 86, - 32, - 130, - 1, - 81, - 97, - 86, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 96, - 133, - 1, - 96, - 128, - 97, - 86, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 7, - 104, - 6, - 5, - 139, - 2, - 225, - 181, - 233, - 155, - 47, - 46, - 142, - 238, - 97, - 49, - 148, - 248, - 223, - 115, - 72, - 22, - 89, - 245, - 147, - 139, - 170, - 205, - 100, - 228, - 215, - 184, - 97, - 86, - 224, - 131, - 1, - 82, - 127, - 5, - 174, - 129, - 100, - 75, - 36, - 77, - 206, - 234, - 83, - 80, - 168, - 74, - 121, - 203, - 240, - 161, - 153, - 187, - 214, - 193, - 250, - 217, - 136, - 116, - 35, - 248, - 200, - 4, - 142, - 96, - 57, - 97, - 87, - 0, - 131, - 1, - 82, - 97, - 75, - 128, - 130, - 1, - 81, - 97, - 87, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 86, - 224, - 133, - 1, - 96, - 96, - 97, - 86, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 86, - 96, - 130, - 1, - 81, - 97, - 87, - 64, - 131, - 1, - 82, - 97, - 86, - 128, - 130, - 1, - 81, - 97, - 87, - 96, - 131, - 1, - 82, - 97, - 86, - 224, - 130, - 1, - 81, - 97, - 87, - 128, - 131, - 1, - 82, - 97, - 87, - 0, - 130, - 1, - 81, - 97, - 87, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 87, - 64, - 133, - 1, - 96, - 128, - 97, - 87, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 4, - 56, - 135, - 63, - 192, - 2, - 49, - 174, - 82, - 126, - 252, - 247, - 77, - 144, - 146, - 245, - 5, - 157, - 250, - 5, - 39, - 92, - 190, - 115, - 129, - 233, - 72, - 254, - 59, - 123, - 97, - 216, - 97, - 87, - 192, - 131, - 1, - 82, - 127, - 3, - 192, - 243, - 20, - 201, - 52, - 3, - 121, - 43, - 168, - 110, - 195, - 132, - 27, - 48, - 128, - 242, - 247, - 205, - 9, - 44, - 107, - 203, - 99, - 44, - 219, - 194, - 18, - 42, - 19, - 205, - 239, - 97, - 87, - 224, - 131, - 1, - 82, - 97, - 75, - 160, - 130, - 1, - 81, - 97, - 88, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 87, - 192, - 133, - 1, - 96, - 96, - 97, - 87, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 87, - 64, - 130, - 1, - 81, - 97, - 88, - 32, - 131, - 1, - 82, - 97, - 87, - 96, - 130, - 1, - 81, - 97, - 88, - 64, - 131, - 1, - 82, - 97, - 87, - 192, - 130, - 1, - 81, - 97, - 88, - 96, - 131, - 1, - 82, - 97, - 87, - 224, - 130, - 1, - 81, - 97, - 88, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 88, - 32, - 133, - 1, - 96, - 128, - 97, - 88, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 43, - 18, - 177, - 50, - 166, - 38, - 26, - 214, - 2, - 73, - 20, - 117, - 153, - 202, - 224, - 213, - 179, - 84, - 126, - 81, - 13, - 234, - 187, - 166, - 85, - 38, - 209, - 48, - 240, - 79, - 36, - 2, - 97, - 88, - 160, - 131, - 1, - 82, - 127, - 19, - 227, - 192, - 44, - 224, - 15, - 107, - 126, - 0, - 213, - 176, - 153, - 237, - 165, - 241, - 21, - 89, - 86, - 174, - 131, - 137, - 154, - 45, - 89, - 206, - 252, - 176, - 13, - 173, - 102, - 167, - 246, - 97, - 88, - 192, - 131, - 1, - 82, - 97, - 75, - 192, - 130, - 1, - 81, - 97, - 88, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 88, - 160, - 133, - 1, - 96, - 96, - 97, - 88, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 88, - 32, - 130, - 1, - 81, - 97, - 89, - 0, - 131, - 1, - 82, - 97, - 88, - 64, - 130, - 1, - 81, - 97, - 89, - 32, - 131, - 1, - 82, - 97, - 88, - 160, - 130, - 1, - 81, - 97, - 89, - 64, - 131, - 1, - 82, - 97, - 88, - 192, - 130, - 1, - 81, - 97, - 89, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 0, - 133, - 1, - 96, - 128, - 97, - 89, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 14, - 216, - 51, - 112, - 39, - 126, - 15, - 211, - 94, - 130, - 88, - 221, - 86, - 48, - 206, - 12, - 227, - 73, - 31, - 223, - 126, - 22, - 109, - 41, - 55, - 69, - 99, - 91, - 12, - 196, - 235, - 165, - 97, - 89, - 128, - 131, - 1, - 82, - 127, - 3, - 153, - 78, - 126, - 119, - 173, - 88, - 7, - 43, - 120, - 117, - 119, - 0, - 171, - 11, - 121, - 36, - 127, - 46, - 70, - 43, - 12, - 246, - 165, - 161, - 139, - 96, - 116, - 20, - 192, - 149, - 219, - 97, - 89, - 160, - 131, - 1, - 82, - 97, - 75, - 224, - 130, - 1, - 81, - 97, - 89, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 128, - 133, - 1, - 96, - 96, - 97, - 89, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 89, - 0, - 130, - 1, - 81, - 97, - 89, - 224, - 131, - 1, - 82, - 97, - 89, - 32, - 130, - 1, - 81, - 97, - 90, - 0, - 131, - 1, - 82, - 97, - 89, - 128, - 130, - 1, - 81, - 97, - 90, - 32, - 131, - 1, - 82, - 97, - 89, - 160, - 130, - 1, - 81, - 97, - 90, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 89, - 224, - 133, - 1, - 96, - 128, - 97, - 89, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 35, - 186, - 75, - 196, - 155, - 170, - 181, - 99, - 233, - 213, - 191, - 7, - 218, - 35, - 26, - 68, - 150, - 211, - 91, - 107, - 199, - 130, - 219, - 189, - 118, - 19, - 95, - 228, - 76, - 49, - 203, - 207, - 97, - 90, - 96, - 131, - 1, - 82, - 127, - 40, - 184, - 128, - 151, - 231, - 237, - 241, - 178, - 144, - 79, - 108, - 37, - 193, - 227, - 12, - 160, - 227, - 140, - 116, - 165, - 33, - 37, - 178, - 153, - 92, - 76, - 240, - 167, - 80, - 104, - 56, - 84, - 97, - 90, - 128, - 131, - 1, - 82, - 97, - 76, - 0, - 130, - 1, - 81, - 97, - 90, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 90, - 96, - 133, - 1, - 96, - 96, - 97, - 90, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 89, - 224, - 130, - 1, - 81, - 97, - 90, - 192, - 131, - 1, - 82, - 97, - 90, - 0, - 130, - 1, - 81, - 97, - 90, - 224, - 131, - 1, - 82, - 97, - 90, - 96, - 130, - 1, - 81, - 97, - 91, - 0, - 131, - 1, - 82, - 97, - 90, - 128, - 130, - 1, - 81, - 97, - 91, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 90, - 192, - 133, - 1, - 96, - 128, - 97, - 90, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 23, - 220, - 187, - 160, - 187, - 226, - 210, - 69, - 102, - 222, - 98, - 9, - 152, - 246, - 47, - 245, - 78, - 165, - 48, - 42, - 218, - 106, - 235, - 24, - 2, - 139, - 97, - 180, - 220, - 25, - 187, - 211, - 97, - 91, - 64, - 131, - 1, - 82, - 127, - 14, - 31, - 144, - 128, - 7, - 165, - 194, - 204, - 147, - 68, - 38, - 194, - 109, - 231, - 32, - 108, - 83, - 250, - 16, - 199, - 157, - 99, - 239, - 82, - 238, - 145, - 191, - 181, - 104, - 199, - 47, - 189, - 97, - 91, - 96, - 131, - 1, - 82, - 97, - 76, - 32, - 130, - 1, - 81, - 97, - 91, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 91, - 64, - 133, - 1, - 96, - 96, - 97, - 91, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 90, - 192, - 130, - 1, - 81, - 97, - 91, - 160, - 131, - 1, - 82, - 97, - 90, - 224, - 130, - 1, - 81, - 97, - 91, - 192, - 131, - 1, - 82, - 97, - 91, - 64, - 130, - 1, - 81, - 97, - 91, - 224, - 131, - 1, - 82, - 97, - 91, - 96, - 130, - 1, - 81, - 97, - 92, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 91, - 160, - 133, - 1, - 96, - 128, - 97, - 91, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 44, - 120, - 35, - 249, - 156, - 178, - 173, - 183, - 22, - 190, - 203, - 150, - 9, - 20, - 255, - 161, - 214, - 226, - 242, - 87, - 135, - 95, - 221, - 3, - 194, - 190, - 229, - 46, - 245, - 113, - 212, - 30, - 97, - 92, - 32, - 131, - 1, - 82, - 127, - 9, - 171, - 131, - 235, - 198, - 128, - 62, - 101, - 178, - 230, - 131, - 28, - 135, - 6, - 217, - 161, - 52, - 246, - 177, - 207, - 111, - 110, - 197, - 194, - 105, - 122, - 254, - 224, - 149, - 50, - 14, - 225, - 97, - 92, - 64, - 131, - 1, - 82, - 97, - 76, - 64, - 130, - 1, - 81, - 97, - 92, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 92, - 32, - 133, - 1, - 96, - 96, - 97, - 92, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 91, - 160, - 130, - 1, - 81, - 97, - 92, - 128, - 131, - 1, - 82, - 97, - 91, - 192, - 130, - 1, - 81, - 97, - 92, - 160, - 131, - 1, - 82, - 97, - 92, - 32, - 130, - 1, - 81, - 97, - 92, - 192, - 131, - 1, - 82, - 97, - 92, - 64, - 130, - 1, - 81, - 97, - 92, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 92, - 128, - 133, - 1, - 96, - 128, - 97, - 92, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 45, - 193, - 44, - 32, - 81, - 82, - 191, - 172, - 195, - 84, - 200, - 56, - 34, - 85, - 113, - 23, - 44, - 33, - 94, - 1, - 166, - 77, - 230, - 162, - 202, - 102, - 101, - 199, - 9, - 55, - 172, - 88, - 97, - 93, - 0, - 131, - 1, - 82, - 127, - 4, - 73, - 235, - 82, - 159, - 0, - 56, - 162, - 189, - 47, - 108, - 11, - 98, - 19, - 167, - 4, - 136, - 182, - 155, - 71, - 157, - 144, - 169, - 83, - 87, - 158, - 76, - 157, - 69, - 98, - 27, - 133, - 97, - 93, - 32, - 131, - 1, - 82, - 97, - 76, - 96, - 130, - 1, - 81, - 97, - 93, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 0, - 133, - 1, - 96, - 96, - 97, - 93, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 92, - 128, - 130, - 1, - 81, - 97, - 93, - 96, - 131, - 1, - 82, - 97, - 92, - 160, - 130, - 1, - 81, - 97, - 93, - 128, - 131, - 1, - 82, - 97, - 93, - 0, - 130, - 1, - 81, - 97, - 93, - 160, - 131, - 1, - 82, - 97, - 93, - 32, - 130, - 1, - 81, - 97, - 93, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 96, - 133, - 1, - 96, - 128, - 97, - 93, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 9, - 162, - 171, - 57, - 19, - 164, - 119, - 15, - 213, - 15, - 107, - 169, - 236, - 76, - 224, - 179, - 23, - 139, - 84, - 215, - 191, - 202, - 91, - 66, - 254, - 126, - 142, - 28, - 229, - 207, - 96, - 169, - 97, - 93, - 224, - 131, - 1, - 82, - 127, - 19, - 236, - 49, - 249, - 64, - 38, - 86, - 156, - 75, - 183, - 110, - 44, - 76, - 234, - 163, - 230, - 82, - 84, - 56, - 255, - 180, - 167, - 166, - 156, - 222, - 97, - 246, - 215, - 123, - 147, - 186, - 215, - 97, - 94, - 0, - 131, - 1, - 82, - 97, - 76, - 128, - 130, - 1, - 81, - 97, - 94, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 93, - 224, - 133, - 1, - 96, - 96, - 97, - 93, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 93, - 96, - 130, - 1, - 81, - 97, - 94, - 64, - 131, - 1, - 82, - 97, - 93, - 128, - 130, - 1, - 81, - 97, - 94, - 96, - 131, - 1, - 82, - 97, - 93, - 224, - 130, - 1, - 81, - 97, - 94, - 128, - 131, - 1, - 82, - 97, - 94, - 0, - 130, - 1, - 81, - 97, - 94, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 94, - 64, - 133, - 1, - 96, - 128, - 97, - 94, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 7, - 67, - 234, - 64, - 241, - 64, - 132, - 219, - 38, - 115, - 33, - 114, - 131, - 170, - 5, - 63, - 152, - 104, - 150, - 238, - 124, - 24, - 31, - 82, - 17, - 132, - 66, - 233, - 156, - 69, - 41, - 116, - 97, - 94, - 192, - 131, - 1, - 82, - 127, - 2, - 3, - 227, - 73, - 58, - 37, - 148, - 236, - 229, - 125, - 34, - 204, - 117, - 221, - 8, - 26, - 198, - 130, - 113, - 236, - 124, - 117, - 129, - 83, - 207, - 210, - 21, - 43, - 251, - 92, - 25, - 227, - 97, - 94, - 224, - 131, - 1, - 82, - 97, - 76, - 160, - 130, - 1, - 81, - 97, - 95, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 94, - 192, - 133, - 1, - 96, - 96, - 97, - 94, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 94, - 64, - 130, - 1, - 81, - 97, - 95, - 32, - 131, - 1, - 82, - 97, - 94, - 96, - 130, - 1, - 81, - 97, - 95, - 64, - 131, - 1, - 82, - 97, - 94, - 192, - 130, - 1, - 81, - 97, - 95, - 96, - 131, - 1, - 82, - 97, - 94, - 224, - 130, - 1, - 81, - 97, - 95, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 95, - 32, - 133, - 1, - 96, - 128, - 97, - 95, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 2, - 169, - 167, - 125, - 142, - 111, - 111, - 216, - 159, - 51, - 186, - 86, - 254, - 69, - 246, - 245, - 201, - 7, - 229, - 11, - 162, - 140, - 221, - 65, - 152, - 172, - 251, - 86, - 46, - 178, - 17, - 3, - 97, - 95, - 160, - 131, - 1, - 82, - 127, - 35, - 171, - 238, - 104, - 216, - 60, - 45, - 102, - 50, - 87, - 110, - 94, - 149, - 202, - 1, - 166, - 30, - 94, - 62, - 109, - 148, - 56, - 194, - 172, - 100, - 40, - 200, - 182, - 237, - 254, - 42, - 186, - 97, - 95, - 192, - 131, - 1, - 82, - 97, - 76, - 192, - 130, - 1, - 81, - 97, - 95, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 95, - 160, - 133, - 1, - 96, - 96, - 97, - 95, - 160, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 95, - 32, - 130, - 1, - 81, - 97, - 96, - 0, - 131, - 1, - 82, - 97, - 95, - 64, - 130, - 1, - 81, - 97, - 96, - 32, - 131, - 1, - 82, - 97, - 95, - 160, - 130, - 1, - 81, - 97, - 96, - 64, - 131, - 1, - 82, - 97, - 95, - 192, - 130, - 1, - 81, - 97, - 96, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 0, - 133, - 1, - 96, - 128, - 97, - 96, - 0, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 127, - 44, - 243, - 109, - 54, - 191, - 172, - 190, - 26, - 141, - 140, - 98, - 106, - 239, - 167, - 90, - 192, - 254, - 180, - 107, - 114, - 89, - 137, - 168, - 230, - 250, - 190, - 208, - 116, - 191, - 159, - 106, - 247, - 97, - 96, - 128, - 131, - 1, - 82, - 127, - 6, - 15, - 222, - 211, - 237, - 94, - 197, - 109, - 158, - 0, - 100, - 215, - 60, - 71, - 34, - 69, - 164, - 196, - 182, - 236, - 55, - 30, - 152, - 8, - 105, - 43, - 247, - 242, - 89, - 211, - 183, - 48, - 97, - 96, - 160, - 131, - 1, - 82, - 97, - 76, - 224, - 130, - 1, - 81, - 97, - 96, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 128, - 133, - 1, - 96, - 96, - 97, - 96, - 128, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 96, - 0, - 130, - 1, - 81, - 97, - 96, - 224, - 131, - 1, - 82, - 97, - 96, - 32, - 130, - 1, - 81, - 97, - 97, - 0, - 131, - 1, - 82, - 97, - 96, - 128, - 130, - 1, - 81, - 97, - 97, - 32, - 131, - 1, - 82, - 97, - 96, - 160, - 130, - 1, - 81, - 97, - 97, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 96, - 224, - 133, - 1, - 96, - 128, - 97, - 96, - 224, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 64, - 130, - 1, - 81, - 97, - 97, - 96, - 131, - 1, - 82, - 97, - 4, - 96, - 130, - 1, - 81, - 97, - 97, - 128, - 131, - 1, - 82, - 97, - 77, - 0, - 130, - 1, - 81, - 97, - 97, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 97, - 96, - 133, - 1, - 96, - 96, - 97, - 97, - 96, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 96, - 224, - 130, - 1, - 81, - 97, - 97, - 192, - 131, - 1, - 82, - 97, - 97, - 0, - 130, - 1, - 81, - 97, - 97, - 224, - 131, - 1, - 82, - 97, - 97, - 96, - 130, - 1, - 81, - 97, - 98, - 0, - 131, - 1, - 82, - 97, - 97, - 128, - 130, - 1, - 81, - 97, - 98, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 97, - 192, - 133, - 1, - 96, - 128, - 97, - 97, - 192, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 128, - 130, - 1, - 81, - 97, - 98, - 64, - 131, - 1, - 82, - 97, - 4, - 160, - 130, - 1, - 81, - 97, - 98, - 96, - 131, - 1, - 82, - 97, - 77, - 32, - 130, - 1, - 81, - 97, - 98, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 98, - 64, - 133, - 1, - 96, - 96, - 97, - 98, - 64, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 97, - 192, - 130, - 1, - 81, - 97, - 98, - 160, - 131, - 1, - 82, - 97, - 97, - 224, - 130, - 1, - 81, - 97, - 98, - 192, - 131, - 1, - 82, - 97, - 98, - 64, - 130, - 1, - 81, - 97, - 98, - 224, - 131, - 1, - 82, - 97, - 98, - 96, - 130, - 1, - 81, - 97, - 99, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 98, - 160, - 133, - 1, - 96, - 128, - 97, - 98, - 160, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 4, - 192, - 130, - 1, - 81, - 97, - 99, - 32, - 131, - 1, - 82, - 97, - 4, - 224, - 130, - 1, - 81, - 97, - 99, - 64, - 131, - 1, - 82, - 97, - 77, - 64, - 130, - 1, - 81, - 97, - 99, - 96, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 99, - 32, - 133, - 1, - 96, - 96, - 97, - 99, - 32, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 98, - 160, - 130, - 1, - 81, - 97, - 99, - 128, - 131, - 1, - 82, - 97, - 98, - 192, - 130, - 1, - 81, - 97, - 99, - 160, - 131, - 1, - 82, - 97, - 99, - 32, - 130, - 1, - 81, - 97, - 99, - 192, - 131, - 1, - 82, - 97, - 99, - 64, - 130, - 1, - 81, - 97, - 99, - 224, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 99, - 128, - 133, - 1, - 96, - 128, - 97, - 99, - 128, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 5, - 0, - 130, - 1, - 81, - 97, - 100, - 0, - 131, - 1, - 82, - 97, - 5, - 32, - 130, - 1, - 81, - 97, - 100, - 32, - 131, - 1, - 82, - 97, - 77, - 96, - 130, - 1, - 81, - 97, - 100, - 64, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 0, - 133, - 1, - 96, - 96, - 97, - 100, - 0, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 99, - 128, - 130, - 1, - 81, - 97, - 100, - 96, - 131, - 1, - 82, - 97, - 99, - 160, - 130, - 1, - 81, - 97, - 100, - 128, - 131, - 1, - 82, - 97, - 100, - 0, - 130, - 1, - 81, - 97, - 100, - 160, - 131, - 1, - 82, - 97, - 100, - 32, - 130, - 1, - 81, - 97, - 100, - 192, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 96, - 133, - 1, - 96, - 128, - 97, - 100, - 96, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 5, - 64, - 130, - 1, - 81, - 97, - 100, - 224, - 131, - 1, - 82, - 97, - 5, - 96, - 130, - 1, - 81, - 97, - 101, - 0, - 131, - 1, - 82, - 97, - 77, - 128, - 130, - 1, - 81, - 97, - 101, - 32, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 100, - 224, - 133, - 1, - 96, - 96, - 97, - 100, - 224, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 100, - 96, - 130, - 1, - 81, - 97, - 101, - 64, - 131, - 1, - 82, - 97, - 100, - 128, - 130, - 1, - 81, - 97, - 101, - 96, - 131, - 1, - 82, - 97, - 100, - 224, - 130, - 1, - 81, - 97, - 101, - 128, - 131, - 1, - 82, - 97, - 101, - 0, - 130, - 1, - 81, - 97, - 101, - 160, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 101, - 64, - 133, - 1, - 96, - 128, - 97, - 101, - 64, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 3, - 160, - 130, - 1, - 81, - 97, - 101, - 192, - 131, - 1, - 82, - 97, - 3, - 192, - 130, - 1, - 81, - 97, - 101, - 224, - 131, - 1, - 82, - 97, - 77, - 160, - 130, - 1, - 81, - 97, - 102, - 0, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 101, - 192, - 133, - 1, - 96, - 96, - 97, - 101, - 192, - 135, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 101, - 64, - 130, - 1, - 81, - 97, - 102, - 32, - 131, - 1, - 82, - 97, - 101, - 96, - 130, - 1, - 81, - 97, - 102, - 64, - 131, - 1, - 82, - 97, - 101, - 192, - 130, - 1, - 81, - 97, - 102, - 96, - 131, - 1, - 82, - 97, - 101, - 224, - 130, - 1, - 81, - 97, - 102, - 128, - 131, - 1, - 82, - 130, - 96, - 1, - 96, - 64, - 97, - 102, - 32, - 133, - 1, - 96, - 128, - 97, - 102, - 32, - 135, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 146, - 80, - 97, - 10, - 192, - 130, - 1, - 81, - 97, - 102, - 160, - 131, - 1, - 82, - 97, - 10, - 224, - 130, - 1, - 81, - 97, - 102, - 192, - 131, - 1, - 82, - 97, - 77, - 224, - 130, - 1, - 81, - 129, - 3, - 97, - 102, - 224, - 131, - 1, - 82, - 80, - 129, - 96, - 1, - 96, - 64, - 97, - 102, - 160, - 132, - 1, - 96, - 96, - 97, - 102, - 160, - 134, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 102, - 32, - 129, - 1, - 81, - 97, - 103, - 0, - 130, - 1, - 82, - 97, - 102, - 64, - 129, - 1, - 81, - 97, - 103, - 32, - 130, - 1, - 82, - 97, - 102, - 160, - 129, - 1, - 81, - 97, - 103, - 64, - 130, - 1, - 82, - 97, - 102, - 192, - 129, - 1, - 81, - 97, - 103, - 96, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 0, - 132, - 1, - 96, - 128, - 97, - 103, - 0, - 134, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 11, - 96, - 129, - 1, - 81, - 97, - 103, - 128, - 130, - 1, - 82, - 97, - 11, - 128, - 129, - 1, - 81, - 97, - 103, - 160, - 130, - 1, - 82, - 97, - 78, - 0, - 129, - 1, - 81, - 97, - 103, - 192, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 128, - 132, - 1, - 96, - 96, - 97, - 103, - 128, - 134, - 1, - 96, - 7, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 103, - 0, - 129, - 1, - 81, - 97, - 103, - 224, - 130, - 1, - 82, - 97, - 103, - 32, - 129, - 1, - 81, - 97, - 104, - 0, - 130, - 1, - 82, - 97, - 103, - 128, - 129, - 1, - 81, - 97, - 104, - 32, - 130, - 1, - 82, - 97, - 103, - 160, - 129, - 1, - 81, - 97, - 104, - 64, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 64, - 97, - 103, - 224, - 132, - 1, - 96, - 128, - 97, - 103, - 224, - 134, - 1, - 96, - 6, - 90, - 250, - 20, - 22, - 145, - 80, - 97, - 103, - 224, - 129, - 1, - 81, - 97, - 104, - 96, - 130, - 1, - 82, - 97, - 104, - 0, - 129, - 1, - 81, - 97, - 104, - 128, - 130, - 1, - 82, - 127, - 25, - 142, - 147, - 147, - 146, - 13, - 72, - 58, - 114, - 96, - 191, - 183, - 49, - 251, - 93, - 37, - 241, - 170, - 73, - 51, - 53, - 169, - 231, - 18, - 151, - 228, - 133, - 183, - 174, - 243, - 18, - 194, - 97, - 104, - 160, - 130, - 1, - 82, - 127, - 24, - 0, - 222, - 239, - 18, - 31, - 30, - 118, - 66, - 106, - 0, - 102, - 94, - 92, - 68, - 121, - 103, - 67, - 34, - 212, - 247, - 94, - 218, - 221, - 70, - 222, - 189, - 92, - 217, - 146, - 246, - 237, - 97, - 104, - 192, - 130, - 1, - 82, - 127, - 9, - 6, - 137, - 208, - 88, - 95, - 240, - 117, - 236, - 158, - 153, - 173, - 105, - 12, - 51, - 149, - 188, - 75, - 49, - 51, - 112, - 179, - 142, - 243, - 85, - 172, - 218, - 220, - 209, - 34, - 151, - 91, - 97, - 104, - 224, - 130, - 1, - 82, - 127, - 18, - 200, - 94, - 165, - 219, - 140, - 109, - 235, - 74, - 171, - 113, - 128, - 141, - 203, - 64, - 143, - 227, - 209, - 231, - 105, - 12, - 67, - 211, - 123, - 76, - 230, - 204, - 1, - 102, - 250, - 125, - 170, - 97, - 105, - 0, - 130, - 1, - 82, - 97, - 11, - 96, - 129, - 1, - 81, - 97, - 105, - 32, - 130, - 1, - 82, - 97, - 11, - 128, - 129, - 1, - 81, - 97, - 105, - 64, - 130, - 1, - 82, - 127, - 38, - 24, - 106, - 45, - 101, - 238, - 77, - 47, - 156, - 154, - 91, - 145, - 248, - 101, - 151, - 211, - 95, - 25, - 44, - 209, - 32, - 202, - 247, - 233, - 53, - 216, - 68, - 61, - 25, - 56, - 226, - 61, - 97, - 105, - 96, - 130, - 1, - 82, - 127, - 48, - 68, - 31, - 209, - 181, - 211, - 55, - 4, - 130, - 196, - 33, - 82, - 168, - 137, - 144, - 39, - 113, - 105, - 137, - 166, - 153, - 108, - 37, - 53, - 188, - 159, - 127, - 238, - 138, - 174, - 247, - 158, - 97, - 105, - 128, - 130, - 1, - 82, - 127, - 22, - 243, - 99, - 241, - 3, - 200, - 13, - 123, - 188, - 138, - 211, - 198, - 134, - 126, - 8, - 34, - 187, - 198, - 0, - 11, - 233, - 26, - 70, - 137, - 117, - 92, - 125, - 244, - 2, - 33, - 193, - 69, - 97, - 105, - 160, - 130, - 1, - 82, - 127, - 43, - 28, - 187, - 62, - 82, - 30, - 223, - 90, - 98, - 45, - 130, - 118, - 42, - 68, - 165, - 230, - 63, - 30, - 80, - 179, - 50, - 215, - 17, - 84, - 164, - 167, - 149, - 141, - 96, - 17, - 222, - 255, - 97, - 105, - 192, - 130, - 1, - 82, - 129, - 96, - 1, - 96, - 32, - 97, - 104, - 96, - 132, - 1, - 97, - 1, - 128, - 97, - 104, - 96, - 134, - 1, - 96, - 8, - 90, - 250, - 97, - 104, - 96, - 147, - 144, - 147, - 1, - 81, - 96, - 1, - 20, - 146, - 20, - 22, - 22, - 145, - 80, - 80, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 64, - 81, - 128, - 97, - 105, - 192, - 1, - 96, - 64, - 82, - 128, - 97, - 3, - 78, - 144, - 96, - 32, - 130, - 2, - 128, - 54, - 131, - 55, - 80, - 145, - 146, - 145, - 80, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 65, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 64, - 81, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 78, - 92, - 87, - 97, - 78, - 92, - 97, - 78, - 29, - 86, - 91, - 96, - 64, - 82, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 78, - 117, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 78, - 143, - 87, - 97, - 78, - 143, - 97, - 78, - 29, - 86, - 91, - 97, - 78, - 162, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 97, - 78, - 51, - 86, - 91, - 129, - 129, - 82, - 132, - 96, - 32, - 131, - 134, - 1, - 1, - 17, - 21, - 97, - 78, - 183, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 96, - 32, - 133, - 1, - 96, - 32, - 131, - 1, - 55, - 96, - 0, - 145, - 129, - 1, - 96, - 32, - 1, - 145, - 144, - 145, - 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 64, - 131, - 133, - 3, - 18, - 21, - 97, - 78, - 231, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 78, - 255, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 133, - 1, - 145, - 80, - 133, - 96, - 31, - 131, - 1, - 18, - 97, - 79, - 19, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 32, - 130, - 130, - 17, - 21, - 97, - 79, - 39, - 87, - 97, - 79, - 39, - 97, - 78, - 29, - 86, - 91, - 129, - 96, - 5, - 27, - 97, - 79, - 54, - 130, - 130, - 1, - 97, - 78, - 51, - 86, - 91, - 146, - 131, - 82, - 132, - 129, - 1, - 130, - 1, - 146, - 130, - 129, - 1, - 144, - 138, - 133, - 17, - 21, - 97, - 79, - 80, - 87, - 96, - 0, - 128, - 253, - 91, - 149, - 131, - 1, - 149, - 91, - 132, - 135, - 16, - 21, - 97, - 79, - 110, - 87, - 134, - 53, - 130, - 82, - 149, - 131, - 1, - 149, - 144, - 131, - 1, - 144, - 97, - 79, - 85, - 86, - 91, - 151, - 80, - 80, - 80, - 134, - 1, - 53, - 146, - 80, - 80, - 128, - 130, - 17, - 21, - 97, - 79, - 133, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 79, - 146, - 133, - 130, - 134, - 1, - 97, - 78, - 100, - 86, - 91, - 145, - 80, - 80, - 146, - 80, - 146, - 144, - 80, - 86, - 254, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 212, - 178, - 220, - 135, - 152, - 186, - 177, - 123, - 101, - 162, - 231, - 44, - 60, - 209, - 59, - 7, - 180, - 165, - 138, - 174, - 54, - 106, - 119, - 120, - 72, - 82, - 51, - 60, - 117, - 170, - 120, - 185, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static SOLVENCYVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct SolvencyVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for SolvencyVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for SolvencyVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for SolvencyVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for SolvencyVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(SolvencyVerifier)).field(&self.address()).finish() - } - } - impl SolvencyVerifier { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - SOLVENCYVERIFIER_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - SOLVENCYVERIFIER_ABI.clone(), - SOLVENCYVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verify` (0xbd205a90) function - pub fn verify( - &self, - pub_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([189, 32, 90, 144], (pub_inputs, proof)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for SolvencyVerifier { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verify` function with signature `verify(uint256[],bytes)` and selector `0xbd205a90` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verify", abi = "verify(uint256[],bytes)")] - pub struct VerifyCall { - pub pub_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - pub proof: ::ethers::core::types::Bytes, - } - ///Container type for all return fields from the `verify` function with signature `verify(uint256[],bytes)` and selector `0xbd205a90` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyReturn(pub bool); -} diff --git a/backend/src/contracts/generated/summa_contract.rs b/backend/src/contracts/generated/summa_contract.rs index 7b33fdba..dc13985c 100644 --- a/backend/src/contracts/generated/summa_contract.rs +++ b/backend/src/contracts/generated/summa_contract.rs @@ -11,14 +11,14 @@ pub use summa::*; )] pub mod summa { #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"_solvencyVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IVerifier\",\"name\":\"_inclusionVerifier\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"SolvencyProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"mstRoots\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"ownershipProofByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfSolvency\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyInclusionProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifySolvencyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; + const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"_inclusionVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"mstLevels\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[],\"indexed\":false},{\"internalType\":\"uint256[]\",\"name\":\"rootBalances\",\"type\":\"uint256[]\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"LiabilitiesCommitmentSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"commitments\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"mstLevels\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"addressHash\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getAddressOwnershipProof\",\"outputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"rootBalances\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitCommitment\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyInclusionProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; ///The parsed JSON ABI of the contract. pub static SUMMA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(|| ::ethers::core::utils::__serde_json::from_str(__ABI).expect("ABI is always valid")); #[rustfmt::skip] const __BYTECODE: &[u8] = &[ 96, - 192, + 160, 96, 64, 82, @@ -41,15 +41,15 @@ pub mod summa { 81, 98, 0, - 22, - 243, + 28, + 249, 56, 3, 128, 98, 0, - 22, - 243, + 28, + 249, 131, 57, 129, @@ -66,8 +66,8 @@ pub mod summa { 145, 98, 0, - 0, - 196, + 1, + 16, 86, 91, 98, @@ -78,7 +78,7 @@ pub mod summa { 98, 0, 0, - 87, + 168, 86, 91, 96, @@ -89,20 +89,101 @@ pub mod summa { 160, 27, 3, - 145, - 130, + 147, + 144, + 147, 22, 96, 128, 82, + 96, + 64, + 128, + 81, + 96, + 96, + 129, + 1, + 130, + 82, + 97, + 255, + 255, + 147, + 132, + 22, + 128, + 130, + 82, + 146, + 144, + 147, 22, 96, - 160, + 32, + 132, + 1, + 129, + 144, + 82, + 96, + 255, + 144, + 148, + 22, + 146, + 1, + 130, + 144, 82, + 96, + 1, + 128, + 84, + 99, + 255, + 255, + 255, + 255, + 25, + 22, + 144, + 145, + 23, 98, + 1, 0, 0, - 252, + 144, + 147, + 2, + 146, + 144, + 146, + 23, + 96, + 255, + 96, + 32, + 27, + 25, + 22, + 100, + 1, + 0, + 0, + 0, + 0, + 144, + 145, + 2, + 23, + 144, + 85, + 98, + 0, + 1, + 129, 86, 91, 96, @@ -187,22 +268,17 @@ pub mod summa { 91, 128, 81, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, + 97, + 255, + 255, 129, 22, 129, 20, 98, 0, - 0, - 191, + 1, + 11, 87, 96, 0, @@ -218,91 +294,138 @@ pub mod summa { 0, 128, 96, - 64, - 131, + 0, + 128, + 96, + 128, 133, + 135, 3, 18, 21, 98, 0, - 0, - 216, + 1, + 39, 87, 96, 0, 128, 253, 91, + 132, + 81, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 129, + 22, + 129, + 20, 98, 0, + 1, + 63, + 87, + 96, 0, - 227, - 131, + 128, + 253, + 91, + 147, + 80, + 98, + 0, + 1, + 79, + 96, + 32, + 134, + 1, 98, 0, 0, - 167, + 248, 86, 91, - 145, + 146, 80, 98, 0, - 0, - 243, + 1, + 95, 96, - 32, - 132, + 64, + 134, 1, 98, 0, 0, - 167, + 248, 86, 91, - 144, + 145, 80, + 96, + 96, + 133, + 1, + 81, + 96, + 255, + 129, + 22, + 129, + 20, + 98, + 0, + 1, + 118, + 87, + 96, + 0, + 128, + 253, + 91, + 147, + 150, 146, + 149, 80, - 146, 144, + 147, + 80, 80, 86, 91, 96, 128, 81, - 96, - 160, - 81, 97, - 21, - 209, + 27, + 92, 98, 0, 1, - 34, + 157, 96, 0, 57, 96, 0, 97, - 10, - 133, - 1, - 82, - 96, - 0, - 97, - 4, - 94, + 11, + 91, 1, 82, 97, - 21, - 209, + 27, + 92, 96, 0, 243, @@ -341,10 +464,10 @@ pub mod summa { 28, 128, 99, - 141, - 165, - 203, - 91, + 163, + 196, + 188, + 248, 17, 97, 0, @@ -352,17 +475,6 @@ pub mod summa { 87, 128, 99, - 141, - 165, - 203, - 91, - 20, - 97, - 1, - 54, - 87, - 128, - 99, 163, 196, 188, @@ -370,7 +482,7 @@ pub mod summa { 20, 97, 1, - 81, + 105, 87, 128, 99, @@ -381,7 +493,7 @@ pub mod summa { 20, 97, 1, - 116, + 140, 87, 128, 99, @@ -392,18 +504,29 @@ pub mod summa { 20, 97, 1, - 135, + 159, 87, 128, 99, - 242, - 253, + 218, + 100, + 167, + 80, + 20, + 97, + 1, + 194, + 87, + 128, + 99, + 242, + 253, 227, 139, 20, 97, 1, - 154, + 213, 87, 96, 0, @@ -412,10 +535,10 @@ pub mod summa { 91, 128, 99, - 35, - 235, - 148, - 160, + 25, + 179, + 57, + 104, 20, 97, 0, @@ -423,47 +546,47 @@ pub mod summa { 87, 128, 99, - 65, - 58, - 159, - 45, + 73, + 206, + 137, + 151, 20, 97, 0, - 214, + 204, 87, 128, 99, - 108, - 118, - 132, - 254, + 113, + 80, + 24, + 166, 20, 97, 0, - 235, + 250, 87, 128, 99, - 113, + 121, 80, - 24, - 166, + 44, + 85, 20, 97, 1, - 14, + 4, 87, 128, 99, - 127, - 59, - 251, - 46, + 141, + 165, + 203, + 91, 20, 97, 1, - 22, + 78, 87, 91, 96, @@ -473,7 +596,7 @@ pub mod summa { 91, 97, 0, - 195, + 182, 97, 0, 177, @@ -481,37 +604,27 @@ pub mod summa { 96, 4, 97, - 12, - 40, + 17, + 211, 86, 91, - 96, - 2, - 96, - 32, - 82, - 96, - 0, - 144, - 129, - 82, - 96, - 64, - 144, - 32, - 84, - 129, + 97, + 1, + 232, 86, 91, 96, 64, 81, + 97, + 0, + 195, + 145, 144, - 129, - 82, - 96, - 32, - 1, + 97, + 18, + 167, + 86, 91, 96, 64, @@ -524,50 +637,40 @@ pub mod summa { 91, 97, 0, - 233, + 236, 97, 0, - 228, + 218, 54, 96, 4, 97, - 13, - 104, - 86, - 91, - 97, - 1, - 173, + 17, + 211, 86, 91, - 0, - 91, - 97, - 0, - 254, - 97, - 0, - 249, - 54, 96, 4, - 97, - 15, - 34, - 86, - 91, - 97, - 4, - 68, + 96, + 32, + 82, + 96, + 0, + 144, + 129, + 82, + 96, + 64, + 144, + 32, + 84, + 129, 86, 91, 96, 64, 81, 144, - 21, - 21, 129, 82, 96, @@ -575,47 +678,91 @@ pub mod summa { 1, 97, 0, - 205, + 195, 86, 91, 97, - 0, - 233, + 1, + 2, 97, - 4, - 223, + 5, + 0, 86, 91, - 97, 0, - 195, + 91, + 96, + 1, + 84, 97, 1, - 36, - 54, - 96, - 4, + 42, + 144, 97, - 12, - 40, + 255, + 255, + 128, + 130, + 22, + 145, + 98, + 1, + 0, + 0, + 129, + 4, + 144, + 145, + 22, + 144, + 100, + 1, + 0, + 0, + 0, + 0, + 144, + 4, + 96, + 255, + 22, + 131, 86, 91, 96, - 3, + 64, + 128, + 81, + 97, + 255, + 255, + 148, + 133, + 22, + 129, + 82, + 147, + 144, + 146, + 22, 96, 32, + 132, + 1, 82, 96, - 0, + 255, + 22, 144, - 129, + 130, + 1, 82, 96, - 64, - 144, - 32, - 84, - 129, + 96, + 1, + 97, + 0, + 195, 86, 91, 96, @@ -642,26 +789,26 @@ pub mod summa { 1, 97, 0, - 205, + 195, 86, 91, 97, 1, - 100, + 124, 97, 1, - 95, + 119, 54, 96, 4, 97, - 12, - 40, + 17, + 211, 86, 91, 97, - 4, - 243, + 5, + 20, 86, 91, 96, @@ -669,91 +816,170 @@ pub mod summa { 81, 97, 0, - 205, + 195, 148, 147, 146, 145, 144, 97, - 15, - 204, + 18, + 193, 86, 91, 97, - 0, - 233, + 1, + 2, 97, 1, - 130, + 154, 54, 96, 4, 97, - 16, - 36, - 86, + 20, + 64, + 86, 91, 97, 7, - 83, + 116, 86, 91, 97, - 0, - 254, + 1, + 178, 97, 1, - 149, + 173, 54, 96, 4, 97, - 17, - 126, + 22, + 5, 86, 91, 97, - 9, - 253, + 10, + 21, 86, 91, + 96, + 64, + 81, + 144, + 21, + 21, + 129, + 82, + 96, + 32, + 1, 97, 0, - 233, + 195, + 86, + 91, 97, 1, - 168, + 2, + 97, + 1, + 208, 54, 96, 4, 97, - 17, - 235, + 22, + 114, 86, 91, 97, 11, - 5, + 219, 86, 91, 97, 1, - 181, + 2, 97, - 11, - 126, + 1, + 227, + 54, + 96, + 4, + 97, + 23, + 185, + 86, + 91, + 97, + 15, + 167, 86, 91, + 97, + 2, + 19, + 96, + 64, + 81, + 128, 96, + 128, 1, - 84, + 96, + 64, + 82, + 128, + 96, + 96, + 129, + 82, + 96, + 32, + 1, + 96, + 96, + 129, + 82, + 96, + 32, + 1, + 96, + 96, + 129, + 82, + 96, + 32, + 1, + 96, + 96, + 129, + 82, + 80, + 144, + 86, + 91, 96, 0, + 130, + 129, + 82, + 96, 3, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 84, 97, 2, - 43, + 106, 87, 96, 64, @@ -775,83 +1001,43 @@ pub mod summa { 1, 82, 96, - 54, + 20, 96, 36, 130, 1, 82, - 127, - 84, - 104, - 101, - 32, - 67, - 69, - 88, - 32, - 104, - 97, 115, - 32, - 110, - 111, - 116, - 32, - 115, - 117, + 16, + 89, + 25, + 28, + 153, + 92, + 220, + 200, + 27, + 155, + 221, + 8, + 29, + 153, + 92, + 154, + 89, + 154, + 89, + 89, + 96, 98, - 109, - 105, - 116, - 116, - 101, - 100, - 32, - 97, - 110, - 121, - 32, - 97, - 100, + 27, 96, 68, 130, 1, 82, - 117, - 100, - 114, - 101, - 115, - 115, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, - 105, - 112, - 32, - 112, - 114, - 111, - 111, - 102, - 115, - 96, - 80, - 27, 96, 100, - 130, - 1, - 82, - 96, - 132, 1, 91, 96, @@ -865,736 +1051,706 @@ pub mod summa { 91, 96, 0, - 131, - 81, + 130, + 129, + 82, 96, - 1, + 3, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 84, + 96, + 2, + 144, 97, 2, - 59, - 145, + 136, + 144, + 96, + 1, 144, 97, - 18, - 49, + 23, + 248, 86, 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, - 17, - 21, + 84, + 129, + 16, 97, 2, - 83, + 152, 87, 97, 2, - 83, + 152, 97, - 12, - 65, + 24, + 17, 86, 91, - 96, - 64, - 81, 144, - 128, - 130, + 96, + 0, 82, - 128, 96, 32, - 2, 96, + 0, 32, - 1, - 130, + 144, + 96, + 4, + 2, 1, 96, 64, - 82, + 81, 128, - 21, - 97, - 2, - 124, - 87, - 129, - 96, - 32, - 1, 96, - 32, - 130, - 2, 128, - 54, - 131, - 55, 1, + 96, + 64, + 82, 144, - 80, - 91, - 80, - 144, - 80, - 132, 129, 96, 0, - 129, - 81, - 129, - 16, - 97, - 2, - 147, - 87, + 130, + 1, + 128, + 84, 97, 2, - 147, + 193, + 144, 97, - 18, - 68, + 24, + 39, 86, 91, + 128, + 96, + 31, + 1, 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, + 96, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, 129, 129, 82, - 80, - 80, 96, - 0, + 32, + 1, + 130, + 128, + 84, + 97, + 2, + 237, + 144, + 97, + 24, + 39, + 86, 91, - 132, - 81, - 129, - 16, + 128, 21, 97, 3, - 142, + 58, 87, - 132, - 129, - 129, - 81, - 129, + 128, + 96, + 31, 16, 97, - 2, - 189, + 3, + 15, 87, 97, + 1, + 0, + 128, + 131, + 84, + 4, 2, - 189, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 18, - 68, + 3, + 58, 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, 32, - 2, 96, + 0, 32, + 144, + 91, + 129, + 84, + 129, + 82, + 144, + 96, 1, 1, - 81, + 144, 96, 32, 1, - 81, - 81, - 96, - 0, - 20, - 21, 128, - 21, + 131, + 17, 97, - 2, - 249, + 3, + 29, 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, + 91, + 80, + 80, + 80, + 80, 80, - 132, - 129, - 129, - 81, 129, - 16, - 97, - 2, - 231, - 87, + 82, + 96, + 32, + 1, + 96, + 1, + 130, + 1, + 128, + 84, 97, - 2, - 231, + 3, + 83, + 144, 97, - 18, - 68, + 24, + 39, 86, 91, + 128, + 96, + 31, + 1, 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 1, - 81, - 96, - 0, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 97, - 3, - 53, - 87, 96, 64, 81, - 98, - 70, - 27, - 205, + 144, + 129, + 1, 96, - 229, - 27, + 64, + 82, + 128, + 146, + 145, + 144, + 129, 129, 82, 96, 32, - 96, - 4, - 130, 1, - 82, - 96, - 13, - 96, - 36, 130, - 1, - 82, - 108, - 18, - 91, - 157, - 152, - 91, - 26, - 89, - 8, + 128, + 84, + 97, + 3, + 127, + 144, + 97, 24, - 92, - 220, - 217, - 93, - 96, - 154, - 27, + 39, + 86, + 91, + 128, + 21, + 97, + 3, + 204, + 87, + 128, 96, - 68, - 130, + 31, + 16, + 97, + 3, + 161, + 87, + 97, 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, 82, + 145, 96, - 100, + 32, 1, + 145, 97, - 2, - 34, + 3, + 204, 86, 91, - 132, - 129, + 130, + 1, + 145, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 91, 129, - 81, + 84, 129, - 16, + 82, + 144, + 96, + 1, + 1, + 144, + 96, + 32, + 1, + 128, + 131, + 17, 97, 3, - 71, + 175, 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, + 91, + 80, + 80, + 80, + 80, + 80, + 129, + 82, + 96, + 32, + 1, + 96, + 2, + 130, + 1, + 128, + 84, 97, 3, - 71, + 229, + 144, 97, - 18, - 68, + 24, + 39, 86, 91, + 128, + 96, + 31, + 1, 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 1, - 81, 96, 64, - 1, 81, - 130, - 130, + 144, + 129, + 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, + 82, 96, + 32, 1, + 130, + 128, + 84, 97, - 3, - 97, - 145, + 4, + 17, 144, 97, - 18, - 49, + 24, + 39, 86, 91, - 129, - 81, - 129, + 128, + 21, + 97, + 4, + 94, + 87, + 128, + 96, + 31, 16, 97, - 3, - 113, + 4, + 51, 87, 97, - 3, - 113, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 18, - 68, + 4, + 94, 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, 32, + 96, + 0, + 32, 144, + 91, 129, - 2, - 145, + 84, + 129, + 82, 144, - 145, + 96, 1, 1, - 82, + 144, + 96, + 32, + 1, 128, + 131, + 17, 97, + 4, + 65, + 87, + 130, + 144, 3, - 134, - 129, - 97, - 18, - 90, - 86, - 91, + 96, + 31, + 22, + 130, + 1, 145, + 91, 80, 80, - 97, - 2, - 162, - 86, - 91, 80, - 97, + 80, + 80, + 129, + 82, + 96, + 32, + 1, + 96, 3, - 153, - 131, 130, + 1, + 128, + 84, 97, 4, - 68, - 86, - 91, + 119, + 144, 97, - 3, - 216, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, + 24, + 39, + 86, + 91, + 128, 96, - 229, - 27, - 129, - 82, + 31, + 1, 96, 32, - 96, + 128, + 145, 4, - 130, - 1, - 82, + 2, 96, - 16, + 32, + 1, 96, - 36, - 130, + 64, + 81, + 144, + 129, 1, + 96, + 64, 82, - 111, - 36, - 183, - 59, - 48, - 182, - 52, - 178, - 16, - 45, - 37, + 128, + 146, + 145, 144, - 56, - 57, - 55, - 183, - 179, - 96, 129, - 27, - 96, - 68, - 130, - 1, + 129, 82, 96, - 100, + 32, 1, + 130, + 128, + 84, 97, - 2, - 34, + 4, + 163, + 144, + 97, + 24, + 39, 86, 91, + 128, + 21, + 97, + 4, + 240, + 87, + 128, 96, - 0, - 130, - 129, - 82, - 96, - 3, - 96, - 32, - 82, - 96, - 64, - 129, - 32, - 134, - 144, - 85, - 129, - 81, - 131, - 145, - 127, + 31, + 16, + 97, 4, - 115, - 88, - 28, - 60, - 244, - 55, - 175, 197, - 34, - 7, - 216, - 140, - 225, + 87, + 97, + 1, + 0, + 128, + 131, 84, - 26, - 251, - 199, - 206, - 159, - 219, + 4, + 2, 131, - 180, - 212, - 211, - 183, - 33, - 75, - 238, - 213, - 111, - 245, + 82, 145, - 132, + 96, + 32, + 1, 145, - 144, 97, 4, - 30, - 87, - 97, - 4, - 30, - 97, - 18, - 68, + 240, 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, 32, - 2, 96, + 0, 32, + 144, + 91, + 129, + 84, + 129, + 82, + 144, + 96, 1, 1, - 81, - 134, + 144, 96, - 64, - 81, + 32, + 1, + 128, + 131, + 17, 97, 4, - 53, - 146, - 145, + 211, + 87, + 130, 144, - 97, - 18, - 115, - 86, - 91, + 3, 96, - 64, - 81, - 128, + 31, + 22, + 130, + 1, 145, - 3, - 144, - 162, + 91, + 80, + 80, 80, 80, 80, + 129, + 82, + 80, + 80, + 144, 80, + 145, + 144, 80, 86, 91, - 96, - 64, - 81, - 99, - 11, - 210, + 97, 5, - 169, + 8, + 97, + 16, + 32, + 86, + 91, + 97, + 5, + 18, 96, - 228, - 27, + 0, + 97, + 16, + 122, + 86, + 91, + 86, + 91, + 96, + 2, 129, - 82, + 129, + 84, + 129, + 16, + 97, + 5, + 36, + 87, 96, 0, + 128, + 253, + 91, 144, 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 189, - 32, - 90, - 144, - 144, - 97, - 4, - 149, - 144, - 133, - 144, - 135, - 144, - 96, - 4, - 1, - 97, - 19, - 10, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 4, - 178, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 4, - 214, - 145, - 144, - 97, - 19, - 97, - 86, - 91, - 144, - 80, - 91, - 146, - 145, - 80, - 80, - 86, - 91, - 97, - 4, - 231, - 97, - 11, - 126, - 86, - 91, - 97, - 4, - 241, - 96, - 0, - 97, - 11, - 216, - 86, - 91, - 86, - 91, - 96, - 1, - 129, - 129, - 84, - 129, - 16, - 97, - 5, - 3, - 87, - 96, - 0, - 128, - 253, - 91, - 144, - 96, - 0, - 82, + 0, + 82, 96, 32, 96, @@ -1619,11 +1775,11 @@ pub mod summa { 84, 97, 5, - 38, + 71, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, @@ -1663,18 +1819,18 @@ pub mod summa { 84, 97, 5, - 82, + 115, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, 21, 97, 5, - 159, + 192, 87, 128, 96, @@ -1682,7 +1838,7 @@ pub mod summa { 16, 97, 5, - 116, + 149, 87, 97, 1, @@ -1701,7 +1857,7 @@ pub mod summa { 145, 97, 5, - 159, + 192, 86, 91, 130, @@ -1735,7 +1891,7 @@ pub mod summa { 17, 97, 5, - 130, + 163, 87, 130, 144, @@ -1761,11 +1917,11 @@ pub mod summa { 84, 97, 5, - 180, + 213, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, @@ -1804,19 +1960,19 @@ pub mod summa { 128, 84, 97, - 5, - 224, + 6, + 1, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, 21, 97, 6, - 45, + 78, 87, 128, 96, @@ -1824,7 +1980,7 @@ pub mod summa { 16, 97, 6, - 2, + 35, 87, 97, 1, @@ -1843,7 +1999,7 @@ pub mod summa { 145, 97, 6, - 45, + 78, 86, 91, 130, @@ -1877,7 +2033,7 @@ pub mod summa { 17, 97, 6, - 16, + 49, 87, 130, 144, @@ -1903,11 +2059,11 @@ pub mod summa { 84, 97, 6, - 66, + 99, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, @@ -1947,18 +2103,18 @@ pub mod summa { 84, 97, 6, - 110, + 143, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, 21, 97, 6, - 187, + 220, 87, 128, 96, @@ -1966,7 +2122,7 @@ pub mod summa { 16, 97, 6, - 144, + 177, 87, 97, 1, @@ -1985,7 +2141,7 @@ pub mod summa { 145, 97, 6, - 187, + 220, 86, 91, 130, @@ -2019,7 +2175,7 @@ pub mod summa { 17, 97, 6, - 158, + 191, 87, 130, 144, @@ -2045,11 +2201,11 @@ pub mod summa { 84, 97, 6, - 208, + 241, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, @@ -2088,19 +2244,19 @@ pub mod summa { 128, 84, 97, - 6, - 252, + 7, + 29, 144, 97, - 19, - 131, + 24, + 39, 86, 91, 128, 21, 97, 7, - 73, + 106, 87, 128, 96, @@ -2108,7 +2264,7 @@ pub mod summa { 16, 97, 7, - 30, + 63, 87, 97, 1, @@ -2127,7 +2283,7 @@ pub mod summa { 145, 97, 7, - 73, + 106, 86, 91, 130, @@ -2161,7 +2317,7 @@ pub mod summa { 17, 97, 7, - 44, + 77, 87, 130, 144, @@ -2185,10 +2341,10 @@ pub mod summa { 91, 97, 7, - 91, + 124, 97, - 11, - 126, + 16, + 32, 86, 91, 96, @@ -2201,7 +2357,7 @@ pub mod summa { 21, 97, 9, - 194, + 218, 87, 96, 0, @@ -2213,14 +2369,14 @@ pub mod summa { 16, 97, 7, - 123, + 156, 87, 97, 7, - 123, + 156, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2243,12 +2399,12 @@ pub mod summa { 1, 97, 7, - 151, + 184, 145, 144, 97, - 19, - 189, + 24, + 97, 86, 91, 96, @@ -2281,7 +2437,7 @@ pub mod summa { 129, 82, 96, - 2, + 3, 144, 147, 82, @@ -2295,7 +2451,7 @@ pub mod summa { 21, 97, 8, - 13, + 46, 87, 96, 64, @@ -2366,56 +2522,27 @@ pub mod summa { 1, 97, 2, - 34, - 86, - 91, - 97, - 8, - 24, - 131, - 96, - 1, 97, - 18, - 49, 86, 91, 96, - 0, - 131, - 129, - 82, - 96, 2, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 85, - 131, + 132, + 132, + 129, 81, - 96, - 1, - 144, - 133, - 144, - 133, - 144, 129, 16, 97, 8, - 62, + 66, 87, 97, 8, - 62, + 66, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2460,12 +2587,12 @@ pub mod summa { 144, 97, 8, - 112, + 116, 144, 130, 97, - 20, - 31, + 24, + 204, 86, 91, 80, @@ -2481,12 +2608,12 @@ pub mod summa { 144, 97, 8, - 133, + 137, 144, 130, 97, - 20, - 31, + 24, + 204, 86, 91, 80, @@ -2502,12 +2629,12 @@ pub mod summa { 144, 97, 8, - 154, + 158, 144, 130, 97, - 20, - 31, + 24, + 204, 86, 91, 80, @@ -2523,33 +2650,53 @@ pub mod summa { 144, 97, 8, - 175, + 179, 144, 130, 97, - 20, - 31, + 24, + 204, 86, 91, 80, 80, + 96, + 2, + 84, + 96, + 0, + 132, + 129, + 82, + 96, + 3, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 85, 80, 131, - 131, - 129, 81, + 132, + 144, + 132, + 144, 129, 16, 97, 8, - 196, + 220, 87, 97, 8, - 196, + 220, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2573,7 +2720,7 @@ pub mod summa { 21, 97, 9, - 0, + 24, 87, 80, 131, @@ -2583,15 +2730,15 @@ pub mod summa { 129, 16, 97, - 8, - 238, + 9, + 6, 87, 97, - 8, - 238, + 9, + 6, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2616,7 +2763,7 @@ pub mod summa { 21, 97, 9, - 43, + 67, 87, 80, 131, @@ -2627,14 +2774,14 @@ pub mod summa { 16, 97, 9, - 25, + 49, 87, 97, 9, - 25, + 49, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2659,7 +2806,7 @@ pub mod summa { 21, 97, 9, - 86, + 110, 87, 80, 131, @@ -2670,14 +2817,14 @@ pub mod summa { 16, 97, 9, - 68, + 92, 87, 97, 9, - 68, + 92, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2700,7 +2847,7 @@ pub mod summa { 91, 97, 9, - 173, + 197, 87, 96, 64, @@ -2782,7 +2929,7 @@ pub mod summa { 1, 97, 2, - 34, + 97, 86, 91, 80, @@ -2791,11 +2938,11 @@ pub mod summa { 128, 97, 9, - 186, + 210, 144, 97, - 18, - 90, + 25, + 140, 86, 91, 145, @@ -2803,7 +2950,7 @@ pub mod summa { 80, 97, 7, - 94, + 127, 86, 91, 80, @@ -2845,13 +2992,13 @@ pub mod summa { 64, 81, 97, - 9, - 242, + 10, + 10, 145, 144, 97, - 20, - 223, + 25, + 165, 86, 91, 96, @@ -2876,14 +3023,14 @@ pub mod summa { 16, 97, 10, - 18, + 42, 87, 97, 10, - 18, + 42, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -2895,7 +3042,7 @@ pub mod summa { 1, 81, 96, - 3, + 4, 96, 0, 132, @@ -2913,11 +3060,14 @@ pub mod summa { 96, 0, 32, + 96, + 0, + 1, 84, 20, 97, 10, - 110, + 137, 87, 96, 64, @@ -2975,45 +3125,232 @@ pub mod summa { 1, 97, 2, - 34, + 97, 86, 91, 96, - 64, + 2, + 91, + 131, 81, - 99, + 129, + 16, + 21, + 97, 11, - 210, - 5, - 169, + 67, + 87, + 131, + 129, + 129, + 81, + 129, + 16, + 97, + 10, + 167, + 87, + 97, + 10, + 167, + 97, + 24, + 17, + 86, + 91, 96, - 228, - 27, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 96, + 4, + 96, + 0, + 133, 129, 82, 96, + 32, 1, + 144, + 129, + 82, 96, + 32, 1, 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 0, + 32, + 96, + 1, + 1, + 96, + 2, + 131, + 97, + 10, + 210, + 145, + 144, + 97, + 23, + 248, + 86, + 91, + 129, + 84, + 129, + 16, + 97, + 10, + 226, + 87, + 97, + 10, + 226, + 97, + 24, + 17, + 86, + 91, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 1, + 84, + 20, + 97, + 11, + 49, + 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 20, + 96, + 36, + 130, + 1, + 82, + 115, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 114, + 111, + 111, + 116, + 32, + 98, + 97, + 108, + 97, + 110, + 99, + 101, + 96, + 96, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 97, + 86, + 91, + 128, + 97, + 11, + 59, + 129, + 97, + 25, + 140, + 86, + 91, + 145, + 80, + 80, + 97, + 10, + 140, + 86, + 91, + 80, + 96, + 64, + 81, + 99, + 11, + 210, + 5, + 169, + 96, + 228, + 27, + 129, + 82, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 127, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 0, 0, @@ -3041,8 +3378,8 @@ pub mod summa { 144, 144, 97, - 10, - 188, + 11, + 146, 144, 134, 144, @@ -3052,8 +3389,8 @@ pub mod summa { 4, 1, 97, - 19, - 10, + 26, + 66, 86, 91, 96, @@ -3072,8 +3409,8 @@ pub mod summa { 128, 21, 97, - 10, - 217, + 11, + 175, 87, 61, 96, @@ -3112,13 +3449,13 @@ pub mod summa { 1, 144, 97, - 10, - 253, + 11, + 211, 145, 144, 97, - 19, - 97, + 26, + 103, 86, 91, 148, @@ -3131,25 +3468,19 @@ pub mod summa { 91, 97, 11, - 13, + 227, 97, - 11, - 126, + 16, + 32, 86, 91, + 131, 96, - 1, - 96, - 1, - 96, - 160, - 27, + 0, 3, - 129, - 22, 97, - 11, - 114, + 12, + 38, 87, 96, 64, @@ -3171,102 +3502,53 @@ pub mod summa { 1, 82, 96, - 38, + 16, 96, 36, 130, 1, 82, - 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, - 32, - 110, - 101, - 119, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 105, - 115, - 32, - 116, - 104, - 101, - 32, - 122, - 101, - 114, 111, - 32, - 97, - 96, - 68, - 130, - 1, - 82, - 101, - 100, - 100, - 114, - 101, - 115, - 115, - 96, - 208, - 27, + 18, + 91, + 157, + 152, + 91, + 26, + 89, + 8, + 19, + 84, + 213, + 8, + 28, + 155, + 219, + 221, 96, - 100, + 130, + 27, + 96, + 68, 130, 1, 82, 96, - 132, + 100, 1, 97, 2, - 34, - 86, - 91, - 97, - 11, - 123, - 129, 97, - 11, - 216, 86, 91, - 80, - 86, - 91, - 96, - 0, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 22, - 51, + 129, + 81, + 131, + 81, 20, 97, - 4, - 241, + 12, + 149, 87, 96, 64, @@ -3286,894 +3568,868 @@ pub mod summa { 4, 130, 1, - 129, - 144, 82, 96, + 53, + 96, 36, 130, 1, 82, 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, + 82, + 111, + 111, + 116, 32, - 99, - 97, 108, + 105, + 97, + 98, + 105, 108, + 105, + 116, + 105, 101, - 114, + 115, 32, - 105, + 115, + 117, + 109, 115, 32, + 97, 110, - 111, - 116, - 32, - 116, - 104, - 101, + 100, 32, - 111, - 119, - 110, - 101, - 114, + 108, + 105, + 97, + 98, + 105, + 108, 96, 68, 130, 1, 82, + 116, + 13, + 46, + 141, + 44, + 174, + 100, + 13, + 206, + 173, + 172, + 76, + 174, + 68, + 13, + 173, + 46, + 109, + 172, + 46, + 140, + 109, + 96, + 91, + 27, 96, 100, + 130, + 1, + 82, + 96, + 132, 1, 97, 2, - 34, + 97, 86, 91, 96, 0, + 130, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 12, + 177, + 87, + 97, + 12, + 177, + 97, + 19, + 25, + 86, + 91, + 96, + 64, + 81, + 144, + 128, + 130, + 82, 128, - 84, 96, - 1, + 32, + 2, 96, + 32, + 1, + 130, 1, 96, - 160, - 27, - 3, - 131, + 64, + 82, + 128, + 21, + 97, + 12, + 228, + 87, 129, - 22, 96, + 32, 1, + 91, + 96, + 96, + 129, + 82, 96, + 32, 1, + 144, 96, - 160, - 27, + 1, + 144, 3, - 25, + 144, + 129, + 97, + 12, + 207, + 87, + 144, + 80, + 91, + 80, + 144, + 80, + 96, + 0, 131, - 22, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, - 23, - 132, - 85, + 17, + 21, + 97, + 13, + 3, + 87, + 97, + 13, + 3, + 97, + 19, + 25, + 86, + 91, 96, 64, 81, - 145, 144, - 146, - 22, - 146, - 131, - 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, - 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, - 87, - 224, - 145, - 144, - 163, - 80, - 80, - 86, - 91, + 128, + 130, + 82, + 128, 96, - 0, + 32, + 2, 96, 32, + 1, 130, - 132, - 3, - 18, + 1, + 96, + 64, + 82, + 128, 21, 97, - 12, - 58, + 13, + 54, 87, + 129, 96, - 0, - 128, - 253, - 91, - 80, - 53, - 145, - 144, - 80, - 86, + 32, + 1, 91, - 99, - 78, - 72, - 123, - 113, 96, - 224, - 27, 96, - 0, + 129, 82, 96, - 65, - 96, - 4, - 82, + 32, + 1, + 144, 96, - 36, + 1, + 144, + 3, + 144, + 129, + 97, + 13, + 33, + 87, + 144, + 80, + 91, + 80, + 144, + 80, 96, 0, - 253, 91, - 96, - 64, + 132, 81, - 96, - 96, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, - 17, - 130, - 130, 16, - 23, 21, 97, - 12, - 122, + 14, + 220, + 87, + 132, + 129, + 129, + 81, + 129, + 16, + 97, + 13, + 87, 87, 97, - 12, - 122, + 13, + 87, 97, - 12, - 65, + 24, + 17, 86, 91, 96, - 64, - 82, - 144, - 86, - 91, + 32, + 2, 96, - 64, + 32, + 1, + 1, 81, 96, + 32, + 1, + 81, + 81, + 96, + 0, + 20, + 21, 128, + 21, + 97, + 13, + 147, + 87, + 80, + 132, 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, - 17, - 130, - 130, + 81, + 129, 16, - 23, - 21, 97, - 12, - 122, + 13, + 129, 87, 97, - 12, - 122, + 13, + 129, 97, - 12, - 65, + 24, + 17, 86, 91, 96, - 64, - 81, + 32, + 2, 96, - 31, - 130, + 32, + 1, 1, + 81, 96, - 31, - 25, - 22, - 129, + 0, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, + 81, + 81, + 96, + 0, + 20, 21, + 91, 97, - 12, - 204, + 13, + 216, 87, - 97, - 12, - 204, - 97, - 12, - 65, - 86, - 91, 96, 64, - 82, - 145, - 144, - 80, - 86, - 91, + 81, + 98, + 70, + 27, + 205, 96, - 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 130, - 17, - 21, - 97, - 12, - 238, - 87, - 97, - 12, - 238, - 97, - 12, - 65, - 86, - 91, - 80, - 96, - 5, + 229, 27, + 129, + 82, 96, 32, - 1, - 144, - 86, - 91, 96, - 0, + 4, 130, + 1, + 82, 96, - 31, - 131, + 22, + 96, + 36, + 130, 1, - 18, + 82, + 117, + 73, + 110, + 118, 97, - 13, - 9, - 87, + 108, + 105, + 100, + 32, + 99, + 114, + 121, + 112, + 116, + 111, + 99, + 117, + 114, + 114, + 101, + 110, + 99, + 121, 96, - 0, - 128, - 253, + 80, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 97, + 86, 91, + 133, 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, - 17, - 21, + 81, + 129, + 16, 97, 13, - 35, + 234, 87, 97, 13, - 35, + 234, 97, - 12, - 65, + 24, + 17, 86, 91, - 97, - 13, - 54, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, 96, 32, - 1, - 97, - 12, - 163, - 86, - 91, - 129, - 129, - 82, - 132, + 2, 96, 32, - 131, - 134, 1, 1, - 17, - 21, + 81, + 96, + 0, + 3, 97, - 13, - 75, + 14, + 83, 87, 96, - 0, - 128, - 253, - 91, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, 129, + 82, 96, 32, - 133, - 1, 96, - 32, - 131, + 4, + 130, 1, - 55, + 82, 96, - 0, - 145, - 129, - 1, + 41, 96, + 36, + 130, + 1, + 82, + 127, + 65, + 108, + 108, + 32, + 114, + 111, + 111, + 116, + 32, + 115, + 117, + 109, + 115, + 32, + 115, + 104, + 111, + 117, + 108, + 100, + 32, + 98, + 101, + 32, + 103, + 114, + 101, + 97, + 116, + 101, + 114, 32, + 96, + 68, + 130, 1, - 145, - 144, - 145, 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, + 104, + 116, + 104, + 97, + 110, + 32, + 122, + 101, + 114, + 111, 96, - 0, - 128, + 184, + 27, 96, - 0, - 128, + 100, + 130, + 1, + 82, 96, - 128, - 133, - 135, - 3, - 18, - 21, + 132, + 1, 97, - 13, - 126, - 87, - 96, - 0, - 128, - 253, + 2, + 97, + 86, 91, 132, - 53, - 147, - 80, - 96, - 32, - 133, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 13, - 157, - 87, - 96, - 0, - 128, - 253, - 91, 129, - 135, - 1, - 145, - 80, - 135, - 96, - 31, - 131, - 1, - 18, + 129, + 81, + 129, + 16, 97, - 13, - 177, + 14, + 101, 87, - 96, - 0, - 128, - 253, - 91, - 97, - 13, - 195, - 97, - 13, - 190, - 131, - 53, 97, - 12, - 212, - 86, - 91, + 14, + 101, 97, - 12, - 163, + 24, + 17, 86, 91, - 130, - 53, - 128, - 130, - 82, 96, 32, - 128, - 131, - 1, - 146, - 145, + 2, 96, - 5, - 27, - 133, + 32, 1, 1, - 138, - 129, - 17, - 21, - 97, - 13, - 226, - 87, + 81, 96, 0, - 128, - 253, - 91, - 96, - 32, - 133, 1, - 91, + 81, + 131, + 130, 129, + 81, 129, 16, - 21, 97, 14, - 132, + 131, 87, - 132, - 129, - 53, - 17, - 21, 97, - 13, - 253, - 87, - 96, - 0, - 128, - 253, + 14, + 131, + 97, + 24, + 17, + 86, 91, - 128, - 53, - 134, - 1, - 96, 96, - 129, - 142, - 3, + 32, + 2, 96, - 31, - 25, + 32, 1, - 18, - 21, + 1, + 129, + 144, + 82, + 80, + 132, + 129, + 129, + 81, + 129, + 16, 97, 14, - 21, + 160, 87, - 96, - 0, - 128, - 253, - 91, 97, 14, - 29, + 160, 97, - 12, - 87, + 24, + 17, 86, 91, 96, 32, - 130, + 2, + 96, + 32, 1, - 53, - 135, + 1, + 81, + 96, + 32, + 1, + 81, + 130, + 130, 129, - 17, - 21, + 81, + 129, + 16, 97, 14, - 47, + 190, 87, - 96, - 0, - 128, - 253, - 91, 97, 14, - 62, - 143, + 190, + 97, + 24, + 17, + 86, + 91, + 96, + 32, + 2, 96, 32, - 131, - 134, 1, 1, + 129, + 144, + 82, + 80, + 128, + 128, 97, - 12, - 248, + 14, + 212, + 144, + 97, + 25, + 140, + 86, + 91, + 145, + 80, + 80, + 97, + 13, + 60, 86, 91, - 130, - 82, 80, 96, 64, - 130, + 128, + 81, + 96, + 128, + 129, 1, - 53, + 130, + 82, 135, 129, - 17, - 21, - 97, - 14, - 83, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 14, - 98, - 143, + 82, 96, 32, - 131, - 134, + 128, + 130, 1, + 136, + 129, + 82, + 130, + 132, 1, - 97, - 12, - 248, - 86, - 91, + 134, + 144, + 82, + 96, 96, - 32, 131, - 129, 1, - 145, + 133, 144, - 145, 82, 96, + 0, + 135, + 129, + 82, 96, + 4, + 131, + 82, 147, 144, 147, - 1, - 53, + 32, + 130, + 81, + 129, + 85, + 146, + 81, + 128, + 81, + 146, + 147, + 146, + 97, + 15, + 39, + 146, 96, - 64, - 131, 1, - 82, - 80, 133, - 82, - 147, - 132, 1, - 147, + 146, 1, + 144, 97, - 13, - 231, + 16, + 202, 86, 91, 80, - 144, - 150, - 80, - 80, - 80, 96, 64, - 135, + 130, 1, - 53, - 145, - 80, + 81, 128, - 130, - 17, - 21, + 81, 97, - 14, - 158, - 87, + 15, + 67, + 145, 96, - 0, - 128, - 253, - 91, - 80, - 97, - 14, - 171, - 135, - 130, - 136, + 2, + 132, + 1, + 145, + 96, + 32, + 144, + 145, 1, + 144, 97, - 12, - 248, + 17, + 21, 86, 91, - 148, - 151, - 147, - 150, 80, - 147, - 148, 96, 96, - 1, - 53, - 147, - 80, - 80, - 80, - 86, - 91, - 96, - 0, 130, - 96, - 31, - 131, 1, - 18, - 97, - 14, - 205, - 87, - 96, - 0, + 81, 128, - 253, - 91, - 129, - 53, - 96, - 32, - 97, - 14, - 221, - 97, - 13, - 190, - 131, + 81, 97, - 12, - 212, - 86, - 91, - 130, - 129, - 82, + 15, + 95, + 145, 96, - 5, - 146, - 144, - 146, - 27, + 3, 132, 1, - 129, - 1, 145, - 129, - 129, + 96, + 32, + 144, + 145, 1, 144, - 134, - 132, + 97, 17, 21, - 97, - 14, - 252, - 87, - 96, - 0, - 128, - 253, + 86, 91, + 80, + 144, + 80, + 80, 130, - 134, - 1, - 91, - 132, - 129, + 127, + 136, + 191, + 199, + 56, + 156, + 184, + 49, + 234, + 2, + 8, + 255, 16, - 21, + 109, + 166, + 245, + 201, + 248, + 128, + 54, + 186, + 8, + 79, + 30, + 176, + 8, + 210, + 120, + 141, + 61, + 69, + 153, + 141, + 135, + 135, + 135, + 96, + 64, + 81, 97, 15, - 23, - 87, - 128, - 53, - 131, - 82, - 145, - 131, - 1, + 151, + 147, + 146, 145, - 131, - 1, + 144, 97, - 15, - 0, + 26, + 137, 86, 91, - 80, - 150, - 149, + 96, + 64, + 81, + 128, + 145, + 3, + 144, + 162, 80, 80, 80, @@ -4182,2423 +4438,4956 @@ pub mod summa { 80, 86, 91, - 96, - 0, - 128, - 96, - 64, - 131, - 133, - 3, - 18, - 21, - 97, - 15, - 53, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 15, - 77, - 87, - 96, - 0, - 128, - 253, - 91, 97, 15, - 89, - 134, - 131, - 135, - 1, + 175, 97, - 12, - 248, + 16, + 32, 86, 91, - 147, - 80, 96, - 32, - 133, 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 15, - 111, - 87, 96, - 0, - 128, - 253, - 91, - 80, - 97, - 15, - 124, - 133, - 130, - 134, 1, - 97, - 14, - 188, - 86, - 91, - 145, - 80, - 80, - 146, - 80, - 146, - 144, - 80, - 86, - 91, 96, - 0, + 160, + 27, + 3, 129, + 22, + 97, + 16, + 20, + 87, + 96, + 64, 81, - 128, - 132, - 82, + 98, + 70, + 27, + 205, 96, - 0, - 91, - 129, + 229, + 27, 129, - 16, - 21, - 97, - 15, - 172, - 87, + 82, 96, 32, - 129, - 133, - 1, - 129, - 1, - 81, - 134, - 131, - 1, + 96, + 4, 130, 1, 82, - 1, - 97, - 15, - 144, - 86, - 91, - 80, 96, - 0, + 38, 96, - 32, + 36, 130, - 134, - 1, 1, 82, - 96, + 127, + 79, + 119, + 110, + 97, + 98, + 108, + 101, + 58, 32, + 110, + 101, + 119, + 32, + 111, + 119, + 110, + 101, + 114, + 32, + 105, + 115, + 32, + 116, + 104, + 101, + 32, + 122, + 101, + 114, + 111, + 32, + 97, 96, - 31, - 25, - 96, - 31, - 131, - 1, - 22, - 133, - 1, + 68, + 130, 1, - 145, - 80, - 80, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 128, - 129, 82, + 101, + 100, + 100, + 114, + 101, + 115, + 115, 96, - 0, - 97, - 15, - 223, + 208, + 27, 96, - 128, - 131, - 1, - 135, - 97, - 15, - 134, - 86, - 91, + 100, 130, - 129, - 3, + 1, + 82, 96, - 32, 132, 1, - 82, 97, - 15, - 241, - 129, - 135, + 2, 97, - 15, - 134, 86, 91, - 144, - 80, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, 97, 16, - 5, + 29, 129, - 134, 97, - 15, - 134, + 16, + 122, 86, 91, - 144, 80, - 130, + 86, + 91, + 96, + 0, + 84, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 22, + 51, + 20, + 97, + 5, + 18, + 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, 129, + 144, + 82, + 96, + 36, + 130, + 1, + 82, + 127, + 79, + 119, + 110, + 97, + 98, + 108, + 101, + 58, + 32, + 99, + 97, + 108, + 108, + 101, + 114, + 32, + 105, + 115, + 32, + 110, + 111, + 116, + 32, + 116, + 104, + 101, + 32, + 111, + 119, + 110, + 101, + 114, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 97, + 86, + 91, + 96, + 0, + 128, + 84, + 96, + 1, + 96, + 1, + 96, + 160, + 27, 3, + 131, + 129, + 22, + 96, + 1, + 96, + 1, 96, + 160, + 27, + 3, + 25, + 131, + 22, + 129, + 23, + 132, + 85, 96, + 64, + 81, + 145, + 144, + 146, + 22, + 146, + 131, + 145, + 127, + 139, + 224, + 7, + 156, + 83, + 22, + 89, + 20, + 19, + 68, + 205, + 31, + 208, + 164, + 242, 132, + 25, + 73, + 127, + 151, + 34, + 163, + 218, + 175, + 227, + 180, + 24, + 111, + 107, + 100, + 87, + 224, + 145, + 144, + 163, + 80, + 80, + 86, + 91, + 130, + 128, + 84, + 130, + 130, + 85, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 129, + 1, + 146, + 130, + 21, + 97, + 17, + 5, + 87, + 145, + 96, + 32, + 2, + 130, + 1, + 91, + 130, + 129, + 17, + 21, + 97, + 17, + 5, + 87, + 130, + 81, + 130, + 85, + 145, + 96, + 32, + 1, + 145, + 144, + 96, 1, + 1, + 144, + 97, + 16, + 234, + 86, + 91, + 80, + 97, + 17, + 17, + 146, + 145, + 80, + 97, + 17, + 103, + 86, + 91, + 80, + 144, + 86, + 91, + 130, + 128, + 84, + 130, + 130, + 85, + 144, + 96, + 0, 82, + 96, + 32, + 96, + 0, + 32, + 144, + 129, + 1, + 146, + 130, + 21, + 97, + 17, + 91, + 87, + 145, + 96, + 32, + 2, + 130, + 1, + 91, + 130, + 129, + 17, + 21, + 97, + 17, + 91, + 87, + 130, + 81, + 130, + 144, + 97, + 17, + 75, + 144, + 130, + 97, + 24, + 204, + 86, + 91, + 80, + 145, + 96, + 32, + 1, + 145, + 144, + 96, + 1, + 1, + 144, + 97, + 17, + 53, + 86, + 91, + 80, + 97, + 17, + 17, + 146, + 145, + 80, + 97, + 17, + 124, + 86, + 91, + 91, + 128, + 130, + 17, + 21, + 97, + 17, + 17, + 87, + 96, + 0, + 129, + 85, + 96, + 1, + 1, + 97, + 17, + 104, + 86, + 91, + 128, + 130, + 17, + 21, + 97, + 17, + 17, + 87, + 96, + 0, + 97, + 17, + 144, + 130, + 130, + 97, + 17, + 153, + 86, + 91, + 80, + 96, + 1, + 1, + 97, + 17, + 124, + 86, + 91, + 80, + 128, + 84, + 97, + 17, + 165, + 144, + 97, + 24, + 39, + 86, + 91, + 96, + 0, + 130, + 85, + 128, + 96, + 31, + 16, + 97, + 17, + 181, + 87, + 80, + 80, + 86, + 91, + 96, + 31, + 1, + 96, + 32, + 144, + 4, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 129, + 1, + 144, + 97, + 16, + 29, + 145, + 144, + 97, + 17, + 103, + 86, + 91, + 96, + 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 17, + 229, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 53, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 91, + 131, + 129, + 16, + 21, + 97, + 18, + 7, + 87, + 129, + 129, + 1, + 81, + 131, + 130, + 1, + 82, + 96, + 32, + 1, + 97, + 17, + 239, + 86, + 91, + 80, + 80, + 96, + 0, + 145, + 1, + 82, + 86, + 91, + 96, + 0, + 129, + 81, + 128, + 132, + 82, + 97, + 18, + 40, + 129, + 96, + 32, + 134, + 1, + 96, + 32, + 134, + 1, + 97, + 17, + 236, + 86, + 91, + 96, + 31, + 1, + 96, + 31, + 25, + 22, + 146, + 144, + 146, + 1, + 96, + 32, + 1, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 0, + 129, + 81, + 96, + 128, + 132, + 82, + 97, + 18, + 81, + 96, + 128, + 133, + 1, + 130, + 97, + 18, + 16, + 86, + 91, + 144, + 80, + 96, + 32, + 131, + 1, + 81, + 132, + 130, + 3, + 96, + 32, + 134, + 1, + 82, + 97, + 18, + 106, + 130, + 130, + 97, + 18, + 16, + 86, + 91, + 145, + 80, + 80, + 96, + 64, + 131, + 1, + 81, + 132, + 130, + 3, + 96, + 64, + 134, + 1, + 82, + 97, + 18, + 132, + 130, + 130, + 97, + 18, + 16, + 86, + 91, + 145, + 80, + 80, + 96, + 96, + 131, + 1, + 81, + 132, + 130, + 3, + 96, + 96, + 134, + 1, + 82, + 97, + 18, + 158, + 130, + 130, + 97, + 18, + 16, + 86, + 91, + 149, + 148, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 32, + 129, + 82, + 96, + 0, + 97, + 18, + 186, + 96, + 32, + 131, + 1, + 132, + 97, + 18, + 60, + 86, + 91, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 96, + 128, + 129, + 82, + 96, + 0, + 97, + 18, + 212, + 96, + 128, + 131, + 1, + 135, + 97, + 18, + 16, + 86, + 91, + 130, + 129, + 3, + 96, + 32, + 132, + 1, + 82, + 97, + 18, + 230, + 129, + 135, + 97, + 18, + 16, + 86, + 91, + 144, + 80, + 130, + 129, + 3, + 96, + 64, + 132, + 1, + 82, + 97, + 18, + 250, + 129, + 134, + 97, + 18, + 16, + 86, + 91, + 144, + 80, + 130, + 129, + 3, + 96, + 96, + 132, + 1, + 82, + 97, + 19, + 14, + 129, + 133, + 97, + 18, + 16, + 86, + 91, + 151, + 150, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 65, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 96, + 64, + 81, + 96, + 128, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 19, + 82, + 87, + 97, + 19, + 82, + 97, + 19, + 25, + 86, + 91, + 96, + 64, + 82, + 144, + 86, + 91, + 96, + 64, + 128, + 81, + 144, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 19, + 82, + 87, + 97, + 19, + 82, + 97, + 19, + 25, + 86, + 91, + 96, + 64, + 81, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 19, + 164, + 87, + 97, + 19, + 164, + 97, + 19, + 25, + 86, + 91, + 96, + 64, + 82, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 130, + 17, + 21, + 97, + 19, + 198, + 87, + 97, + 19, + 198, + 97, + 19, + 25, + 86, + 91, + 80, + 96, + 5, + 27, + 96, + 32, + 1, + 144, + 86, + 91, + 96, + 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 19, + 225, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 19, + 251, + 87, + 97, + 19, + 251, + 97, + 19, + 25, + 86, + 91, + 97, + 20, + 14, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 96, + 32, + 1, + 97, + 19, + 123, + 86, + 91, + 129, + 129, + 82, + 132, + 96, + 32, + 131, + 134, + 1, + 1, + 17, + 21, + 97, + 20, + 35, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 96, + 32, + 133, + 1, + 96, + 32, + 131, + 1, + 55, + 96, + 0, + 145, + 129, + 1, + 96, + 32, + 1, + 145, + 144, + 145, + 82, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 96, + 32, + 128, + 131, + 133, + 3, + 18, + 21, + 97, + 20, + 83, + 87, + 96, + 0, + 128, + 253, + 91, + 130, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, + 97, + 20, + 107, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 133, + 1, + 145, + 80, + 133, + 96, + 31, + 131, + 1, + 18, + 97, + 20, + 127, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 97, + 20, + 146, + 97, + 20, + 141, + 130, + 97, + 19, + 172, + 86, + 91, + 97, + 19, + 123, + 86, + 91, + 129, + 129, + 82, + 96, + 5, + 145, + 144, + 145, + 27, + 131, + 1, + 132, + 1, + 144, + 132, + 129, + 1, + 144, + 136, + 131, + 17, + 21, + 97, + 20, + 177, + 87, + 96, + 0, + 128, + 253, + 91, + 133, + 133, + 1, + 91, + 131, + 129, + 16, + 21, + 97, + 21, + 146, + 87, + 128, + 53, + 133, + 129, + 17, + 21, + 97, + 20, + 204, + 87, + 96, + 0, + 128, + 253, + 91, + 134, + 1, + 96, + 128, + 129, + 140, + 3, + 96, + 31, + 25, + 1, + 18, + 21, + 97, + 20, + 227, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 20, + 235, + 97, + 19, + 47, + 86, + 91, + 136, + 130, + 1, + 53, + 135, + 129, + 17, + 21, + 97, + 20, + 253, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 11, + 141, + 139, + 131, + 134, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 130, + 82, + 80, + 96, + 64, + 128, + 131, + 1, + 53, + 136, + 129, + 17, + 21, + 97, + 21, + 34, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 48, + 142, + 140, + 131, + 135, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 139, + 132, + 1, + 82, + 80, + 96, + 96, + 128, + 132, + 1, + 53, + 137, + 129, + 17, + 21, + 97, + 21, + 73, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 87, + 143, + 141, + 131, + 136, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 131, + 133, + 1, + 82, + 80, + 96, + 128, + 132, + 1, + 53, + 145, + 80, + 136, + 130, + 17, + 21, + 97, + 21, + 113, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 127, + 142, + 140, + 132, + 135, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 144, + 131, + 1, + 82, + 80, + 132, + 82, + 80, + 145, + 134, + 1, + 145, + 134, + 1, + 97, + 20, + 181, + 86, + 91, + 80, + 152, + 151, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 21, + 176, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 96, + 32, + 97, + 21, + 192, + 97, + 20, + 141, + 131, + 97, + 19, + 172, + 86, + 91, + 130, + 129, + 82, + 96, + 5, + 146, + 144, + 146, + 27, + 132, + 1, + 129, + 1, + 145, + 129, + 129, + 1, + 144, + 134, + 132, + 17, + 21, + 97, + 21, + 223, + 87, + 96, + 0, + 128, + 253, + 91, + 130, + 134, + 1, + 91, + 132, + 129, + 16, + 21, + 97, + 21, + 250, + 87, + 128, + 53, + 131, + 82, + 145, + 131, + 1, + 145, + 131, + 1, + 97, + 21, + 227, + 86, + 91, + 80, + 150, + 149, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 128, + 96, + 0, + 96, + 96, + 132, + 134, + 3, + 18, + 21, + 97, + 22, + 26, + 87, + 96, + 0, + 128, + 253, + 91, + 131, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, + 97, + 22, + 50, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 22, + 62, + 135, + 131, + 136, + 1, + 97, + 19, + 208, + 86, + 91, + 148, + 80, + 96, + 32, + 134, + 1, + 53, + 145, + 80, + 128, + 130, + 17, + 21, + 97, + 22, + 84, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 97, + 22, + 97, + 134, + 130, + 135, + 1, + 97, + 21, + 159, + 86, + 91, + 146, + 80, + 80, + 96, + 64, + 132, + 1, + 53, + 144, + 80, + 146, + 80, + 146, + 80, + 146, + 86, + 91, + 96, + 0, + 128, + 96, + 0, + 128, + 96, + 128, + 133, + 135, + 3, + 18, + 21, + 97, + 22, + 136, + 87, + 96, + 0, + 128, + 253, + 91, + 132, + 53, + 147, + 80, + 96, + 32, + 133, + 1, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, + 97, + 22, + 167, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 22, + 179, + 136, + 131, + 137, + 1, + 97, + 21, + 159, + 86, + 91, + 148, + 80, + 96, + 64, + 135, + 1, + 53, + 145, + 80, + 128, + 130, + 17, + 21, + 97, + 22, + 201, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 135, + 1, + 145, + 80, + 135, + 96, + 31, + 131, + 1, + 18, + 97, + 22, + 221, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 22, + 234, + 97, + 20, + 141, + 131, + 53, + 97, + 19, + 172, + 86, + 91, + 130, + 53, + 128, + 130, + 82, + 96, + 32, + 128, + 131, + 1, + 146, + 145, + 96, + 5, + 27, + 133, + 1, + 1, + 138, + 129, + 17, + 21, + 97, + 23, + 9, + 87, + 96, + 0, + 128, + 253, + 91, + 96, + 32, + 133, + 1, + 91, + 129, + 129, + 16, + 21, + 97, + 23, + 165, + 87, + 132, + 129, + 53, + 17, + 21, + 97, + 23, + 36, + 87, + 96, + 0, + 128, + 253, + 91, + 128, + 53, + 134, + 1, + 96, + 64, + 129, + 142, + 3, + 96, + 31, + 25, + 1, + 18, + 21, + 97, + 23, + 60, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 23, + 68, + 97, + 19, + 88, + 86, + 91, + 96, + 32, + 130, + 1, + 53, + 135, + 129, + 17, + 21, + 97, + 23, + 86, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 23, + 101, + 143, + 96, + 32, + 131, + 134, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 130, + 82, + 80, + 96, + 64, + 130, + 1, + 53, + 135, + 129, + 17, + 21, + 97, + 23, + 122, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 23, + 137, + 143, + 96, + 32, + 131, + 134, + 1, + 1, + 97, + 19, + 208, + 86, + 91, + 96, + 32, + 131, + 1, + 82, + 80, + 128, + 134, + 82, + 80, + 80, + 96, + 32, + 132, + 1, + 147, + 80, + 96, + 32, + 129, + 1, + 144, + 80, + 97, + 23, + 14, + 86, + 91, + 80, + 151, + 154, + 150, + 153, + 80, + 151, + 96, + 96, + 1, + 53, + 150, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 23, + 203, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 129, + 22, + 129, + 20, + 97, + 18, + 186, + 87, + 96, + 0, + 128, + 253, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 17, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 129, + 129, + 3, + 129, + 129, + 17, + 21, + 97, + 24, + 11, + 87, + 97, + 24, + 11, + 97, + 23, + 226, + 86, + 91, + 146, + 145, + 80, + 80, + 86, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 50, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 96, + 1, + 129, + 129, + 28, + 144, + 130, + 22, + 128, + 97, + 24, + 59, + 87, + 96, + 127, + 130, + 22, + 145, + 80, + 91, + 96, + 32, + 130, + 16, + 129, + 3, + 97, + 24, + 91, + 87, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 34, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 80, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 130, + 81, + 97, + 24, + 115, + 129, + 132, + 96, + 32, + 135, + 1, + 97, + 17, + 236, + 86, + 91, + 145, + 144, + 145, + 1, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 31, + 130, + 17, + 21, + 97, + 24, + 199, + 87, + 96, + 0, + 129, + 129, + 82, + 96, + 32, + 129, + 32, + 96, + 31, + 133, + 1, + 96, + 5, + 28, + 129, + 1, + 96, + 32, + 134, + 16, + 21, + 97, + 24, + 164, + 87, + 80, + 128, + 91, + 96, + 31, + 133, + 1, + 96, + 5, + 28, + 130, + 1, + 145, + 80, + 91, + 129, + 129, + 16, + 21, + 97, + 24, + 195, + 87, + 130, + 129, + 85, + 96, + 1, + 1, + 97, + 24, + 176, + 86, + 91, + 80, + 80, + 80, + 91, + 80, + 80, + 80, + 86, + 91, + 129, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 24, + 230, + 87, + 97, + 24, + 230, + 97, + 19, + 25, + 86, + 91, + 97, + 24, + 250, + 129, + 97, + 24, + 244, + 132, + 84, + 97, + 24, + 39, + 86, + 91, + 132, + 97, + 24, + 125, + 86, + 91, + 96, + 32, + 128, + 96, + 31, + 131, + 17, + 96, + 1, + 129, + 20, + 97, + 25, + 47, + 87, + 96, + 0, + 132, + 21, + 97, + 25, + 23, + 87, + 80, + 133, + 131, + 1, + 81, + 91, + 96, + 0, + 25, + 96, + 3, + 134, + 144, + 27, + 28, + 25, + 22, + 96, + 1, + 133, + 144, + 27, + 23, + 133, + 85, + 97, + 24, + 195, + 86, + 91, + 96, + 0, + 133, + 129, + 82, + 96, + 32, + 129, + 32, + 96, + 31, + 25, + 134, + 22, + 145, + 91, + 130, + 129, + 16, + 21, + 97, + 25, + 94, + 87, + 136, + 134, + 1, + 81, + 130, + 85, + 148, + 132, + 1, + 148, + 96, + 1, + 144, + 145, + 1, + 144, + 132, + 1, + 97, + 25, + 63, + 86, + 91, + 80, + 133, + 130, + 16, + 21, + 97, + 25, + 124, + 87, + 135, + 133, + 1, + 81, + 96, + 0, + 25, + 96, + 3, + 136, + 144, + 27, + 96, + 248, + 22, + 28, + 25, + 22, + 129, + 85, + 91, + 80, + 80, + 80, + 80, + 80, + 96, + 1, + 144, + 129, + 27, + 1, + 144, + 85, + 80, + 86, + 91, + 96, + 0, + 96, + 1, + 130, + 1, + 97, + 25, + 158, + 87, + 97, + 25, + 158, + 97, + 23, + 226, + 86, + 91, + 80, + 96, + 1, + 1, + 144, + 86, + 91, + 96, + 0, + 96, + 32, + 128, + 131, + 1, + 129, + 132, + 82, + 128, + 133, + 81, + 128, + 131, + 82, + 96, + 64, + 134, + 1, + 145, + 80, + 96, + 64, + 129, + 96, + 5, + 27, + 135, + 1, + 1, + 146, + 80, + 131, + 135, + 1, + 96, + 0, + 91, + 130, + 129, + 16, + 21, + 97, + 25, + 250, + 87, + 96, + 63, + 25, + 136, + 134, + 3, + 1, + 132, + 82, + 97, + 25, + 232, + 133, + 131, + 81, + 97, + 18, + 60, + 86, + 91, + 148, + 80, + 146, + 133, + 1, + 146, + 144, + 133, + 1, + 144, + 96, + 1, + 1, + 97, + 25, + 204, + 86, + 91, + 80, + 146, + 151, + 150, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 129, + 81, + 128, + 132, + 82, + 96, + 32, + 128, + 133, + 1, + 148, + 80, + 128, + 132, + 1, + 96, + 0, + 91, + 131, + 129, + 16, + 21, + 97, + 26, + 55, + 87, + 129, + 81, + 135, + 82, + 149, + 130, + 1, + 149, + 144, + 130, + 1, + 144, + 96, + 1, + 1, + 97, + 26, + 27, + 86, + 91, + 80, + 148, + 149, + 148, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 64, + 129, + 82, + 96, + 0, + 97, + 26, + 85, + 96, + 64, + 131, + 1, + 133, + 97, + 26, + 7, + 86, + 91, + 130, + 129, + 3, + 96, + 32, + 132, + 1, + 82, + 97, + 18, + 158, + 129, + 133, + 97, + 18, + 16, + 86, + 91, + 96, + 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 26, + 121, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 81, + 128, + 21, + 21, + 129, + 20, + 97, + 18, + 186, + 87, + 96, + 0, + 128, + 253, + 91, + 131, + 129, + 82, + 96, + 0, + 96, + 32, + 96, + 96, + 129, + 132, + 1, + 82, + 97, + 26, + 163, + 96, + 96, + 132, + 1, + 134, + 97, + 26, + 7, + 86, + 91, + 96, + 64, + 132, + 130, + 3, + 129, + 134, + 1, + 82, + 129, + 134, + 81, + 128, + 132, + 82, + 132, + 132, + 1, + 145, + 80, + 132, + 129, + 96, + 5, + 27, + 133, + 1, + 1, + 133, + 137, + 1, + 96, + 0, + 91, + 131, + 129, + 16, + 21, + 97, + 27, + 21, + 87, + 134, + 131, + 3, + 96, + 31, + 25, + 1, + 133, + 82, + 129, + 81, + 128, + 81, + 135, + 133, + 82, + 97, + 26, + 233, + 136, + 134, + 1, + 130, + 97, + 18, + 16, + 86, + 91, + 145, + 138, + 1, + 81, + 133, + 131, + 3, + 134, + 140, + 1, + 82, + 145, + 144, + 80, + 97, + 27, + 1, + 129, + 131, + 97, + 18, + 16, + 86, + 91, + 150, + 138, + 1, + 150, + 148, + 80, + 80, + 80, + 144, + 135, + 1, + 144, + 96, + 1, + 1, + 97, + 26, + 197, + 86, + 91, + 80, + 144, + 155, + 154, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 254, + 162, + 100, + 105, + 112, + 102, + 115, + 88, + 34, + 18, + 32, + 69, + 217, + 51, + 111, + 11, + 99, + 20, + 121, + 100, + 150, + 199, + 161, + 207, + 22, + 12, + 25, + 180, + 42, + 97, + 148, + 58, + 144, + 251, + 91, + 190, + 44, + 252, + 239, + 16, + 123, + 181, + 219, + 100, + 115, + 111, + 108, + 99, + 67, + 0, + 8, + 18, + 0, + 51, + ]; + ///The bytecode of the contract. + pub static SUMMA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( + __BYTECODE, + ); + #[rustfmt::skip] + const __DEPLOYED_BYTECODE: &[u8] = &[ + 96, + 128, + 96, + 64, + 82, + 52, + 128, + 21, + 97, + 0, + 16, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 96, + 4, + 54, + 16, + 97, + 0, + 158, + 87, + 96, + 0, + 53, + 96, + 224, + 28, + 128, + 99, + 163, + 196, + 188, + 248, + 17, + 97, + 0, + 102, + 87, + 128, + 99, + 163, + 196, + 188, + 248, + 20, + 97, + 1, + 105, + 87, + 128, + 99, + 199, + 221, + 202, + 14, + 20, + 97, + 1, + 140, + 87, + 128, + 99, + 200, + 229, + 129, + 71, + 20, + 97, + 1, + 159, + 87, + 128, + 99, + 218, + 100, + 167, + 80, + 20, + 97, + 1, + 194, + 87, + 128, + 99, + 242, + 253, + 227, + 139, + 20, 97, - 16, + 1, + 213, + 87, + 96, + 0, + 128, + 253, + 91, + 128, + 99, 25, - 129, - 133, + 179, + 57, + 104, + 20, 97, - 15, - 134, - 86, - 91, + 0, + 163, + 87, + 128, + 99, + 73, + 206, + 137, 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, + 20, + 97, + 0, + 204, + 87, + 128, + 99, + 113, 80, - 86, - 91, - 96, + 24, + 166, + 20, + 97, 0, - 96, - 32, + 250, + 87, 128, - 131, - 133, - 3, - 18, - 21, + 99, + 121, + 80, + 44, + 85, + 20, 97, - 16, - 55, + 1, + 4, 87, - 96, - 0, 128, - 253, + 99, + 141, + 165, + 203, 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, + 20, 97, - 16, - 79, + 1, + 78, 87, + 91, 96, 0, 128, 253, 91, - 129, - 133, - 1, - 145, - 80, - 133, + 97, + 0, + 182, + 97, + 0, + 177, + 54, 96, - 31, - 131, - 1, - 18, + 4, 97, - 16, - 99, - 87, + 17, + 211, + 86, + 91, + 97, + 1, + 232, + 86, + 91, 96, + 64, + 81, + 97, 0, + 195, + 145, + 144, + 97, + 18, + 167, + 86, + 91, + 96, + 64, + 81, 128, - 253, + 145, + 3, + 144, + 243, 91, - 129, - 53, 97, - 16, - 113, + 0, + 236, 97, - 13, - 190, - 130, + 0, + 218, + 54, + 96, + 4, 97, - 12, - 212, + 17, + 211, 86, 91, + 96, + 4, + 96, + 32, + 82, + 96, + 0, + 144, + 129, + 82, + 96, + 64, + 144, + 32, + 84, 129, + 86, + 91, + 96, + 64, + 81, + 144, 129, 82, 96, + 32, + 1, + 97, + 0, + 195, + 86, + 91, + 97, + 1, + 2, + 97, 5, + 0, + 86, + 91, + 0, + 91, + 96, + 1, + 84, + 97, + 1, + 42, + 144, + 97, + 255, + 255, + 128, + 130, + 22, 145, + 98, + 1, + 0, + 0, + 129, + 4, 144, 145, - 27, - 131, + 22, + 144, + 100, 1, + 0, + 0, + 0, + 0, + 144, + 4, + 96, + 255, + 22, + 131, + 86, + 91, + 96, + 64, + 128, + 81, + 97, + 255, + 255, + 148, + 133, + 22, + 129, + 82, + 147, + 144, + 146, + 22, + 96, + 32, 132, 1, + 82, + 96, + 255, + 22, 144, - 132, - 129, + 130, 1, - 144, - 136, - 131, - 17, - 21, - 97, - 16, - 144, - 87, + 82, + 96, 96, - 0, - 128, - 253, - 91, - 133, - 133, 1, - 91, - 131, - 129, - 16, - 21, - 97, - 17, - 113, - 87, - 128, - 53, - 133, - 129, - 17, - 21, 97, - 16, - 171, - 87, - 96, 0, - 128, - 253, + 195, + 86, 91, - 134, + 96, + 0, + 84, + 96, + 64, + 81, + 96, 1, 96, - 128, - 129, - 140, + 1, + 96, + 160, + 27, 3, + 144, + 145, + 22, + 129, + 82, 96, - 31, - 25, + 32, 1, - 18, - 21, 97, - 16, - 194, - 87, - 96, 0, - 128, - 129, - 253, - 91, - 97, - 16, - 202, - 97, - 12, - 128, + 195, 86, 91, - 136, - 130, + 97, 1, - 53, - 135, - 129, - 17, - 21, + 124, 97, - 16, - 220, - 87, + 1, + 119, + 54, 96, - 0, - 128, - 129, - 253, - 91, + 4, 97, - 16, - 234, - 141, - 139, - 131, - 134, - 1, - 1, + 17, + 211, + 86, + 91, 97, - 12, - 248, + 5, + 20, 86, 91, - 130, - 82, - 80, 96, 64, - 128, - 131, - 1, - 53, - 136, - 129, - 17, - 21, + 81, 97, - 17, - 1, - 87, - 96, 0, - 128, - 129, - 253, + 195, + 148, + 147, + 146, + 145, + 144, + 97, + 18, + 193, + 86, 91, 97, - 17, - 15, - 142, - 140, - 131, - 135, 1, + 2, + 97, 1, + 154, + 54, + 96, + 4, 97, - 12, - 248, + 20, + 64, 86, 91, - 139, - 132, - 1, - 82, - 80, - 96, - 96, - 128, - 132, - 1, - 53, - 137, - 129, - 17, - 21, 97, - 17, - 40, - 87, - 96, - 0, - 128, - 129, - 253, + 7, + 116, + 86, 91, 97, - 17, - 54, - 143, - 141, - 131, - 136, 1, + 178, + 97, 1, + 173, + 54, + 96, + 4, 97, - 12, - 248, + 22, + 5, 86, 91, - 131, - 133, - 1, + 97, + 10, + 21, + 86, + 91, + 96, + 64, + 81, + 144, + 21, + 21, + 129, 82, - 80, 96, - 128, - 132, + 32, 1, - 53, - 145, - 80, - 136, - 130, - 17, - 21, 97, - 17, - 80, - 87, - 96, 0, - 128, - 129, - 253, + 195, + 86, 91, 97, - 17, - 94, - 142, - 140, - 132, - 135, 1, + 2, + 97, 1, + 208, + 54, + 96, + 4, 97, - 12, - 248, + 22, + 114, 86, 91, - 144, - 131, - 1, - 82, - 80, - 132, - 82, - 80, - 145, - 134, + 97, + 11, + 219, + 86, + 91, + 97, 1, - 145, - 134, + 2, + 97, 1, + 227, + 54, + 96, + 4, 97, - 16, - 148, + 23, + 185, 86, 91, - 80, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, + 97, + 15, + 167, 86, 91, + 97, + 2, + 19, 96, - 0, + 64, + 81, 128, 96, - 0, + 128, + 1, 96, + 64, + 82, + 128, 96, - 132, - 134, - 3, - 18, - 21, - 97, - 17, - 147, - 87, 96, - 0, - 128, - 253, - 91, - 131, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 17, - 171, - 87, + 129, + 82, 96, - 0, - 128, - 253, - 91, - 97, - 17, - 183, - 135, - 131, - 136, + 32, 1, - 97, - 12, - 248, - 86, - 91, - 148, - 80, + 96, + 96, + 129, + 82, 96, 32, - 134, 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 17, - 205, - 87, 96, - 0, - 128, - 253, - 91, - 80, - 97, - 17, - 218, - 134, - 130, - 135, - 1, - 97, - 14, - 188, - 86, - 91, - 146, - 80, - 80, 96, - 64, - 132, + 129, + 82, + 96, + 32, 1, - 53, - 144, - 80, - 146, - 80, - 146, + 96, + 96, + 129, + 82, 80, - 146, + 144, 86, 91, 96, 0, - 96, - 32, 130, - 132, + 129, + 82, + 96, 3, - 18, - 21, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 84, 97, - 17, - 253, + 2, + 106, 87, 96, - 0, - 128, - 253, - 91, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, 129, - 53, + 82, + 96, + 32, 96, + 4, + 130, 1, + 82, + 96, + 20, 96, + 36, + 130, 1, + 82, + 115, + 16, + 89, + 25, + 28, + 153, + 92, + 220, + 200, + 27, + 155, + 221, + 8, + 29, + 153, + 92, + 154, + 89, + 154, + 89, + 89, 96, - 160, + 98, 27, - 3, - 129, - 22, - 129, - 20, - 97, - 18, - 20, - 87, 96, - 0, - 128, - 253, - 91, - 147, - 146, - 80, - 80, - 80, - 86, + 68, + 130, + 1, + 82, + 96, + 100, + 1, 91, - 99, - 78, - 72, - 123, - 113, 96, - 224, - 27, + 64, + 81, + 128, + 145, + 3, + 144, + 253, + 91, 96, 0, + 130, + 129, 82, 96, - 17, + 3, 96, - 4, + 32, 82, 96, - 36, + 64, + 144, + 32, + 84, + 96, + 2, + 144, + 97, + 2, + 136, + 144, 96, - 0, - 253, - 91, - 128, - 130, 1, - 128, - 130, - 17, - 21, + 144, 97, - 4, - 217, + 23, + 248, + 86, + 91, + 129, + 84, + 129, + 16, + 97, + 2, + 152, 87, 97, - 4, - 217, + 2, + 152, 97, - 18, - 27, + 24, + 17, 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, + 144, 96, 0, 82, 96, - 50, + 32, + 96, + 0, + 32, + 144, 96, 4, - 82, + 2, + 1, 96, - 36, + 64, + 81, + 128, 96, - 0, - 253, - 91, + 128, + 1, 96, - 0, + 64, + 82, + 144, + 129, 96, - 1, + 0, 130, 1, + 128, + 84, 97, - 18, - 108, - 87, - 97, - 18, - 108, + 2, + 193, + 144, 97, - 18, - 27, + 24, + 39, 86, 91, - 80, + 128, 96, + 31, 1, - 1, - 144, - 86, - 91, 96, - 0, - 96, - 64, + 32, 128, - 131, - 1, - 133, - 132, - 82, + 145, + 4, + 2, 96, 32, - 130, + 1, + 96, + 64, + 81, + 144, 129, - 134, 1, + 96, + 64, 82, - 129, - 134, - 81, 128, - 132, - 82, - 96, - 96, - 147, - 80, - 131, - 135, - 1, + 146, 145, - 80, - 131, + 144, 129, - 96, - 5, - 27, - 136, - 1, - 1, - 131, - 137, - 1, - 96, - 0, - 91, - 131, 129, - 16, - 21, - 97, - 18, - 250, - 87, - 137, - 131, - 3, + 82, 96, - 95, - 25, + 32, 1, - 133, - 82, - 129, - 81, + 130, 128, - 81, - 136, - 133, - 82, + 84, 97, - 18, - 197, - 137, - 134, - 1, - 130, + 2, + 237, + 144, 97, - 15, - 134, + 24, + 39, 86, 91, - 144, - 80, - 135, - 130, - 1, - 81, - 133, - 130, - 3, - 137, - 135, - 1, - 82, + 128, + 21, 97, - 18, - 220, - 130, - 130, + 3, + 58, + 87, + 128, + 96, + 31, + 16, 97, + 3, 15, - 134, - 86, - 91, - 146, - 139, - 1, - 81, - 149, - 139, - 1, - 149, - 144, - 149, - 82, - 80, - 148, - 134, - 1, - 148, - 146, - 80, - 144, - 133, + 87, + 97, 1, - 144, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, 96, + 32, 1, - 1, + 145, 97, - 18, - 161, - 86, - 91, - 80, - 144, - 154, - 153, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, + 3, + 58, 86, 91, - 96, - 64, - 128, - 130, - 82, - 131, - 81, - 144, 130, 1, - 129, + 145, 144, - 82, 96, 0, - 144, + 82, 96, 32, - 144, 96, - 96, - 132, - 1, + 0, + 32, 144, - 130, - 135, - 1, - 132, 91, - 130, 129, - 16, - 21, - 97, - 19, - 67, - 87, + 84, 129, - 81, - 132, 82, - 146, - 132, - 1, - 146, 144, - 132, + 96, + 1, 1, 144, 96, + 32, 1, - 1, - 97, - 19, - 39, - 86, - 91, - 80, - 80, - 80, + 128, 131, - 129, + 17, + 97, 3, + 29, + 87, + 130, + 144, + 3, + 96, + 31, + 22, 130, - 133, 1, - 82, - 97, - 19, - 87, - 129, - 134, - 97, - 15, - 134, - 86, + 145, 91, - 150, - 149, 80, 80, 80, 80, 80, - 80, - 86, - 91, - 96, - 0, + 129, + 82, 96, 32, + 1, + 96, + 1, 130, - 132, + 1, + 128, + 84, + 97, 3, - 18, - 21, + 83, + 144, 97, - 19, - 115, - 87, - 96, - 0, - 128, - 253, + 24, + 39, + 86, 91, - 129, - 81, 128, - 21, - 21, - 129, - 20, - 97, - 18, - 20, - 87, 96, - 0, + 31, + 1, + 96, + 32, 128, - 253, - 91, + 145, + 4, + 2, + 96, + 32, + 1, 96, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, 129, 129, - 28, - 144, + 82, + 96, + 32, + 1, 130, - 22, 128, + 84, 97, - 19, - 151, - 87, - 96, + 3, 127, - 130, - 22, - 145, - 80, + 144, + 97, + 24, + 39, + 86, 91, + 128, + 21, + 97, + 3, + 204, + 87, + 128, 96, - 32, - 130, + 31, 16, - 129, - 3, 97, - 19, - 183, + 3, + 161, 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, + 97, + 1, 0, - 82, - 96, - 34, - 96, + 128, + 131, + 84, 4, + 2, + 131, 82, - 96, - 36, - 96, - 0, - 253, - 91, - 80, 145, - 144, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 4, - 214, 96, 32, - 131, 1, - 132, + 145, 97, - 15, - 134, + 3, + 204, 86, 91, - 96, - 31, 130, - 17, - 21, - 97, - 20, - 26, - 87, + 1, + 145, + 144, 96, 0, - 129, - 129, 82, 96, 32, - 129, + 96, + 0, 32, + 144, + 91, + 129, + 84, + 129, + 82, + 144, 96, - 31, - 133, 1, - 96, - 5, - 28, - 129, 1, + 144, 96, 32, - 134, - 16, - 21, + 1, + 128, + 131, + 17, 97, - 19, - 247, + 3, + 175, 87, - 80, - 128, - 91, + 130, + 144, + 3, 96, 31, - 133, - 1, - 96, - 5, - 28, - 130, - 1, - 145, - 80, - 91, - 129, - 129, - 16, - 21, - 97, - 20, 22, - 87, 130, - 129, - 85, - 96, 1, - 1, - 97, - 20, - 3, - 86, + 145, 91, 80, 80, 80, - 91, - 80, 80, 80, - 86, - 91, - 129, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 20, - 57, - 87, - 97, - 20, - 57, - 97, - 12, - 65, - 86, - 91, - 97, - 20, - 77, 129, - 97, - 20, - 71, - 132, + 82, + 96, + 32, + 1, + 96, + 2, + 130, + 1, + 128, 84, 97, - 19, - 131, - 86, - 91, - 132, + 3, + 229, + 144, 97, - 19, - 208, + 24, + 39, 86, 91, + 128, + 96, + 31, + 1, 96, 32, 128, + 145, + 4, + 2, 96, - 31, - 131, - 17, + 32, + 1, 96, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, 129, - 20, - 97, - 20, + 129, + 82, + 96, + 32, + 1, 130, + 128, + 84, + 97, + 4, + 17, + 144, + 97, + 24, + 39, + 86, + 91, + 128, + 21, + 97, + 4, + 94, 87, + 128, 96, - 0, - 132, - 21, + 31, + 16, 97, - 20, - 106, + 4, + 51, 87, - 80, - 133, - 131, + 97, 1, - 81, - 91, - 96, 0, - 25, - 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, 96, + 32, 1, - 133, - 144, - 27, - 23, - 133, - 85, + 145, 97, - 20, - 22, + 4, + 94, 86, 91, + 130, + 1, + 145, + 144, 96, 0, - 133, - 129, 82, 96, 32, - 129, - 32, 96, - 31, - 25, - 134, - 22, - 145, + 0, + 32, + 144, 91, - 130, 129, - 16, - 21, - 97, - 20, - 177, - 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, + 84, + 129, + 82, + 144, 96, 1, - 144, - 145, 1, 144, - 132, + 96, + 32, 1, + 128, + 131, + 17, 97, - 20, - 146, - 86, - 91, - 80, - 133, - 130, - 16, - 21, - 97, - 20, - 207, + 4, + 65, 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, + 130, 144, - 27, + 3, 96, - 248, - 22, - 28, - 25, + 31, 22, - 129, - 85, + 130, + 1, + 145, 91, 80, 80, 80, 80, 80, + 129, + 82, 96, + 32, 1, - 144, - 129, - 27, + 96, + 3, + 130, 1, + 128, + 84, + 97, + 4, + 119, 144, - 85, - 80, + 97, + 24, + 39, 86, 91, + 128, 96, - 0, + 31, + 1, 96, 32, 128, - 131, - 1, - 129, - 132, - 82, - 128, - 133, - 81, - 128, - 131, - 82, - 96, - 64, - 146, - 80, - 130, - 134, - 1, 145, - 80, - 130, - 129, + 4, + 2, 96, - 5, - 27, - 135, - 1, - 1, - 132, - 136, + 32, 1, 96, - 0, - 91, - 131, + 64, + 81, + 144, 129, - 16, - 21, - 97, - 21, - 141, - 87, - 96, - 63, - 25, - 137, - 132, - 3, 1, - 133, - 82, - 129, - 81, 96, + 64, + 82, 128, + 146, + 145, + 144, 129, - 81, 129, - 134, 82, - 97, - 21, - 44, - 130, - 135, - 1, - 130, - 97, - 15, - 134, - 86, - 91, - 145, - 80, - 80, - 136, - 130, + 96, + 32, 1, - 81, - 133, 130, - 3, - 138, - 135, - 1, - 82, + 128, + 84, 97, - 21, - 68, - 130, - 130, + 4, + 163, + 144, 97, - 15, - 134, + 24, + 39, 86, 91, - 145, - 80, - 80, - 135, - 130, - 1, - 81, - 133, - 130, - 3, - 137, - 135, - 1, - 82, - 97, + 128, 21, - 92, - 130, - 130, 97, - 15, - 134, - 86, - 91, - 145, - 80, - 80, - 96, + 4, + 240, + 87, + 128, 96, + 31, + 16, + 97, + 4, + 197, + 87, + 97, + 1, + 0, 128, 131, - 1, - 81, - 146, - 80, - 133, - 130, - 3, - 129, - 135, - 1, - 82, - 80, - 97, - 21, - 121, - 129, + 84, + 4, + 2, 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 15, - 134, + 4, + 240, 86, 91, - 150, - 137, + 130, 1, - 150, - 148, - 80, - 80, - 80, + 145, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, 144, - 134, - 1, + 91, + 129, + 84, + 129, + 82, 144, 96, 1, 1, + 144, + 96, + 32, + 1, + 128, + 131, + 17, 97, - 21, - 6, - 86, + 4, + 211, + 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, 80, - 144, - 152, - 151, 80, 80, 80, 80, + 129, + 82, 80, 80, + 144, 80, + 145, + 144, 80, 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 243, - 47, - 132, - 14, - 221, - 200, - 12, - 236, - 130, - 235, - 143, + 91, + 97, 5, - 195, - 78, - 49, - 31, - 44, - 9, - 34, - 218, - 112, - 185, - 0, - 232, - 151, - 24, - 130, - 217, - 64, - 229, - 4, - 73, - 100, - 115, - 111, - 108, - 99, - 67, - 0, 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static SUMMA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, 97, - 0, 16, - 87, - 96, - 0, - 128, - 253, + 32, + 86, 91, - 80, - 96, - 4, - 54, - 16, 97, - 0, - 158, - 87, + 5, + 18, 96, 0, - 53, - 96, - 224, - 28, - 128, - 99, - 141, - 165, - 203, - 91, - 17, 97, - 0, - 102, - 87, - 128, - 99, - 141, - 165, - 203, + 16, + 122, + 86, 91, - 20, - 97, - 1, - 54, - 87, - 128, - 99, - 163, - 196, - 188, - 248, - 20, - 97, - 1, - 81, - 87, - 128, - 99, - 199, - 221, - 202, - 14, - 20, - 97, - 1, - 116, - 87, - 128, - 99, - 200, - 229, + 86, + 91, + 96, + 2, 129, - 71, - 20, - 97, - 1, - 135, - 87, - 128, - 99, - 242, - 253, - 227, - 139, - 20, + 129, + 84, + 129, + 16, 97, - 1, - 154, + 5, + 36, 87, 96, 0, 128, 253, 91, - 128, - 99, - 35, - 235, - 148, - 160, - 20, - 97, - 0, - 163, - 87, - 128, - 99, - 65, - 58, - 159, - 45, - 20, - 97, + 144, + 96, 0, - 214, - 87, - 128, - 99, - 108, - 118, - 132, - 254, - 20, - 97, + 82, + 96, + 32, + 96, 0, - 235, - 87, - 128, - 99, - 113, - 80, - 24, - 166, - 20, - 97, - 1, - 14, - 87, - 128, - 99, - 127, - 59, - 251, - 46, - 20, - 97, + 32, + 144, + 96, + 4, + 2, 1, - 22, - 87, - 91, 96, 0, + 145, + 80, + 144, + 80, 128, - 253, - 91, - 97, + 96, 0, - 195, + 1, + 128, + 84, 97, - 0, - 177, - 54, - 96, - 4, + 5, + 71, + 144, 97, - 12, - 40, + 24, + 39, 86, 91, + 128, 96, - 2, + 31, + 1, 96, 32, - 82, - 96, - 0, - 144, - 129, - 82, + 128, + 145, + 4, + 2, 96, - 64, - 144, 32, - 84, - 129, - 86, - 91, + 1, 96, 64, 81, 144, 129, - 82, - 96, - 32, 1, - 91, 96, 64, - 81, + 82, 128, + 146, 145, - 3, 144, - 243, - 91, - 97, - 0, - 233, - 97, - 0, - 228, - 54, + 129, + 129, + 82, 96, - 4, + 32, + 1, + 130, + 128, + 84, 97, - 13, - 104, - 86, - 91, + 5, + 115, + 144, 97, - 1, - 173, + 24, + 39, 86, 91, - 0, - 91, - 97, - 0, - 254, + 128, + 21, 97, - 0, - 249, - 54, + 5, + 192, + 87, + 128, 96, - 4, + 31, + 16, 97, - 15, - 34, - 86, - 91, + 5, + 149, + 87, 97, + 1, + 0, + 128, + 131, + 84, 4, - 68, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, + 2, + 131, 82, + 145, 96, 32, 1, + 145, 97, - 0, - 205, - 86, - 91, - 97, - 0, - 233, - 97, - 4, - 223, + 5, + 192, 86, 91, - 97, - 0, - 195, - 97, + 130, 1, - 36, - 54, - 96, - 4, - 97, - 12, - 40, - 86, - 91, + 145, + 144, 96, - 3, + 0, + 82, 96, 32, - 82, 96, 0, + 32, 144, + 91, 129, - 82, - 96, - 64, - 144, - 32, 84, 129, - 86, - 91, - 96, - 0, - 84, - 96, - 64, - 81, + 82, + 144, 96, 1, - 96, 1, - 96, - 160, - 27, - 3, 144, - 145, - 22, - 129, - 82, 96, 32, 1, + 128, + 131, + 17, 97, - 0, - 205, - 86, + 5, + 163, + 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, - 97, + 80, + 80, + 80, + 80, + 80, + 144, + 128, + 96, 1, - 100, - 97, 1, - 95, - 54, - 96, - 4, + 128, + 84, 97, - 12, - 40, - 86, - 91, + 5, + 213, + 144, 97, - 4, - 243, + 24, + 39, 86, 91, + 128, + 96, + 31, + 1, + 96, + 32, + 128, + 145, + 4, + 2, + 96, + 32, + 1, + 96, + 64, + 81, + 144, + 129, + 1, 96, 64, - 81, - 97, - 0, - 205, - 148, - 147, + 82, + 128, 146, 145, 144, - 97, - 15, - 204, - 86, - 91, - 97, - 0, - 233, - 97, + 129, + 129, + 82, + 96, + 32, 1, 130, - 54, - 96, - 4, + 128, + 84, 97, - 16, - 36, - 86, - 91, + 6, + 1, + 144, 97, - 7, - 83, + 24, + 39, 86, 91, + 128, + 21, 97, - 0, - 254, + 6, + 78, + 87, + 128, + 96, + 31, + 16, + 97, + 6, + 35, + 87, 97, 1, - 149, - 54, - 96, + 0, + 128, + 131, + 84, 4, + 2, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 17, - 126, - 86, - 91, - 97, - 9, - 253, + 6, + 78, 86, 91, - 97, + 130, + 1, + 145, + 144, + 96, 0, - 233, - 97, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 91, + 129, + 84, + 129, + 82, + 144, + 96, 1, - 168, - 54, + 1, + 144, 96, - 4, - 97, + 32, + 1, + 128, + 131, 17, - 235, - 86, - 91, 97, - 11, - 5, - 86, + 6, + 49, + 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, - 97, + 80, + 80, + 80, + 80, + 80, + 144, + 128, + 96, + 2, 1, - 181, + 128, + 84, 97, - 11, - 126, + 6, + 99, + 144, + 97, + 24, + 39, 86, 91, + 128, 96, + 31, 1, - 84, 96, - 0, - 3, - 97, + 32, + 128, + 145, + 4, 2, - 43, - 87, + 96, + 32, + 1, 96, 64, 81, - 98, - 70, - 27, - 205, + 144, + 129, + 1, 96, - 229, - 27, + 64, + 82, + 128, + 146, + 145, + 144, + 129, 129, 82, 96, 32, - 96, - 4, - 130, 1, - 82, - 96, - 54, - 96, - 36, 130, - 1, - 82, - 127, + 128, 84, - 104, - 101, - 32, - 67, - 69, - 88, - 32, - 104, 97, - 115, - 32, - 110, - 111, - 116, - 32, - 115, - 117, - 98, - 109, - 105, - 116, - 116, - 101, - 100, - 32, + 6, + 143, + 144, 97, - 110, - 121, - 32, + 24, + 39, + 86, + 91, + 128, + 21, 97, - 100, - 96, - 68, - 130, - 1, - 82, - 117, - 100, - 114, - 101, - 115, - 115, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, - 105, - 112, - 32, - 112, - 114, - 111, - 111, - 102, - 115, - 96, - 80, - 27, + 6, + 220, + 87, + 128, 96, - 100, - 130, + 31, + 16, + 97, + 6, + 177, + 87, + 97, 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, 82, + 145, 96, - 132, + 32, 1, + 145, + 97, + 6, + 220, + 86, 91, - 96, - 64, - 81, - 128, + 130, + 1, 145, - 3, 144, - 253, - 91, 96, 0, - 131, - 81, + 82, 96, - 1, - 97, - 2, - 59, - 145, + 32, + 96, + 0, + 32, 144, - 97, - 18, - 49, - 86, 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, + 84, + 129, + 82, + 144, + 96, + 1, + 1, + 144, + 96, + 32, + 1, + 128, + 131, 17, - 21, 97, - 2, - 83, + 6, + 191, 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, + 91, + 80, + 80, + 80, + 80, + 80, + 144, + 128, + 96, + 3, + 1, + 128, + 84, 97, - 2, - 83, + 6, + 241, + 144, 97, - 12, - 65, + 24, + 39, 86, 91, - 96, - 64, - 81, - 144, - 128, - 130, - 82, 128, 96, + 31, + 1, + 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 130, + 96, + 64, + 81, + 144, + 129, 1, 96, 64, 82, 128, - 21, - 97, - 2, - 124, - 87, + 146, + 145, + 144, 129, + 129, + 82, 96, 32, 1, - 96, - 32, 130, - 2, 128, - 54, - 131, - 55, - 1, + 84, + 97, + 7, + 29, 144, - 80, + 97, + 24, + 39, + 86, 91, - 80, - 144, - 80, - 132, - 129, + 128, + 21, + 97, + 7, + 106, + 87, + 128, 96, - 0, - 129, - 81, - 129, + 31, 16, 97, - 2, - 147, + 7, + 63, 87, 97, + 1, + 0, + 128, + 131, + 84, + 4, 2, - 147, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 18, - 68, + 7, + 106, 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, 32, - 2, 96, + 0, 32, - 1, - 1, + 144, + 91, 129, + 84, 129, 82, + 144, + 96, + 1, + 1, + 144, + 96, + 32, + 1, + 128, + 131, + 17, + 97, + 7, + 77, + 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, + 145, + 91, + 80, + 80, 80, 80, + 80, + 144, + 80, + 132, + 86, + 91, + 97, + 7, + 124, + 97, + 16, + 32, + 86, + 91, 96, 0, 91, - 132, + 129, 81, 129, 16, 21, 97, - 3, - 142, + 9, + 218, 87, - 132, - 129, + 96, + 0, + 130, + 130, 129, 81, 129, 16, 97, - 2, - 189, + 7, + 156, 87, 97, - 2, - 189, + 7, + 156, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -6610,60 +9399,70 @@ pub mod summa { 1, 81, 96, - 32, + 0, 1, 81, - 81, 96, - 0, - 20, - 21, - 128, - 21, - 97, - 2, - 249, - 87, - 80, - 132, - 129, - 129, + 64, 81, - 129, - 16, + 96, + 32, + 1, 97, - 2, - 231, - 87, + 7, + 184, + 145, + 144, 97, - 2, - 231, + 24, 97, - 18, - 68, 86, 91, 96, - 32, - 2, + 64, + 128, + 81, 96, - 32, - 1, + 31, + 25, + 129, + 132, + 3, 1, + 129, + 82, + 145, + 129, + 82, + 129, 81, 96, - 0, + 32, + 146, + 131, 1, - 81, - 81, + 32, 96, 0, - 20, + 129, + 129, + 82, + 96, + 3, + 144, + 147, + 82, + 145, + 32, + 84, + 144, + 145, + 80, + 128, 21, - 91, 97, - 3, - 53, + 8, + 46, 87, 96, 64, @@ -6685,58 +9484,230 @@ pub mod summa { 1, 82, 96, - 13, + 24, 96, 36, 130, 1, 82, + 127, + 65, + 100, + 100, + 114, + 101, + 115, + 115, + 32, + 97, 108, - 18, + 114, + 101, + 97, + 100, + 121, + 32, + 118, + 101, + 114, + 105, + 102, + 105, + 101, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 97, + 86, 91, - 157, - 152, + 96, + 2, + 132, + 132, + 129, + 81, + 129, + 16, + 97, + 8, + 66, + 87, + 97, + 8, + 66, + 97, + 24, + 17, + 86, 91, - 26, - 89, + 96, + 32, + 144, + 129, + 2, + 145, + 144, + 145, + 1, + 129, + 1, + 81, + 130, + 84, + 96, + 1, + 129, + 1, + 132, + 85, + 96, + 0, + 147, + 132, + 82, + 145, + 144, + 146, + 32, + 130, + 81, + 96, + 4, + 144, + 146, + 2, + 1, + 144, + 129, + 144, + 97, 8, + 116, + 144, + 130, + 97, 24, - 92, - 220, - 217, - 93, + 204, + 86, + 91, + 80, + 96, + 32, + 130, + 1, + 81, + 96, + 1, + 130, + 1, + 144, + 97, + 8, + 137, + 144, + 130, + 97, + 24, + 204, + 86, + 91, + 80, + 96, + 64, + 130, + 1, + 81, + 96, + 2, + 130, + 1, + 144, + 97, + 8, + 158, + 144, + 130, + 97, + 24, + 204, + 86, + 91, + 80, 96, - 154, - 27, 96, - 68, 130, 1, - 82, + 81, 96, - 100, + 3, + 130, 1, + 144, 97, - 2, - 34, + 8, + 179, + 144, + 130, + 97, + 24, + 204, 86, 91, + 80, + 80, + 96, + 2, + 84, + 96, + 0, 132, 129, - 129, + 82, + 96, + 3, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 85, + 80, + 131, 81, + 132, + 144, + 132, + 144, 129, 16, 97, - 3, - 71, + 8, + 220, 87, 97, - 3, - 71, + 8, + 220, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -6748,210 +9719,80 @@ pub mod summa { 1, 81, 96, - 64, + 0, 1, 81, - 130, - 130, + 81, 96, - 1, - 97, - 3, - 97, - 145, - 144, + 0, + 20, + 21, + 128, + 21, 97, - 18, - 49, - 86, - 91, + 9, + 24, + 87, + 80, + 131, + 131, 129, 81, 129, 16, 97, - 3, - 113, + 9, + 6, 87, 97, - 3, - 113, + 9, + 6, 97, - 18, - 68, + 24, + 17, 86, 91, 96, 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 1, - 82, - 128, - 97, - 3, - 134, - 129, - 97, - 18, - 90, - 86, - 91, - 145, - 80, - 80, - 97, 2, - 162, - 86, - 91, - 80, - 97, - 3, - 153, - 131, - 130, - 97, - 4, - 68, - 86, - 91, - 97, - 3, - 216, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, 96, 32, - 96, - 4, - 130, - 1, - 82, - 96, - 16, - 96, - 36, - 130, 1, - 82, - 111, - 36, - 183, - 59, - 48, - 182, - 52, - 178, - 16, - 45, - 37, - 144, - 56, - 57, - 55, - 183, - 179, - 96, - 129, - 27, - 96, - 68, - 130, 1, - 82, + 81, 96, - 100, + 32, 1, - 97, - 2, - 34, - 86, - 91, + 81, + 81, 96, 0, - 130, - 129, - 82, - 96, - 3, - 96, - 32, - 82, - 96, - 64, - 129, - 32, - 134, - 144, - 85, - 129, - 81, + 20, + 21, + 91, + 128, + 21, + 97, + 9, + 67, + 87, + 80, 131, - 145, - 127, - 4, - 115, - 88, - 28, - 60, - 244, - 55, - 175, - 197, - 34, - 7, - 216, - 140, - 225, - 84, - 26, - 251, - 199, - 206, - 159, - 219, 131, - 180, - 212, - 211, - 183, - 33, - 75, - 238, - 213, - 111, - 245, - 145, - 132, - 145, - 144, + 129, + 81, + 129, + 16, 97, - 4, - 30, + 9, + 49, 87, 97, - 4, - 30, + 9, + 49, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -6962,932 +9803,763 @@ pub mod summa { 1, 1, 81, - 134, 96, 64, + 1, 81, - 97, - 4, - 53, - 146, - 145, - 144, - 97, - 18, - 115, - 86, - 91, - 96, - 64, 81, + 96, + 0, + 20, + 21, + 91, 128, - 145, - 3, - 144, - 162, - 80, - 80, - 80, - 80, + 21, + 97, + 9, + 110, + 87, 80, - 86, - 91, - 96, - 64, + 131, + 131, + 129, 81, - 99, - 11, - 210, - 5, - 169, - 96, - 228, - 27, 129, - 82, - 96, - 0, - 144, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 189, - 32, - 90, - 144, - 144, + 16, 97, - 4, - 149, - 144, - 133, - 144, - 135, - 144, - 96, - 4, - 1, + 9, + 92, + 87, 97, - 19, - 10, + 9, + 92, + 97, + 24, + 17, 86, 91, 96, 32, + 2, 96, - 64, + 32, + 1, + 1, 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 4, - 178, - 87, - 61, 96, - 0, - 128, - 62, - 61, + 96, + 1, + 81, + 81, 96, 0, - 253, + 20, + 21, 91, - 80, - 80, - 80, - 80, + 97, + 9, + 197, + 87, 96, 64, 81, - 61, + 98, + 70, + 27, + 205, 96, - 31, - 25, + 229, + 27, + 129, + 82, 96, - 31, + 32, + 96, + 4, 130, 1, - 22, + 82, + 96, + 34, + 96, + 36, 130, 1, - 128, - 96, - 64, 82, - 80, - 129, - 1, - 144, - 97, - 4, - 214, - 145, - 144, - 97, - 19, - 97, - 86, - 91, - 144, - 80, - 91, - 146, - 145, - 80, - 80, - 86, - 91, - 97, - 4, - 231, - 97, - 11, - 126, - 86, - 91, + 127, + 73, + 110, + 118, 97, - 4, - 241, - 96, - 0, + 108, + 105, + 100, + 32, + 112, + 114, + 111, + 111, + 102, + 32, + 111, + 102, + 32, 97, - 11, - 216, - 86, - 91, - 86, - 91, + 100, + 100, + 114, + 101, + 115, + 115, + 32, + 111, + 119, + 110, + 101, + 114, + 115, + 104, 96, + 68, + 130, 1, - 129, - 129, - 84, - 129, - 16, + 82, 97, - 5, - 3, - 87, + 6, + 151, 96, - 0, - 128, - 253, - 91, - 144, + 244, + 27, 96, - 0, + 100, + 130, + 1, 82, 96, - 32, - 96, - 0, - 32, - 144, - 96, - 4, - 2, + 132, 1, - 96, - 0, - 145, + 97, + 2, + 97, + 86, + 91, 80, - 144, 80, 128, - 96, - 0, - 1, 128, - 84, 97, - 5, - 38, + 9, + 210, 144, 97, - 19, - 131, + 25, + 140, 86, 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, 145, - 4, - 2, + 80, + 80, + 97, + 7, + 127, + 86, + 91, + 80, + 127, + 56, + 35, + 21, + 212, + 213, + 106, 96, - 32, - 1, + 53, + 225, + 137, + 155, + 255, + 231, + 125, + 155, + 236, + 239, + 175, + 95, + 38, + 80, + 228, + 50, + 59, + 39, + 133, + 72, + 87, + 160, + 69, + 70, + 88, + 129, 96, 64, 81, + 97, + 10, + 10, + 145, 144, - 129, - 1, + 97, + 25, + 165, + 86, + 91, 96, 64, - 82, + 81, 128, - 146, 145, + 3, 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 5, - 82, - 144, - 97, - 19, - 131, + 161, + 80, 86, 91, - 128, - 21, - 97, - 5, - 159, - 87, - 128, 96, - 31, + 0, + 130, + 96, + 1, + 129, + 81, + 129, 16, 97, - 5, - 116, + 10, + 42, 87, 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, + 10, + 42, 97, - 5, - 159, + 24, + 17, 86, 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, 96, 32, + 2, 96, - 0, 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, 1, 1, - 144, + 81, 96, - 32, - 1, - 128, - 131, - 17, - 97, - 5, - 130, - 87, - 130, - 144, - 3, + 4, 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, + 0, + 132, + 129, + 82, 96, + 32, 1, - 1, - 128, - 84, - 97, - 5, - 180, 144, - 97, - 19, - 131, - 86, - 91, - 128, - 96, - 31, - 1, + 129, + 82, 96, 32, - 128, - 145, - 4, - 2, + 1, 96, + 0, 32, + 96, + 0, 1, + 84, + 20, + 97, + 10, + 137, + 87, 96, 64, 81, - 144, - 129, - 1, + 98, + 70, + 27, + 205, 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, + 229, + 27, 129, 82, 96, 32, + 96, + 4, + 130, 1, + 82, + 96, + 16, + 96, + 36, 130, - 128, + 1, + 82, + 111, + 18, + 91, + 157, + 152, + 91, + 26, + 89, + 8, + 19, 84, + 213, + 8, + 28, + 155, + 219, + 221, + 96, + 130, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, 97, - 5, - 224, - 144, + 2, 97, - 19, - 131, 86, 91, - 128, + 96, + 2, + 91, + 131, + 81, + 129, + 16, 21, 97, - 6, - 45, + 11, + 67, 87, - 128, - 96, - 31, + 131, + 129, + 129, + 81, + 129, 16, 97, - 6, - 2, + 10, + 167, 87, 97, - 1, - 0, - 128, - 131, - 84, - 4, + 10, + 167, + 97, + 24, + 17, + 86, + 91, + 96, + 32, 2, - 131, - 82, - 145, 96, 32, 1, - 145, - 97, - 6, - 45, - 86, - 91, - 130, 1, - 145, - 144, + 81, + 96, + 4, 96, 0, + 133, + 129, 82, 96, 32, - 96, - 0, - 32, + 1, 144, - 91, - 129, - 84, 129, 82, - 144, 96, + 32, 1, - 1, - 144, 96, + 0, 32, + 96, 1, - 128, + 1, + 96, + 2, 131, - 17, 97, - 6, - 16, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, + 10, + 210, 145, - 91, - 80, - 80, - 80, - 80, - 80, 144, - 128, - 96, - 2, - 1, - 128, + 97, + 23, + 248, + 86, + 91, + 129, 84, + 129, + 16, 97, - 6, - 66, - 144, + 10, + 226, + 87, 97, - 19, - 131, + 10, + 226, + 97, + 24, + 17, 86, 91, - 128, + 144, 96, - 31, - 1, + 0, + 82, 96, 32, - 128, - 145, - 4, - 2, 96, + 0, 32, 1, + 84, + 20, + 97, + 11, + 49, + 87, 96, 64, 81, - 144, + 98, + 70, + 27, + 205, + 96, + 229, + 27, 129, + 82, + 96, + 32, + 96, + 4, + 130, 1, + 82, 96, - 64, + 20, + 96, + 36, + 130, + 1, 82, - 128, - 146, - 145, - 144, - 129, - 129, + 115, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 114, + 111, + 111, + 116, + 32, + 98, + 97, + 108, + 97, + 110, + 99, + 101, + 96, + 96, + 27, + 96, + 68, + 130, + 1, 82, 96, - 32, + 100, 1, - 130, - 128, - 84, 97, - 6, - 110, - 144, + 2, 97, - 19, - 131, 86, 91, 128, - 21, - 97, - 6, - 187, - 87, - 128, - 96, - 31, - 16, 97, - 6, - 144, - 87, + 11, + 59, + 129, 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, + 25, + 140, + 86, + 91, 145, + 80, + 80, 97, - 6, - 187, + 10, + 140, 86, 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, + 80, 96, - 32, + 64, + 81, + 99, + 11, + 210, + 5, + 169, 96, - 0, - 32, - 144, - 91, - 129, - 84, + 228, + 27, 129, 82, - 144, 96, 1, + 96, 1, - 144, 96, + 160, + 27, + 3, + 127, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 22, + 144, + 99, + 189, 32, - 1, - 128, - 131, - 17, + 90, + 144, + 144, 97, - 6, - 158, - 87, - 130, + 11, + 146, 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, + 134, + 144, + 136, 144, - 128, 96, - 3, + 4, 1, - 128, - 84, - 97, - 6, - 208, - 144, 97, - 19, - 131, + 26, + 66, 86, 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, 96, 32, - 1, 96, 64, 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, 128, - 84, - 97, - 6, - 252, - 144, - 97, - 19, 131, - 86, - 91, + 3, + 129, + 134, + 90, + 250, + 21, 128, 21, 97, - 7, - 73, + 11, + 175, 87, - 128, + 61, 96, - 31, - 16, - 97, - 7, - 30, - 87, - 97, - 1, 0, 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 7, - 73, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, + 62, + 61, 96, 0, - 32, - 144, + 253, 91, - 129, - 84, - 129, - 82, - 144, + 80, + 80, + 80, + 80, 96, - 1, - 1, - 144, + 64, + 81, + 61, 96, - 32, - 1, - 128, - 131, - 17, - 97, - 7, - 44, - 87, - 130, - 144, - 3, + 31, + 25, 96, 31, + 130, + 1, 22, 130, 1, + 128, + 96, + 64, + 82, + 80, + 129, + 1, + 144, + 97, + 11, + 211, 145, + 144, + 97, + 26, + 103, + 86, 91, + 148, + 147, 80, 80, 80, 80, - 80, - 144, - 80, - 132, 86, 91, 97, - 7, - 91, - 97, 11, - 126, + 227, + 97, + 16, + 32, 86, 91, + 131, 96, 0, - 91, - 129, - 81, - 129, - 16, - 21, + 3, 97, - 9, - 194, + 12, + 38, 87, 96, - 0, - 130, - 130, - 129, + 64, 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, 129, - 16, - 97, - 7, - 123, - 87, - 97, - 7, - 123, - 97, - 18, - 68, - 86, - 91, + 82, 96, 32, - 2, 96, - 32, - 1, + 4, + 130, 1, - 81, + 82, 96, - 0, + 16, + 96, + 36, + 130, 1, - 81, + 82, + 111, + 18, + 91, + 157, + 152, + 91, + 26, + 89, + 8, + 19, + 84, + 213, + 8, + 28, + 155, + 219, + 221, 96, - 64, - 81, + 130, + 27, 96, - 32, + 68, + 130, + 1, + 82, + 96, + 100, 1, 97, - 7, - 151, - 145, - 144, + 2, 97, - 19, - 189, 86, 91, - 96, - 64, - 128, - 81, - 96, - 31, - 25, - 129, - 132, - 3, - 1, - 129, - 82, - 145, - 129, - 82, 129, 81, - 96, - 32, - 146, 131, - 1, - 32, - 96, - 0, - 129, - 129, - 82, - 96, - 2, - 144, - 147, - 82, - 145, - 32, - 84, - 144, - 145, - 80, - 128, - 21, + 81, + 20, 97, - 8, - 13, + 12, + 149, 87, 96, 64, @@ -7909,281 +10581,280 @@ pub mod summa { 1, 82, 96, - 24, + 53, 96, 36, 130, 1, 82, 127, - 65, - 100, - 100, - 114, - 101, - 115, - 115, + 82, + 111, + 111, + 116, 32, + 108, + 105, 97, + 98, + 105, 108, - 114, + 105, + 116, + 105, 101, + 115, + 32, + 115, + 117, + 109, + 115, + 32, 97, + 110, 100, - 121, 32, - 118, - 101, - 114, + 108, 105, - 102, + 97, + 98, 105, - 101, + 108, + 96, + 68, + 130, + 1, + 82, + 116, + 13, + 46, + 141, + 44, + 174, 100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 13, + 206, + 173, + 172, + 76, + 174, + 68, + 13, + 173, + 46, + 109, + 172, + 46, + 140, + 109, 96, - 68, + 91, + 27, + 96, + 100, 130, 1, 82, 96, - 100, + 132, 1, 97, 2, - 34, - 86, - 91, - 97, - 8, - 24, - 131, - 96, - 1, 97, - 18, - 49, 86, 91, 96, 0, - 131, - 129, - 82, - 96, - 2, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 85, - 131, + 130, 81, - 96, - 1, - 144, - 133, - 144, - 133, - 144, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, - 16, + 17, + 21, 97, - 8, - 62, + 12, + 177, 87, 97, - 8, - 62, + 12, + 177, 97, - 18, - 68, + 19, + 25, 86, 91, 96, - 32, + 64, + 81, 144, - 129, + 128, + 130, + 82, + 128, + 96, + 32, 2, - 145, - 144, - 145, - 1, - 129, + 96, + 32, 1, - 81, 130, - 84, - 96, 1, + 96, + 64, + 82, + 128, + 21, + 97, + 12, + 228, + 87, 129, + 96, + 32, 1, - 132, - 85, + 91, 96, - 0, - 147, - 132, + 96, + 129, 82, - 145, - 144, - 146, - 32, - 130, - 81, 96, - 4, + 32, + 1, 144, - 146, - 2, + 96, 1, 144, - 129, + 3, 144, + 129, 97, - 8, - 112, + 12, + 207, + 87, 144, - 130, - 97, - 20, - 31, - 86, + 80, 91, 80, + 144, + 80, 96, - 32, - 130, - 1, + 0, + 131, 81, - 96, - 1, - 130, - 1, - 144, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, 97, - 8, - 133, - 144, - 130, + 13, + 3, + 87, 97, - 20, - 31, + 13, + 3, + 97, + 19, + 25, 86, 91, - 80, 96, 64, - 130, - 1, 81, + 144, + 128, + 130, + 82, + 128, 96, + 32, 2, - 130, + 96, + 32, 1, - 144, - 97, - 8, - 154, - 144, 130, + 1, + 96, + 64, + 82, + 128, + 21, 97, - 20, - 31, - 86, + 13, + 54, + 87, + 129, + 96, + 32, + 1, 91, - 80, 96, 96, - 130, + 129, + 82, + 96, + 32, 1, - 81, + 144, 96, - 3, - 130, 1, 144, - 97, - 8, - 175, + 3, 144, - 130, - 97, - 20, - 31, - 86, - 91, - 80, - 80, - 80, - 131, - 131, - 129, - 81, 129, - 16, 97, - 8, - 196, + 13, + 33, 87, - 97, - 8, - 196, - 97, - 18, - 68, - 86, + 144, + 80, 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, + 80, + 144, + 80, 96, 0, - 1, - 81, + 91, + 132, 81, - 96, - 0, - 20, - 21, - 128, + 129, + 16, 21, 97, - 9, - 0, + 14, + 220, 87, - 80, - 131, - 131, + 132, + 129, 129, 81, 129, 16, 97, - 8, - 238, + 13, + 87, 87, 97, - 8, - 238, + 13, + 87, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -8203,30 +10874,29 @@ pub mod summa { 0, 20, 21, - 91, 128, 21, 97, - 9, - 43, + 13, + 147, 87, 80, - 131, - 131, + 132, + 129, 129, 81, 129, 16, 97, - 9, - 25, + 13, + 129, 87, 97, - 9, - 25, + 13, + 129, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -8238,7 +10908,7 @@ pub mod summa { 1, 81, 96, - 64, + 0, 1, 81, 81, @@ -8247,29 +10917,91 @@ pub mod summa { 20, 21, 91, - 128, - 21, 97, - 9, - 86, + 13, + 216, 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 22, + 96, + 36, + 130, + 1, + 82, + 117, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 99, + 114, + 121, + 112, + 116, + 111, + 99, + 117, + 114, + 114, + 101, + 110, + 99, + 121, + 96, 80, - 131, - 131, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 97, + 86, + 91, + 133, + 129, 129, 81, 129, 16, 97, - 9, - 68, + 13, + 234, 87, 97, - 9, - 68, + 13, + 234, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -8281,18 +11013,11 @@ pub mod summa { 1, 81, 96, - 96, - 1, - 81, - 81, - 96, 0, - 20, - 21, - 91, + 3, 97, - 9, - 173, + 14, + 83, 87, 96, 64, @@ -8314,55 +11039,62 @@ pub mod summa { 1, 82, 96, - 34, + 41, 96, 36, 130, 1, 82, 127, - 73, - 110, - 118, - 97, + 65, + 108, 108, - 105, - 100, 32, - 112, 114, 111, 111, - 102, - 32, - 111, - 102, + 116, 32, - 97, - 100, - 100, - 114, - 101, 115, + 117, + 109, 115, 32, + 115, + 104, 111, - 119, - 110, + 117, + 108, + 100, + 32, + 98, 101, + 32, + 103, 114, - 115, - 104, + 101, + 97, + 116, + 101, + 114, + 32, 96, 68, 130, 1, 82, + 104, + 116, + 104, 97, - 6, - 151, + 110, + 32, + 122, + 101, + 114, + 111, 96, - 244, + 184, 27, 96, 100, @@ -8374,108 +11106,55 @@ pub mod summa { 1, 97, 2, - 34, - 86, - 91, - 80, - 80, - 128, - 128, - 97, - 9, - 186, - 144, - 97, - 18, - 90, - 86, - 91, - 145, - 80, - 80, 97, - 7, - 94, 86, 91, - 80, - 127, - 56, - 35, - 21, - 212, - 213, - 106, - 96, - 53, - 225, - 137, - 155, - 255, - 231, - 125, - 155, - 236, - 239, - 175, - 95, - 38, - 80, - 228, - 50, - 59, - 39, - 133, - 72, - 87, - 160, - 69, - 70, - 88, + 132, + 129, 129, - 96, - 64, 81, + 129, + 16, 97, - 9, - 242, - 145, - 144, + 14, + 101, + 87, 97, - 20, - 223, + 14, + 101, + 97, + 24, + 17, 86, 91, 96, - 64, + 32, + 2, + 96, + 32, + 1, + 1, 81, - 128, - 145, - 3, - 144, - 161, - 80, - 86, - 91, 96, 0, - 130, - 96, 1, + 81, + 131, + 130, 129, 81, 129, 16, 97, - 10, - 18, + 14, + 131, 87, 97, - 10, - 18, + 14, + 131, 97, - 18, - 68, + 24, + 17, 86, 91, 96, @@ -8485,236 +11164,285 @@ pub mod summa { 32, 1, 1, + 129, + 144, + 82, + 80, + 132, + 129, + 129, 81, + 129, + 16, + 97, + 14, + 160, + 87, + 97, + 14, + 160, + 97, + 24, + 17, + 86, + 91, 96, - 3, + 32, + 2, 96, - 0, - 132, - 129, - 82, + 32, + 1, + 1, + 81, 96, 32, 1, - 144, + 81, + 130, + 130, 129, - 82, + 81, + 129, + 16, + 97, + 14, + 190, + 87, + 97, + 14, + 190, + 97, + 24, + 17, + 86, + 91, 96, 32, - 1, + 2, 96, - 0, 32, - 84, - 20, + 1, + 1, + 129, + 144, + 82, + 80, + 128, + 128, 97, - 10, - 110, - 87, + 14, + 212, + 144, + 97, + 25, + 140, + 86, + 91, + 145, + 80, + 80, + 97, + 13, + 60, + 86, + 91, + 80, 96, 64, + 128, 81, - 98, - 70, - 27, - 205, 96, - 229, - 27, + 128, + 129, + 1, + 130, + 82, + 135, 129, 82, 96, 32, - 96, - 4, + 128, 130, 1, + 136, + 129, 82, - 96, - 16, - 96, - 36, 130, + 132, 1, + 134, + 144, 82, - 111, - 18, - 91, - 157, - 152, - 91, - 26, - 89, - 8, - 19, - 84, - 213, - 8, - 28, - 155, - 219, - 221, 96, - 130, - 27, 96, - 68, - 130, + 131, 1, + 133, + 144, 82, 96, - 100, - 1, - 97, - 2, - 34, - 86, - 91, - 96, - 64, - 81, - 99, - 11, - 210, - 5, - 169, - 96, - 228, - 27, + 0, + 135, 129, 82, 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 189, - 32, - 90, - 144, + 4, + 131, + 82, + 147, 144, + 147, + 32, + 130, + 81, + 129, + 85, + 146, + 81, + 128, + 81, + 146, + 147, + 146, 97, - 10, - 188, - 144, - 134, - 144, - 136, - 144, + 15, + 39, + 146, 96, - 4, 1, + 133, + 1, + 146, + 1, + 144, 97, - 19, - 10, + 16, + 202, 86, 91, - 96, - 32, + 80, 96, 64, + 130, + 1, 81, 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, + 81, 97, - 10, - 217, - 87, - 61, + 15, + 67, + 145, 96, - 0, - 128, - 62, - 61, + 2, + 132, + 1, + 145, 96, - 0, - 253, + 32, + 144, + 145, + 1, + 144, + 97, + 17, + 21, + 86, 91, 80, - 80, - 80, - 80, 96, - 64, + 96, + 130, + 1, 81, - 61, + 128, + 81, + 97, + 15, + 95, + 145, 96, - 31, - 25, + 3, + 132, + 1, + 145, 96, - 31, - 130, + 32, + 144, + 145, 1, - 22, + 144, + 97, + 17, + 21, + 86, + 91, + 80, + 144, + 80, + 80, 130, - 1, + 127, + 136, + 191, + 199, + 56, + 156, + 184, + 49, + 234, + 2, + 8, + 255, + 16, + 109, + 166, + 245, + 201, + 248, 128, + 54, + 186, + 8, + 79, + 30, + 176, + 8, + 210, + 120, + 141, + 61, + 69, + 153, + 141, + 135, + 135, + 135, 96, 64, - 82, - 80, - 129, - 1, - 144, + 81, 97, - 10, - 253, + 15, + 151, + 147, + 146, 145, 144, 97, - 19, - 97, + 26, + 137, 86, 91, - 148, - 147, + 96, + 64, + 81, + 128, + 145, + 3, + 144, + 162, + 80, + 80, 80, 80, 80, @@ -8722,11 +11450,11 @@ pub mod summa { 86, 91, 97, - 11, - 13, + 15, + 175, 97, - 11, - 126, + 16, + 32, 86, 91, 96, @@ -8740,8 +11468,8 @@ pub mod summa { 129, 22, 97, - 11, - 114, + 16, + 20, 87, 96, 64, @@ -8827,16 +11555,16 @@ pub mod summa { 1, 97, 2, - 34, + 97, 86, 91, 97, - 11, - 123, + 16, + 29, 129, 97, - 11, - 216, + 16, + 122, 86, 91, 80, @@ -8857,8 +11585,8 @@ pub mod summa { 51, 20, 97, - 4, - 241, + 5, + 18, 87, 96, 64, @@ -8929,7 +11657,7 @@ pub mod summa { 1, 97, 2, - 34, + 97, 86, 91, 96, @@ -9012,789 +11740,708 @@ pub mod summa { 80, 86, 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, + 130, + 128, + 84, + 130, + 130, + 85, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 129, + 1, + 146, + 130, + 21, + 97, + 17, + 5, + 87, + 145, + 96, + 32, + 2, + 130, + 1, + 91, + 130, + 129, + 17, + 21, + 97, + 17, + 5, + 87, + 130, + 81, + 130, + 85, + 145, + 96, + 32, + 1, + 145, + 144, + 96, + 1, + 1, + 144, + 97, + 16, + 234, + 86, + 91, + 80, 97, - 12, - 58, - 87, - 96, - 0, - 128, - 253, + 17, + 17, + 146, + 145, + 80, + 97, + 17, + 103, + 86, 91, 80, - 53, - 145, 144, - 80, 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, + 130, + 128, + 84, + 130, + 130, + 85, + 144, 96, 0, 82, 96, - 65, - 96, - 4, - 82, - 96, - 36, + 32, 96, 0, - 253, - 91, - 96, - 64, - 81, - 96, - 96, + 32, + 144, 129, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, + 146, + 130, + 21, + 97, 17, + 91, + 87, + 145, + 96, + 32, + 2, 130, + 1, + 91, 130, - 16, - 23, + 129, + 17, 21, 97, - 12, - 122, + 17, + 91, 87, + 130, + 81, + 130, + 144, 97, - 12, - 122, + 17, + 75, + 144, + 130, 97, - 12, - 65, + 24, + 204, 86, 91, + 80, + 145, 96, - 64, - 82, + 32, + 1, + 145, 144, - 86, - 91, - 96, - 64, - 81, 96, - 128, - 129, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, + 1, + 144, 97, - 12, - 122, - 87, + 17, + 53, + 86, + 91, + 80, 97, - 12, - 122, + 17, + 17, + 146, + 145, + 80, 97, - 12, - 65, + 17, + 124, 86, 91, - 96, - 64, - 81, - 96, - 31, + 91, + 128, 130, - 1, + 17, + 21, + 97, + 17, + 17, + 87, 96, - 31, - 25, - 22, + 0, 129, + 85, + 96, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, + 1, + 97, 17, + 104, + 86, + 91, + 128, 130, - 130, - 16, - 23, + 17, 21, 97, - 12, - 204, + 17, + 17, 87, + 96, + 0, 97, - 12, - 204, + 17, + 144, + 130, + 130, 97, - 12, - 65, + 17, + 153, 86, 91, + 80, 96, - 64, - 82, - 145, - 144, + 1, + 1, + 97, + 17, + 124, + 86, + 91, 80, + 128, + 84, + 97, + 17, + 165, + 144, + 97, + 24, + 39, 86, 91, 96, 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 130, - 17, - 21, + 85, + 128, + 96, + 31, + 16, 97, - 12, - 238, + 17, + 181, 87, - 97, - 12, - 238, - 97, - 12, - 65, + 80, + 80, 86, 91, - 80, 96, - 5, - 27, + 31, + 1, + 96, + 32, + 144, + 4, + 144, + 96, + 0, + 82, + 96, + 32, 96, + 0, 32, + 144, + 129, 1, 144, + 97, + 16, + 29, + 145, + 144, + 97, + 17, + 103, 86, 91, 96, 0, - 130, 96, - 31, - 131, - 1, + 32, + 130, + 132, + 3, 18, + 21, 97, - 13, - 9, + 17, + 229, 87, 96, 0, 128, 253, 91, - 129, + 80, 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 91, + 131, 129, - 17, + 16, 21, 97, - 13, - 35, + 18, + 7, 87, - 97, - 13, - 35, - 97, - 12, - 65, - 86, - 91, - 97, - 13, - 54, - 96, - 31, + 129, + 129, + 1, + 81, + 131, 130, 1, - 96, - 31, - 25, - 22, + 82, 96, 32, 1, 97, - 12, - 163, + 17, + 239, 86, 91, - 129, - 129, - 82, - 132, + 80, + 80, 96, - 32, - 131, - 134, - 1, + 0, + 145, 1, - 17, - 21, - 97, - 13, - 75, - 87, + 82, + 86, + 91, 96, 0, + 129, + 81, 128, - 253, - 91, + 132, + 82, + 97, + 18, + 40, 129, 96, 32, - 133, + 134, 1, 96, 32, - 131, + 134, 1, - 55, + 97, + 17, + 236, + 86, + 91, 96, - 0, - 145, - 129, + 31, + 1, + 96, + 31, + 25, + 22, + 146, + 144, + 146, 1, 96, 32, 1, - 145, - 144, - 145, - 82, - 147, 146, - 80, + 145, 80, 80, 86, 91, 96, 0, - 128, - 96, - 0, - 128, + 129, + 81, 96, 128, - 133, - 135, - 3, - 18, - 21, + 132, + 82, 97, - 13, - 126, - 87, + 18, + 81, 96, - 0, 128, - 253, - 91, - 132, - 53, - 147, - 80, - 96, - 32, 133, 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, 130, - 17, - 21, 97, - 13, - 157, - 87, - 96, - 0, - 128, - 253, + 18, + 16, + 86, 91, - 129, - 135, - 1, - 145, + 144, 80, - 135, 96, - 31, + 32, 131, 1, - 18, - 97, - 13, - 177, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 13, - 195, - 97, - 13, - 190, - 131, - 53, - 97, - 12, - 212, - 86, - 91, - 97, - 12, - 163, - 86, - 91, - 130, - 53, - 128, + 81, + 132, 130, - 82, + 3, 96, 32, - 128, - 131, + 134, 1, - 146, + 82, + 97, + 18, + 106, + 130, + 130, + 97, + 18, + 16, + 86, + 91, 145, + 80, + 80, 96, - 5, - 27, - 133, - 1, + 64, + 131, 1, - 138, - 129, - 17, - 21, - 97, - 13, - 226, - 87, - 96, - 0, - 128, - 253, - 91, + 81, + 132, + 130, + 3, 96, - 32, - 133, + 64, + 134, 1, - 91, - 129, - 129, - 16, - 21, + 82, 97, - 14, - 132, - 87, + 18, 132, - 129, - 53, - 17, - 21, + 130, + 130, 97, - 13, - 253, - 87, - 96, - 0, - 128, - 253, + 18, + 16, + 86, 91, - 128, - 53, - 134, - 1, + 145, + 80, + 80, 96, 96, - 129, - 142, + 131, + 1, + 81, + 132, + 130, 3, 96, - 31, - 25, + 96, + 134, 1, + 82, + 97, 18, - 21, + 158, + 130, + 130, 97, - 14, - 21, - 87, - 96, - 0, - 128, - 253, + 18, + 16, + 86, 91, - 97, - 14, - 29, - 97, - 12, - 87, + 149, + 148, + 80, + 80, + 80, + 80, + 80, 86, 91, 96, 32, - 130, - 1, - 53, - 135, 129, - 17, - 21, - 97, - 14, - 47, - 87, + 82, 96, 0, - 128, - 253, - 91, 97, - 14, - 62, - 143, + 18, + 186, 96, 32, 131, - 134, - 1, 1, + 132, 97, - 12, - 248, + 18, + 60, 86, 91, - 130, - 82, + 147, + 146, 80, + 80, + 80, + 86, + 91, 96, - 64, - 130, - 1, - 53, - 135, + 128, 129, - 17, - 21, - 97, - 14, - 83, - 87, + 82, 96, 0, - 128, - 253, - 91, 97, - 14, - 98, - 143, + 18, + 212, 96, - 32, + 128, 131, - 134, - 1, 1, + 135, 97, - 12, - 248, + 18, + 16, 86, 91, + 130, + 129, + 3, 96, 32, - 131, - 129, + 132, 1, - 145, - 144, - 145, 82, - 96, - 96, - 147, + 97, + 18, + 230, + 129, + 135, + 97, + 18, + 16, + 86, + 91, 144, - 147, - 1, - 53, + 80, + 130, + 129, + 3, 96, 64, - 131, - 1, - 82, - 80, - 133, - 82, - 147, 132, 1, - 147, - 1, + 82, 97, - 13, - 231, + 18, + 250, + 129, + 134, + 97, + 18, + 16, 86, 91, - 80, 144, - 150, - 80, - 80, - 80, - 96, - 64, - 135, - 1, - 53, - 145, 80, - 128, 130, - 17, - 21, - 97, - 14, - 158, - 87, + 129, + 3, 96, - 0, - 128, - 253, - 91, - 80, + 96, + 132, + 1, + 82, 97, + 19, 14, - 171, - 135, - 130, - 136, - 1, + 129, + 133, 97, - 12, - 248, + 18, + 16, 86, 91, - 148, 151, - 147, 150, 80, - 147, - 148, - 96, - 96, - 1, - 53, - 147, + 80, + 80, + 80, 80, 80, 80, 86, 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, 96, 0, - 130, + 82, 96, - 31, - 131, - 1, - 18, - 97, - 14, - 205, - 87, + 65, + 96, + 4, + 82, + 96, + 36, 96, 0, - 128, 253, 91, - 129, - 53, 96, - 32, + 64, + 81, + 96, + 128, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, 97, - 14, - 221, + 19, + 82, + 87, 97, - 13, - 190, - 131, + 19, + 82, 97, - 12, - 212, + 19, + 25, 86, 91, - 130, - 129, + 96, + 64, 82, + 144, + 86, + 91, 96, - 5, - 146, + 64, + 128, + 81, 144, - 146, - 27, - 132, - 1, 129, 1, - 145, - 129, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, - 1, - 144, - 134, - 132, 17, - 21, - 97, - 14, - 252, - 87, - 96, - 0, - 128, - 253, - 91, 130, - 134, - 1, - 91, - 132, - 129, + 130, 16, + 23, 21, 97, - 15, - 23, + 19, + 82, 87, - 128, - 53, - 131, + 97, + 19, 82, - 145, - 131, - 1, - 145, - 131, - 1, 97, - 15, - 0, - 86, - 91, - 80, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, + 19, + 25, 86, 91, 96, - 0, - 128, - 96, 64, - 131, - 133, - 3, - 18, - 21, - 97, - 15, - 53, - 87, + 81, 96, - 0, - 128, - 253, - 91, + 31, 130, - 53, + 1, + 96, + 31, + 25, + 22, + 129, + 1, 103, 255, 255, @@ -9804,229 +12451,176 @@ pub mod summa { 255, 255, 255, - 128, - 130, + 129, 17, + 130, + 130, + 16, + 23, 21, 97, - 15, - 77, + 19, + 164, 87, - 96, - 0, - 128, - 253, - 91, 97, - 15, - 89, - 134, - 131, - 135, - 1, + 19, + 164, 97, - 12, - 248, + 19, + 25, 86, 91, - 147, - 80, 96, - 32, - 133, - 1, - 53, + 64, + 82, 145, + 144, 80, - 128, + 86, + 91, + 96, + 0, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 130, 17, 21, 97, - 15, - 111, + 19, + 198, 87, - 96, - 0, - 128, - 253, - 91, - 80, 97, - 15, - 124, - 133, - 130, - 134, - 1, + 19, + 198, 97, - 14, - 188, + 19, + 25, 86, 91, - 145, - 80, - 80, - 146, 80, - 146, + 96, + 5, + 27, + 96, + 32, + 1, 144, - 80, 86, 91, 96, 0, - 129, - 81, - 128, - 132, - 82, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 19, + 225, + 87, 96, 0, + 128, + 253, 91, 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, - 16, + 17, 21, 97, - 15, - 172, + 19, + 251, 87, - 96, - 32, - 129, - 133, - 1, - 129, - 1, - 81, - 134, - 131, - 1, - 130, - 1, - 82, - 1, 97, - 15, - 144, + 19, + 251, + 97, + 19, + 25, 86, 91, - 80, - 96, - 0, + 97, + 20, + 14, 96, - 32, + 31, 130, - 134, 1, - 1, - 82, - 96, - 32, 96, 31, 25, - 96, - 31, - 131, - 1, 22, - 133, - 1, + 96, + 32, 1, - 145, - 80, - 80, - 146, - 145, - 80, - 80, + 97, + 19, + 123, 86, 91, - 96, - 128, + 129, 129, 82, + 132, 96, - 0, - 97, - 15, - 223, - 96, - 128, + 32, 131, + 134, 1, - 135, + 1, + 17, + 21, 97, - 15, - 134, - 86, + 20, + 35, + 87, + 96, + 0, + 128, + 253, 91, - 130, 129, - 3, 96, 32, - 132, + 133, 1, - 82, - 97, - 15, - 241, - 129, - 135, - 97, - 15, - 134, - 86, - 91, - 144, - 80, - 130, - 129, - 3, 96, - 64, - 132, + 32, + 131, 1, - 82, - 97, - 16, - 5, - 129, - 134, - 97, - 15, - 134, - 86, - 91, - 144, - 80, - 130, - 129, - 3, + 55, 96, + 0, + 145, + 129, + 1, 96, - 132, + 32, 1, + 145, + 144, + 145, 82, - 97, - 16, - 25, - 129, - 133, - 97, - 15, - 134, - 86, - 91, - 151, - 150, - 80, - 80, - 80, - 80, + 147, + 146, 80, 80, 80, @@ -10043,8 +12637,8 @@ pub mod summa { 18, 21, 97, - 16, - 55, + 20, + 83, 87, 96, 0, @@ -10067,8 +12661,8 @@ pub mod summa { 17, 21, 97, - 16, - 79, + 20, + 107, 87, 96, 0, @@ -10087,8 +12681,8 @@ pub mod summa { 1, 18, 97, - 16, - 99, + 20, + 127, 87, 96, 0, @@ -10098,15 +12692,20 @@ pub mod summa { 129, 53, 97, - 16, - 113, + 20, + 146, 97, - 13, - 190, + 20, + 141, 130, 97, - 12, - 212, + 19, + 172, + 86, + 91, + 97, + 19, + 123, 86, 91, 129, @@ -10132,8 +12731,8 @@ pub mod summa { 17, 21, 97, - 16, - 144, + 20, + 177, 87, 96, 0, @@ -10149,8 +12748,8 @@ pub mod summa { 16, 21, 97, - 17, - 113, + 21, + 146, 87, 128, 53, @@ -10159,8 +12758,8 @@ pub mod summa { 17, 21, 97, - 16, - 171, + 20, + 204, 87, 96, 0, @@ -10181,8 +12780,8 @@ pub mod summa { 18, 21, 97, - 16, - 194, + 20, + 227, 87, 96, 0, @@ -10191,11 +12790,11 @@ pub mod summa { 253, 91, 97, - 16, - 202, + 20, + 235, 97, - 12, - 128, + 19, + 47, 86, 91, 136, @@ -10207,8 +12806,8 @@ pub mod summa { 17, 21, 97, - 16, - 220, + 20, + 253, 87, 96, 0, @@ -10217,8 +12816,8 @@ pub mod summa { 253, 91, 97, - 16, - 234, + 21, + 11, 141, 139, 131, @@ -10226,8 +12825,8 @@ pub mod summa { 1, 1, 97, - 12, - 248, + 19, + 208, 86, 91, 130, @@ -10244,8 +12843,8 @@ pub mod summa { 17, 21, 97, - 17, - 1, + 21, + 34, 87, 96, 0, @@ -10254,8 +12853,8 @@ pub mod summa { 253, 91, 97, - 17, - 15, + 21, + 48, 142, 140, 131, @@ -10263,8 +12862,8 @@ pub mod summa { 1, 1, 97, - 12, - 248, + 19, + 208, 86, 91, 139, @@ -10283,8 +12882,8 @@ pub mod summa { 17, 21, 97, - 17, - 40, + 21, + 73, 87, 96, 0, @@ -10293,8 +12892,8 @@ pub mod summa { 253, 91, 97, - 17, - 54, + 21, + 87, 143, 141, 131, @@ -10302,8 +12901,8 @@ pub mod summa { 1, 1, 97, - 12, - 248, + 19, + 208, 86, 91, 131, @@ -10323,8 +12922,8 @@ pub mod summa { 17, 21, 97, - 17, - 80, + 21, + 113, 87, 96, 0, @@ -10333,8 +12932,8 @@ pub mod summa { 253, 91, 97, - 17, - 94, + 21, + 127, 142, 140, 132, @@ -10342,8 +12941,8 @@ pub mod summa { 1, 1, 97, - 12, - 248, + 19, + 208, 86, 91, 144, @@ -10361,8 +12960,8 @@ pub mod summa { 134, 1, 97, - 16, - 148, + 20, + 181, 86, 91, 80, @@ -10380,6 +12979,108 @@ pub mod summa { 91, 96, 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 21, + 176, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 96, + 32, + 97, + 21, + 192, + 97, + 20, + 141, + 131, + 97, + 19, + 172, + 86, + 91, + 130, + 129, + 82, + 96, + 5, + 146, + 144, + 146, + 27, + 132, + 1, + 129, + 1, + 145, + 129, + 129, + 1, + 144, + 134, + 132, + 17, + 21, + 97, + 21, + 223, + 87, + 96, + 0, + 128, + 253, + 91, + 130, + 134, + 1, + 91, + 132, + 129, + 16, + 21, + 97, + 21, + 250, + 87, + 128, + 53, + 131, + 82, + 145, + 131, + 1, + 145, + 131, + 1, + 97, + 21, + 227, + 86, + 91, + 80, + 150, + 149, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, 128, 96, 0, @@ -10391,8 +13092,8 @@ pub mod summa { 18, 21, 97, - 17, - 147, + 22, + 26, 87, 96, 0, @@ -10415,8 +13116,8 @@ pub mod summa { 17, 21, 97, - 17, - 171, + 22, + 50, 87, 96, 0, @@ -10424,15 +13125,15 @@ pub mod summa { 253, 91, 97, - 17, - 183, + 22, + 62, 135, 131, 136, 1, 97, - 12, - 248, + 19, + 208, 86, 91, 148, @@ -10449,8 +13150,8 @@ pub mod summa { 17, 21, 97, - 17, - 205, + 22, + 84, 87, 96, 0, @@ -10459,15 +13160,15 @@ pub mod summa { 91, 80, 97, - 17, - 218, + 22, + 97, 134, 130, 135, 1, 97, - 14, - 188, + 21, + 159, 86, 91, 146, @@ -10489,370 +13190,323 @@ pub mod summa { 91, 96, 0, + 128, 96, - 32, - 130, - 132, + 0, + 128, + 96, + 128, + 133, + 135, 3, 18, 21, 97, - 17, - 253, + 22, + 136, 87, 96, 0, 128, 253, 91, - 129, + 132, 53, + 147, + 80, 96, + 32, + 133, 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, 97, - 18, - 20, + 22, + 167, 87, 96, 0, 128, 253, 91, - 147, - 146, - 80, - 80, - 80, + 97, + 22, + 179, + 136, + 131, + 137, + 1, + 97, + 21, + 159, 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, - 82, - 96, - 36, + 148, + 80, 96, - 0, - 253, - 91, - 128, - 130, + 64, + 135, 1, + 53, + 145, + 80, 128, 130, 17, 21, 97, - 4, - 217, + 22, + 201, 87, - 97, - 4, - 217, - 97, - 18, - 27, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 50, - 96, - 4, - 82, - 96, - 36, 96, 0, + 128, 253, 91, - 96, - 0, - 96, + 129, + 135, 1, - 130, + 145, + 80, + 135, + 96, + 31, + 131, 1, - 97, 18, - 108, + 97, + 22, + 221, 87, + 96, + 0, + 128, + 253, + 91, 97, - 18, - 108, + 22, + 234, 97, - 18, - 27, - 86, - 91, - 80, - 96, - 1, - 1, - 144, + 20, + 141, + 131, + 53, + 97, + 19, + 172, 86, 91, - 96, - 0, - 96, - 64, + 130, + 53, 128, - 131, - 1, - 133, - 132, + 130, 82, 96, 32, - 130, - 129, - 134, - 1, - 82, - 129, - 134, - 81, 128, - 132, - 82, - 96, - 96, - 147, - 80, 131, - 135, 1, + 146, 145, - 80, - 131, - 129, 96, 5, 27, - 136, - 1, + 133, 1, - 131, - 137, 1, - 96, - 0, - 91, - 131, + 138, 129, - 16, + 17, 21, 97, - 18, - 250, + 23, + 9, 87, - 137, - 131, - 3, 96, - 95, - 25, - 1, - 133, - 82, - 129, - 81, + 0, 128, - 81, - 136, - 133, - 82, - 97, - 18, - 197, - 137, - 134, - 1, - 130, - 97, - 15, - 134, - 86, + 253, 91, - 144, - 80, - 135, - 130, - 1, - 81, + 96, + 32, 133, - 130, - 3, - 137, - 135, 1, - 82, + 91, + 129, + 129, + 16, + 21, 97, - 18, - 220, - 130, - 130, + 23, + 165, + 87, + 132, + 129, + 53, + 17, + 21, 97, - 15, - 134, - 86, + 23, + 36, + 87, + 96, + 0, + 128, + 253, 91, - 146, - 139, - 1, - 81, - 149, - 139, - 1, - 149, - 144, - 149, - 82, - 80, - 148, + 128, + 53, 134, 1, - 148, - 146, - 80, - 144, - 133, - 1, - 144, 96, + 64, + 129, + 142, + 3, + 96, + 31, + 25, 1, - 1, - 97, 18, - 161, - 86, + 21, + 97, + 23, + 60, + 87, + 96, + 0, + 128, + 253, 91, - 80, - 144, - 154, - 153, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, + 97, + 23, + 68, + 97, + 19, + 88, 86, 91, 96, - 64, - 128, - 130, - 82, - 131, - 81, - 144, + 32, 130, 1, + 53, + 135, 129, - 144, - 82, + 17, + 21, + 97, + 23, + 86, + 87, 96, 0, - 144, + 128, + 253, + 91, + 97, + 23, + 101, + 143, 96, 32, - 144, - 96, - 96, - 132, + 131, + 134, 1, - 144, - 130, - 135, 1, - 132, + 97, + 19, + 208, + 86, 91, 130, + 82, + 80, + 96, + 64, + 130, + 1, + 53, + 135, 129, - 16, + 17, 21, 97, - 19, - 67, + 23, + 122, 87, - 129, - 81, - 132, - 82, - 146, - 132, - 1, - 146, - 144, - 132, - 1, - 144, 96, + 0, + 128, + 253, + 91, + 97, + 23, + 137, + 143, + 96, + 32, + 131, + 134, 1, 1, 97, 19, - 39, + 208, 86, 91, + 96, + 32, + 131, + 1, + 82, 80, + 128, + 134, + 82, 80, 80, - 131, - 129, - 3, - 130, - 133, + 96, + 32, + 132, 1, - 82, - 97, - 19, - 87, + 147, + 80, + 96, + 32, 129, - 134, + 1, + 144, + 80, 97, - 15, - 134, + 23, + 14, 86, 91, + 80, + 151, + 154, + 150, + 153, + 80, + 151, + 96, + 96, + 1, + 53, 150, - 149, 80, 80, 80, @@ -10871,8 +13525,8 @@ pub mod summa { 18, 21, 97, - 19, - 115, + 23, + 203, 87, 96, 0, @@ -10880,21 +13534,97 @@ pub mod summa { 253, 91, 129, - 81, - 128, - 21, - 21, + 53, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 129, + 22, 129, 20, 97, 18, - 20, + 186, 87, 96, 0, 128, 253, 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 17, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 129, + 129, + 3, + 129, + 129, + 17, + 21, + 97, + 24, + 11, + 87, + 97, + 24, + 11, + 97, + 23, + 226, + 86, + 91, + 146, + 145, + 80, + 80, + 86, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 50, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, 96, 1, 129, @@ -10905,8 +13635,8 @@ pub mod summa { 22, 128, 97, - 19, - 151, + 24, + 59, 87, 96, 127, @@ -10922,8 +13652,8 @@ pub mod summa { 129, 3, 97, - 19, - 183, + 24, + 91, 87, 99, 78, @@ -10954,22 +13684,31 @@ pub mod summa { 86, 91, 96, - 32, - 129, - 82, - 96, 0, + 130, + 81, 97, - 4, - 214, + 24, + 115, + 129, + 132, 96, 32, - 131, + 135, 1, - 132, 97, - 15, - 134, + 17, + 236, + 86, + 91, + 145, + 144, + 145, + 1, + 146, + 145, + 80, + 80, 86, 91, 96, @@ -10978,8 +13717,8 @@ pub mod summa { 17, 21, 97, - 20, - 26, + 24, + 199, 87, 96, 0, @@ -11005,8 +13744,8 @@ pub mod summa { 16, 21, 97, - 19, - 247, + 24, + 164, 87, 80, 128, @@ -11028,8 +13767,8 @@ pub mod summa { 16, 21, 97, - 20, - 22, + 24, + 195, 87, 130, 129, @@ -11038,8 +13777,8 @@ pub mod summa { 1, 1, 97, - 20, - 3, + 24, + 176, 86, 91, 80, @@ -11066,35 +13805,35 @@ pub mod summa { 17, 21, 97, - 20, - 57, + 24, + 230, 87, 97, - 20, - 57, + 24, + 230, 97, - 12, - 65, + 19, + 25, 86, 91, 97, - 20, - 77, + 24, + 250, 129, 97, - 20, - 71, + 24, + 244, 132, 84, 97, - 19, - 131, + 24, + 39, 86, 91, 132, 97, - 19, - 208, + 24, + 125, 86, 91, 96, @@ -11109,16 +13848,16 @@ pub mod summa { 129, 20, 97, - 20, - 130, + 25, + 47, 87, 96, 0, 132, 21, 97, - 20, - 106, + 25, + 23, 87, 80, 133, @@ -11146,8 +13885,8 @@ pub mod summa { 133, 85, 97, - 20, - 22, + 24, + 195, 86, 91, 96, @@ -11166,118 +13905,392 @@ pub mod summa { 22, 145, 91, - 130, + 130, + 129, + 16, + 21, + 97, + 25, + 94, + 87, + 136, + 134, + 1, + 81, + 130, + 85, + 148, + 132, + 1, + 148, + 96, + 1, + 144, + 145, + 1, + 144, + 132, + 1, + 97, + 25, + 63, + 86, + 91, + 80, + 133, + 130, + 16, + 21, + 97, + 25, + 124, + 87, + 135, + 133, + 1, + 81, + 96, + 0, + 25, + 96, + 3, + 136, + 144, + 27, + 96, + 248, + 22, + 28, + 25, + 22, + 129, + 85, + 91, + 80, + 80, + 80, + 80, + 80, + 96, + 1, + 144, + 129, + 27, + 1, + 144, + 85, + 80, + 86, + 91, + 96, + 0, + 96, + 1, + 130, + 1, + 97, + 25, + 158, + 87, + 97, + 25, + 158, + 97, + 23, + 226, + 86, + 91, + 80, + 96, + 1, + 1, + 144, + 86, + 91, + 96, + 0, + 96, + 32, + 128, + 131, + 1, + 129, + 132, + 82, + 128, + 133, + 81, + 128, + 131, + 82, + 96, + 64, + 134, + 1, + 145, + 80, + 96, + 64, + 129, + 96, + 5, + 27, + 135, + 1, + 1, + 146, + 80, + 131, + 135, + 1, + 96, + 0, + 91, + 130, + 129, + 16, + 21, + 97, + 25, + 250, + 87, + 96, + 63, + 25, + 136, + 134, + 3, + 1, + 132, + 82, + 97, + 25, + 232, + 133, + 131, + 81, + 97, + 18, + 60, + 86, + 91, + 148, + 80, + 146, + 133, + 1, + 146, + 144, + 133, + 1, + 144, + 96, + 1, + 1, + 97, + 25, + 204, + 86, + 91, + 80, + 146, + 151, + 150, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 129, + 81, + 128, + 132, + 82, + 96, + 32, + 128, + 133, + 1, + 148, + 80, + 128, + 132, + 1, + 96, + 0, + 91, + 131, 129, 16, 21, 97, - 20, - 177, + 26, + 55, 87, - 136, - 134, - 1, + 129, 81, + 135, + 82, + 149, 130, - 85, - 148, - 132, - 1, - 148, - 96, 1, + 149, 144, - 145, + 130, 1, 144, - 132, + 96, + 1, 1, 97, - 20, - 146, + 26, + 27, 86, 91, 80, - 133, - 130, - 16, - 21, - 97, - 20, - 207, - 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, - 144, - 27, - 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, - 91, + 148, + 149, + 148, 80, 80, 80, 80, 80, + 86, + 91, + 96, + 64, + 129, + 82, + 96, + 0, + 97, + 26, + 85, 96, + 64, + 131, 1, - 144, + 133, + 97, + 26, + 7, + 86, + 91, + 130, 129, - 27, + 3, + 96, + 32, + 132, 1, - 144, - 85, - 80, + 82, + 97, + 18, + 158, + 129, + 133, + 97, + 18, + 16, 86, 91, 96, 0, 96, 32, - 128, - 131, - 1, - 129, + 130, 132, - 82, + 3, + 18, + 21, + 97, + 26, + 121, + 87, + 96, + 0, 128, - 133, + 253, + 91, + 129, 81, 128, + 21, + 21, + 129, + 20, + 97, + 18, + 186, + 87, + 96, + 0, + 128, + 253, + 91, 131, + 129, + 82, + 96, + 0, + 96, + 32, + 96, + 96, + 129, + 132, + 1, 82, + 97, + 26, + 163, + 96, + 96, + 132, + 1, + 134, + 97, + 26, + 7, + 86, + 91, 96, 64, - 146, - 80, + 132, 130, + 3, + 129, 134, 1, + 82, + 129, + 134, + 81, + 128, + 132, + 82, + 132, + 132, + 1, 145, 80, - 130, + 132, 129, 96, 5, 27, - 135, + 133, 1, 1, - 132, - 136, + 133, + 137, 1, 96, 0, @@ -11287,118 +14300,63 @@ pub mod summa { 16, 21, 97, + 27, 21, - 141, 87, + 134, + 131, + 3, 96, - 63, + 31, 25, - 137, - 132, - 3, 1, 133, 82, 129, 81, - 96, 128, - 129, 81, - 129, - 134, - 82, - 97, - 21, - 44, - 130, 135, - 1, - 130, - 97, - 15, - 134, - 86, - 91, - 145, - 80, - 80, - 136, - 130, - 1, - 81, 133, - 130, - 3, - 138, - 135, - 1, 82, 97, - 21, - 68, - 130, - 130, - 97, - 15, + 26, + 233, + 136, 134, - 86, - 91, - 145, - 80, - 80, - 135, - 130, 1, - 81, - 133, - 130, - 3, - 137, - 135, - 1, - 82, - 97, - 21, - 92, - 130, 130, 97, - 15, - 134, - 86, - 91, - 145, - 80, - 80, - 96, - 96, - 128, - 131, + 18, + 16, + 86, + 91, + 145, + 138, 1, 81, - 146, - 80, 133, - 130, + 131, 3, - 129, - 135, + 134, + 140, 1, 82, + 145, + 144, 80, 97, - 21, - 121, + 27, + 1, 129, 131, 97, - 15, - 134, + 18, + 16, 86, 91, 150, - 137, + 138, 1, 150, 148, @@ -11406,21 +14364,24 @@ pub mod summa { 80, 80, 144, - 134, + 135, 1, 144, 96, 1, 1, 97, - 21, - 6, + 26, + 197, 86, 91, 80, 144, - 152, - 151, + 155, + 154, + 80, + 80, + 80, 80, 80, 80, @@ -11441,38 +14402,38 @@ pub mod summa { 34, 18, 32, - 243, - 47, - 132, - 14, - 221, - 200, + 69, + 217, + 51, + 111, + 11, + 99, + 20, + 121, + 100, + 150, + 199, + 161, + 207, + 22, 12, - 236, - 130, - 235, - 143, - 5, - 195, - 78, - 49, - 31, + 25, + 180, + 42, + 97, + 148, + 58, + 144, + 251, + 91, + 190, 44, - 9, - 34, - 218, - 112, - 185, - 0, - 232, - 151, - 24, - 130, - 217, - 64, - 229, - 4, - 73, + 252, + 239, + 16, + 123, + 181, + 219, 100, 115, 111, @@ -11582,13 +14543,30 @@ pub mod summa { .method_hash([163, 196, 188, 248], p0) .expect("method not found (this should never happen)") } - ///Calls the contract's `mstRoots` (0x7f3bfb2e) function - pub fn mst_roots( + ///Calls the contract's `commitments` (0x49ce8997) function + pub fn commitments( &self, p0: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([127, 59, 251, 46], p0) + .method_hash([73, 206, 137, 151], p0) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `config` (0x79502c55) function + pub fn config( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([121, 80, 44, 85], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `getAddressOwnershipProof` (0x19b33968) function + pub fn get_address_ownership_proof( + &self, + address_hash: [u8; 32], + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([25, 179, 57, 104], address_hash) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -11602,15 +14580,6 @@ pub mod summa { .method_hash([141, 165, 203, 91], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `ownershipProofByAddress` (0x23eb94a0) function - pub fn ownership_proof_by_address( - &self, - p0: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([35, 235, 148, 160], p0) - .expect("method not found (this should never happen)") - } ///Calls the contract's `renounceOwnership` (0x715018a6) function pub fn renounce_ownership( &self, @@ -11619,25 +14588,28 @@ pub mod summa { .method_hash([113, 80, 24, 166], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `submitProofOfAddressOwnership` (0xc7ddca0e) function - pub fn submit_proof_of_address_ownership( + ///Calls the contract's `submitCommitment` (0xda64a750) function + pub fn submit_commitment( &self, - address_ownership_proofs: ::std::vec::Vec, + mst_root: ::ethers::core::types::U256, + root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + cryptocurrencies: ::std::vec::Vec, + timestamp: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([199, 221, 202, 14], address_ownership_proofs) + .method_hash( + [218, 100, 167, 80], + (mst_root, root_balances, cryptocurrencies, timestamp), + ) .expect("method not found (this should never happen)") } - ///Calls the contract's `submitProofOfSolvency` (0x413a9f2d) function - pub fn submit_proof_of_solvency( + ///Calls the contract's `submitProofOfAddressOwnership` (0xc7ddca0e) function + pub fn submit_proof_of_address_ownership( &self, - mst_root: ::ethers::core::types::U256, - assets: ::std::vec::Vec, - proof: ::ethers::core::types::Bytes, - timestamp: ::ethers::core::types::U256, + address_ownership_proofs: ::std::vec::Vec, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([65, 58, 159, 45], (mst_root, assets, proof, timestamp)) + .method_hash([199, 221, 202, 14], address_ownership_proofs) .expect("method not found (this should never happen)") } ///Calls the contract's `transferOwnership` (0xf2fde38b) function @@ -11660,16 +14632,6 @@ pub mod summa { .method_hash([200, 229, 129, 71], (proof, public_inputs, timestamp)) .expect("method not found (this should never happen)") } - ///Calls the contract's `verifySolvencyProof` (0x6c7684fe) function - pub fn verify_solvency_proof( - &self, - proof: ::ethers::core::types::Bytes, - public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([108, 118, 132, 254], (proof, public_inputs)) - .expect("method not found (this should never happen)") - } ///Gets the contract's `AddressOwnershipProofSubmitted` event pub fn address_ownership_proof_submitted_filter( &self, @@ -11680,23 +14642,23 @@ pub mod summa { > { self.0.event() } - ///Gets the contract's `OwnershipTransferred` event - pub fn ownership_transferred_filter( + ///Gets the contract's `LiabilitiesCommitmentSubmitted` event + pub fn liabilities_commitment_submitted_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - OwnershipTransferredFilter, + LiabilitiesCommitmentSubmittedFilter, > { self.0.event() } - ///Gets the contract's `SolvencyProofSubmitted` event - pub fn solvency_proof_submitted_filter( + ///Gets the contract's `OwnershipTransferred` event + pub fn ownership_transferred_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - SolvencyProofSubmittedFilter, + OwnershipTransferredFilter, > { self.0.event() } @@ -11741,14 +14703,15 @@ pub mod summa { Hash )] #[ethevent( - name = "OwnershipTransferred", - abi = "OwnershipTransferred(address,address)" + name = "LiabilitiesCommitmentSubmitted", + abi = "LiabilitiesCommitmentSubmitted(uint256,uint256,uint256[],(string,string)[])" )] - pub struct OwnershipTransferredFilter { - #[ethevent(indexed)] - pub previous_owner: ::ethers::core::types::Address, + pub struct LiabilitiesCommitmentSubmittedFilter { #[ethevent(indexed)] - pub new_owner: ::ethers::core::types::Address, + pub timestamp: ::ethers::core::types::U256, + pub mst_root: ::ethers::core::types::U256, + pub root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + pub cryptocurrencies: ::std::vec::Vec, } #[derive( Clone, @@ -11761,21 +14724,21 @@ pub mod summa { Hash )] #[ethevent( - name = "SolvencyProofSubmitted", - abi = "SolvencyProofSubmitted(uint256,uint256,(string,string,uint256)[])" + name = "OwnershipTransferred", + abi = "OwnershipTransferred(address,address)" )] - pub struct SolvencyProofSubmittedFilter { + pub struct OwnershipTransferredFilter { #[ethevent(indexed)] - pub timestamp: ::ethers::core::types::U256, - pub mst_root: ::ethers::core::types::U256, - pub assets: ::std::vec::Vec, + pub previous_owner: ::ethers::core::types::Address, + #[ethevent(indexed)] + pub new_owner: ::ethers::core::types::Address, } ///Container type for all of the contract's events #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum SummaEvents { AddressOwnershipProofSubmittedFilter(AddressOwnershipProofSubmittedFilter), + LiabilitiesCommitmentSubmittedFilter(LiabilitiesCommitmentSubmittedFilter), OwnershipTransferredFilter(OwnershipTransferredFilter), - SolvencyProofSubmittedFilter(SolvencyProofSubmittedFilter), } impl ::ethers::contract::EthLogDecode for SummaEvents { fn decode_log( @@ -11784,12 +14747,12 @@ pub mod summa { if let Ok(decoded) = AddressOwnershipProofSubmittedFilter::decode_log(log) { return Ok(SummaEvents::AddressOwnershipProofSubmittedFilter(decoded)); } + if let Ok(decoded) = LiabilitiesCommitmentSubmittedFilter::decode_log(log) { + return Ok(SummaEvents::LiabilitiesCommitmentSubmittedFilter(decoded)); + } if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { return Ok(SummaEvents::OwnershipTransferredFilter(decoded)); } - if let Ok(decoded) = SolvencyProofSubmittedFilter::decode_log(log) { - return Ok(SummaEvents::SolvencyProofSubmittedFilter(decoded)); - } Err(::ethers::core::abi::Error::InvalidData) } } @@ -11799,10 +14762,10 @@ pub mod summa { Self::AddressOwnershipProofSubmittedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::OwnershipTransferredFilter(element) => { + Self::LiabilitiesCommitmentSubmittedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SolvencyProofSubmittedFilter(element) => { + Self::OwnershipTransferredFilter(element) => { ::core::fmt::Display::fmt(element, f) } } @@ -11813,16 +14776,16 @@ pub mod summa { Self::AddressOwnershipProofSubmittedFilter(value) } } + impl ::core::convert::From for SummaEvents { + fn from(value: LiabilitiesCommitmentSubmittedFilter) -> Self { + Self::LiabilitiesCommitmentSubmittedFilter(value) + } + } impl ::core::convert::From for SummaEvents { fn from(value: OwnershipTransferredFilter) -> Self { Self::OwnershipTransferredFilter(value) } } - impl ::core::convert::From for SummaEvents { - fn from(value: SolvencyProofSubmittedFilter) -> Self { - Self::SolvencyProofSubmittedFilter(value) - } - } ///Container type for all input parameters for the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` #[derive( Clone, @@ -11836,7 +14799,7 @@ pub mod summa { )] #[ethcall(name = "addressOwnershipProofs", abi = "addressOwnershipProofs(uint256)")] pub struct AddressOwnershipProofsCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `mstRoots` function with signature `mstRoots(uint256)` and selector `0x7f3bfb2e` + ///Container type for all input parameters for the `commitments` function with signature `commitments(uint256)` and selector `0x49ce8997` #[derive( Clone, ::ethers::contract::EthCall, @@ -11847,9 +14810,9 @@ pub mod summa { Eq, Hash )] - #[ethcall(name = "mstRoots", abi = "mstRoots(uint256)")] - pub struct MstRootsCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` + #[ethcall(name = "commitments", abi = "commitments(uint256)")] + pub struct CommitmentsCall(pub ::ethers::core::types::U256); + ///Container type for all input parameters for the `config` function with signature `config()` and selector `0x79502c55` #[derive( Clone, ::ethers::contract::EthCall, @@ -11860,9 +14823,9 @@ pub mod summa { Eq, Hash )] - #[ethcall(name = "owner", abi = "owner()")] - pub struct OwnerCall; - ///Container type for all input parameters for the `ownershipProofByAddress` function with signature `ownershipProofByAddress(bytes32)` and selector `0x23eb94a0` + #[ethcall(name = "config", abi = "config()")] + pub struct ConfigCall; + ///Container type for all input parameters for the `getAddressOwnershipProof` function with signature `getAddressOwnershipProof(bytes32)` and selector `0x19b33968` #[derive( Clone, ::ethers::contract::EthCall, @@ -11874,10 +14837,25 @@ pub mod summa { Hash )] #[ethcall( - name = "ownershipProofByAddress", - abi = "ownershipProofByAddress(bytes32)" + name = "getAddressOwnershipProof", + abi = "getAddressOwnershipProof(bytes32)" + )] + pub struct GetAddressOwnershipProofCall { + pub address_hash: [u8; 32], + } + ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash )] - pub struct OwnershipProofByAddressCall(pub [u8; 32]); + #[ethcall(name = "owner", abi = "owner()")] + pub struct OwnerCall; ///Container type for all input parameters for the `renounceOwnership` function with signature `renounceOwnership()` and selector `0x715018a6` #[derive( Clone, @@ -11891,7 +14869,7 @@ pub mod summa { )] #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `submitProofOfAddressOwnership` function with signature `submitProofOfAddressOwnership((string,string,bytes,bytes)[])` and selector `0xc7ddca0e` + ///Container type for all input parameters for the `submitCommitment` function with signature `submitCommitment(uint256,uint256[],(string,string)[],uint256)` and selector `0xda64a750` #[derive( Clone, ::ethers::contract::EthCall, @@ -11903,13 +14881,16 @@ pub mod summa { Hash )] #[ethcall( - name = "submitProofOfAddressOwnership", - abi = "submitProofOfAddressOwnership((string,string,bytes,bytes)[])" + name = "submitCommitment", + abi = "submitCommitment(uint256,uint256[],(string,string)[],uint256)" )] - pub struct SubmitProofOfAddressOwnershipCall { - pub address_ownership_proofs: ::std::vec::Vec, + pub struct SubmitCommitmentCall { + pub mst_root: ::ethers::core::types::U256, + pub root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + pub cryptocurrencies: ::std::vec::Vec, + pub timestamp: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `submitProofOfSolvency` function with signature `submitProofOfSolvency(uint256,(string,string,uint256)[],bytes,uint256)` and selector `0x413a9f2d` + ///Container type for all input parameters for the `submitProofOfAddressOwnership` function with signature `submitProofOfAddressOwnership((string,string,bytes,bytes)[])` and selector `0xc7ddca0e` #[derive( Clone, ::ethers::contract::EthCall, @@ -11921,14 +14902,11 @@ pub mod summa { Hash )] #[ethcall( - name = "submitProofOfSolvency", - abi = "submitProofOfSolvency(uint256,(string,string,uint256)[],bytes,uint256)" + name = "submitProofOfAddressOwnership", + abi = "submitProofOfAddressOwnership((string,string,bytes,bytes)[])" )] - pub struct SubmitProofOfSolvencyCall { - pub mst_root: ::ethers::core::types::U256, - pub assets: ::std::vec::Vec, - pub proof: ::ethers::core::types::Bytes, - pub timestamp: ::ethers::core::types::U256, + pub struct SubmitProofOfAddressOwnershipCall { + pub address_ownership_proofs: ::std::vec::Vec, } ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` #[derive( @@ -11965,38 +14943,19 @@ pub mod summa { pub public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, pub timestamp: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `verifySolvencyProof` function with signature `verifySolvencyProof(bytes,uint256[])` and selector `0x6c7684fe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "verifySolvencyProof", - abi = "verifySolvencyProof(bytes,uint256[])" - )] - pub struct VerifySolvencyProofCall { - pub proof: ::ethers::core::types::Bytes, - pub public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - } ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum SummaCalls { AddressOwnershipProofs(AddressOwnershipProofsCall), - MstRoots(MstRootsCall), + Commitments(CommitmentsCall), + Config(ConfigCall), + GetAddressOwnershipProof(GetAddressOwnershipProofCall), Owner(OwnerCall), - OwnershipProofByAddress(OwnershipProofByAddressCall), RenounceOwnership(RenounceOwnershipCall), + SubmitCommitment(SubmitCommitmentCall), SubmitProofOfAddressOwnership(SubmitProofOfAddressOwnershipCall), - SubmitProofOfSolvency(SubmitProofOfSolvencyCall), TransferOwnership(TransferOwnershipCall), VerifyInclusionProof(VerifyInclusionProofCall), - VerifySolvencyProof(VerifySolvencyProofCall), } impl ::ethers::core::abi::AbiDecode for SummaCalls { fn decode( @@ -12010,18 +14969,22 @@ pub mod summa { return Ok(Self::AddressOwnershipProofs(decoded)); } if let Ok(decoded) - = ::decode(data) { - return Ok(Self::MstRoots(decoded)); + = ::decode(data) { + return Ok(Self::Commitments(decoded)); } if let Ok(decoded) - = ::decode(data) { - return Ok(Self::Owner(decoded)); + = ::decode(data) { + return Ok(Self::Config(decoded)); } if let Ok(decoded) - = ::decode( + = ::decode( data, ) { - return Ok(Self::OwnershipProofByAddress(decoded)); + return Ok(Self::GetAddressOwnershipProof(decoded)); + } + if let Ok(decoded) + = ::decode(data) { + return Ok(Self::Owner(decoded)); } if let Ok(decoded) = ::decode( @@ -12030,16 +14993,16 @@ pub mod summa { return Ok(Self::RenounceOwnership(decoded)); } if let Ok(decoded) - = ::decode( + = ::decode( data, ) { - return Ok(Self::SubmitProofOfAddressOwnership(decoded)); + return Ok(Self::SubmitCommitment(decoded)); } if let Ok(decoded) - = ::decode( + = ::decode( data, ) { - return Ok(Self::SubmitProofOfSolvency(decoded)); + return Ok(Self::SubmitProofOfAddressOwnership(decoded)); } if let Ok(decoded) = ::decode( @@ -12053,12 +15016,6 @@ pub mod summa { ) { return Ok(Self::VerifyInclusionProof(decoded)); } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::VerifySolvencyProof(decoded)); - } Err(::ethers::core::abi::Error::InvalidData.into()) } } @@ -12068,20 +15025,21 @@ pub mod summa { Self::AddressOwnershipProofs(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::MstRoots(element) => { + Self::Commitments(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::OwnershipProofByAddress(element) => { + Self::Config(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetAddressOwnershipProof(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::RenounceOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::SubmitProofOfAddressOwnership(element) => { + Self::SubmitCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::SubmitProofOfSolvency(element) => { + Self::SubmitProofOfAddressOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::TransferOwnership(element) => { @@ -12090,9 +15048,6 @@ pub mod summa { Self::VerifyInclusionProof(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::VerifySolvencyProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } } } } @@ -12102,25 +15057,21 @@ pub mod summa { Self::AddressOwnershipProofs(element) => { ::core::fmt::Display::fmt(element, f) } - Self::MstRoots(element) => ::core::fmt::Display::fmt(element, f), - Self::Owner(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnershipProofByAddress(element) => { + Self::Commitments(element) => ::core::fmt::Display::fmt(element, f), + Self::Config(element) => ::core::fmt::Display::fmt(element, f), + Self::GetAddressOwnershipProof(element) => { ::core::fmt::Display::fmt(element, f) } + Self::Owner(element) => ::core::fmt::Display::fmt(element, f), Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), + Self::SubmitCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::SubmitProofOfAddressOwnership(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SubmitProofOfSolvency(element) => { - ::core::fmt::Display::fmt(element, f) - } Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), Self::VerifyInclusionProof(element) => { ::core::fmt::Display::fmt(element, f) } - Self::VerifySolvencyProof(element) => { - ::core::fmt::Display::fmt(element, f) - } } } } @@ -12129,9 +15080,19 @@ pub mod summa { Self::AddressOwnershipProofs(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: MstRootsCall) -> Self { - Self::MstRoots(value) + impl ::core::convert::From for SummaCalls { + fn from(value: CommitmentsCall) -> Self { + Self::Commitments(value) + } + } + impl ::core::convert::From for SummaCalls { + fn from(value: ConfigCall) -> Self { + Self::Config(value) + } + } + impl ::core::convert::From for SummaCalls { + fn from(value: GetAddressOwnershipProofCall) -> Self { + Self::GetAddressOwnershipProof(value) } } impl ::core::convert::From for SummaCalls { @@ -12139,26 +15100,21 @@ pub mod summa { Self::Owner(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: OwnershipProofByAddressCall) -> Self { - Self::OwnershipProofByAddress(value) - } - } impl ::core::convert::From for SummaCalls { fn from(value: RenounceOwnershipCall) -> Self { Self::RenounceOwnership(value) } } + impl ::core::convert::From for SummaCalls { + fn from(value: SubmitCommitmentCall) -> Self { + Self::SubmitCommitment(value) + } + } impl ::core::convert::From for SummaCalls { fn from(value: SubmitProofOfAddressOwnershipCall) -> Self { Self::SubmitProofOfAddressOwnership(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: SubmitProofOfSolvencyCall) -> Self { - Self::SubmitProofOfSolvency(value) - } - } impl ::core::convert::From for SummaCalls { fn from(value: TransferOwnershipCall) -> Self { Self::TransferOwnership(value) @@ -12169,11 +15125,6 @@ pub mod summa { Self::VerifyInclusionProof(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: VerifySolvencyProofCall) -> Self { - Self::VerifySolvencyProof(value) - } - } ///Container type for all return fields from the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` #[derive( Clone, @@ -12191,7 +15142,7 @@ pub mod summa { pub signature: ::ethers::core::types::Bytes, pub message: ::ethers::core::types::Bytes, } - ///Container type for all return fields from the `mstRoots` function with signature `mstRoots(uint256)` and selector `0x7f3bfb2e` + ///Container type for all return fields from the `commitments` function with signature `commitments(uint256)` and selector `0x49ce8997` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12202,8 +15153,10 @@ pub mod summa { Eq, Hash )] - pub struct MstRootsReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` + pub struct CommitmentsReturn { + pub mst_root: ::ethers::core::types::U256, + } + ///Container type for all return fields from the `config` function with signature `config()` and selector `0x79502c55` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12214,8 +15167,12 @@ pub mod summa { Eq, Hash )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `ownershipProofByAddress` function with signature `ownershipProofByAddress(bytes32)` and selector `0x23eb94a0` + pub struct ConfigReturn { + pub mst_levels: u16, + pub currencies_count: u16, + pub balance_byte_range: u8, + } + ///Container type for all return fields from the `getAddressOwnershipProof` function with signature `getAddressOwnershipProof(bytes32)` and selector `0x19b33968` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12226,8 +15183,8 @@ pub mod summa { Eq, Hash )] - pub struct OwnershipProofByAddressReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` + pub struct GetAddressOwnershipProofReturn(pub AddressOwnershipProof); + ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12238,8 +15195,8 @@ pub mod summa { Eq, Hash )] - pub struct VerifyInclusionProofReturn(pub bool); - ///Container type for all return fields from the `verifySolvencyProof` function with signature `verifySolvencyProof(bytes,uint256[])` and selector `0x6c7684fe` + pub struct OwnerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12250,7 +15207,7 @@ pub mod summa { Eq, Hash )] - pub struct VerifySolvencyProofReturn(pub bool); + pub struct VerifyInclusionProofReturn(pub bool); ///`AddressOwnershipProof(string,string,bytes,bytes)` #[derive( Clone, @@ -12268,7 +15225,7 @@ pub mod summa { pub signature: ::ethers::core::types::Bytes, pub message: ::ethers::core::types::Bytes, } - ///`Asset(string,string,uint256)` + ///`Cryptocurrency(string,string)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -12279,9 +15236,8 @@ pub mod summa { Eq, Hash )] - pub struct Asset { - pub asset_name: ::std::string::String, + pub struct Cryptocurrency { + pub name: ::std::string::String, pub chain: ::std::string::String, - pub amount: ::ethers::core::types::U256, } } diff --git a/backend/src/contracts/signer.rs b/backend/src/contracts/signer.rs index 3d1fd129..abab24ef 100644 --- a/backend/src/contracts/signer.rs +++ b/backend/src/contracts/signer.rs @@ -2,13 +2,13 @@ use ethers::{ prelude::SignerMiddleware, providers::{Http, Middleware, Provider}, signers::{LocalWallet, Signer}, - types::Address, + types::{Address, U256}, }; use serde_json::Value; use std::{error::Error, fs::File, io::BufReader, path::Path, str::FromStr, sync::Arc}; use tokio::sync::Mutex; -use super::generated::summa_contract::{AddressOwnershipProof, Asset}; +use super::generated::summa_contract::{AddressOwnershipProof, Cryptocurrency}; use crate::contracts::generated::summa_contract::Summa; pub enum AddressInput { @@ -104,21 +104,24 @@ impl SummaSigner { Ok(()) } - pub async fn submit_proof_of_solvency( + pub async fn submit_commitment( &self, - mst_root: ethers::types::U256, - assets: Vec, - proof: ethers::types::Bytes, - timestamp: ethers::types::U256, + mst_root: U256, + root_sums: Vec, + cryptocurrencies: Vec, + timestamp: U256, ) -> Result<(), Box> { let lock_guard = self.nonce_lock.lock().await; - let submit_proof_of_solvency_call = &self - .summa_contract - .submit_proof_of_solvency(mst_root, assets, proof, timestamp); + let submit_liability_commitment = &self.summa_contract.submit_commitment( + mst_root, + root_sums, + cryptocurrencies, + timestamp, + ); // To prevent nonce collision, we lock the nonce before sending the transaction - let tx = submit_proof_of_solvency_call.send().await?; + let tx = submit_liability_commitment.send().await?; // Wait for the pending transaction to be mined tx.await?; diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 6c363179..534b1b65 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -2,3 +2,4 @@ pub mod apis; pub mod contracts; pub mod tests; +pub use summa_solvency::merkle_sum_tree; diff --git a/backend/src/tests.rs b/backend/src/tests.rs index aac59da5..dbf1980c 100644 --- a/backend/src/tests.rs +++ b/backend/src/tests.rs @@ -1,7 +1,8 @@ use std::{sync::Arc, time::Duration}; use ethers::{ - prelude::{ContractFactory, SignerMiddleware}, + abi::Token, + prelude::SignerMiddleware, providers::{Http, Middleware, Provider}, signers::{LocalWallet, Signer}, types::{H160, U256}, @@ -9,11 +10,7 @@ use ethers::{ }; use tokio::time; -use crate::contracts::generated::{ - inclusion_verifier::InclusionVerifier, solvency_verifier::SolvencyVerifier, - summa_contract::Summa, -}; -use crate::contracts::mock::mock_erc20::{MockERC20, MOCKERC20_ABI, MOCKERC20_BYTECODE}; +use crate::contracts::generated::{inclusion_verifier::InclusionVerifier, summa_contract::Summa}; // Setup test environment on the anvil instance pub async fn initialize_test_env( @@ -53,7 +50,6 @@ pub async fn initialize_test_env( )); // Send RPC requests with `anvil_setBalance` method via provider to set ETH balance of `cex_addr_1` and `cex_addr_2` - // This is for meeting `proof_of_solvency` test conditions for addr in [cex_addr_1, cex_addr_2].iter().copied() { let _res = client .provider() @@ -61,66 +57,43 @@ pub async fn initialize_test_env( .await; } - // Mock ERC20 contract deployment - // Creating a factory to deploy a mock ERC20 contract - let factory = ContractFactory::new( - MOCKERC20_ABI.to_owned(), - MOCKERC20_BYTECODE.to_owned(), - Arc::clone(&client), - ); - - // Deploy Mock ERC20 contract - let mock_erc20_deployment = factory.deploy(()).unwrap().send().await.unwrap(); - - // Creating an interface for the deployed mock ERC20 contract - let mock_erc20 = MockERC20::new(mock_erc20_deployment.address(), Arc::clone(&client)); - - // Mint some token to `cex_addr_2` - let mint_call = mock_erc20.mint(cex_addr_2, U256::from(556863)); - assert!(mint_call.send().await.is_ok()); - - time::sleep(Duration::from_millis(500)).await; - - if block_time != None { + if block_time.is_some() { time::sleep(Duration::from_secs(block_time.unwrap())).await; }; - // Deploy verifier contracts before deploy Summa contract - let solvency_verifer_contract = SolvencyVerifier::deploy(Arc::clone(&client), ()) + let inclusion_verifier_contract = InclusionVerifier::deploy(Arc::clone(&client), ()) .unwrap() .send() .await .unwrap(); - if block_time != None { + if block_time.is_some() { time::sleep(Duration::from_secs(block_time.unwrap())).await; }; - let inclusion_verifer_contract = InclusionVerifier::deploy(Arc::clone(&client), ()) + // The number of levels of the Merkle sum tree + let mst_levels = 4; + //The number of cryptocurrencies supported by the Merkle sum tree + let currencies_count = 2; + // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree + let balance_byte_range = 14; + + let args: &[Token] = &[ + Token::Address(inclusion_verifier_contract.address()), + Token::Uint(mst_levels.into()), + Token::Uint(currencies_count.into()), + Token::Uint(balance_byte_range.into()), + ]; + // Deploy Summa contract + let summa_contract = Summa::deploy(Arc::clone(&client), args) .unwrap() .send() .await .unwrap(); - if block_time != None { - time::sleep(Duration::from_secs(block_time.unwrap())).await; - }; - - // Deploy Summa contract - let summa_contract = Summa::deploy( - Arc::clone(&client), - ( - solvency_verifer_contract.address(), - inclusion_verifer_contract.address(), - ), - ) - .unwrap() - .send() - .await - .unwrap(); - time::sleep(Duration::from_secs(3)).await; + (anvil, cex_addr_1, cex_addr_2, client, summa_contract) } @@ -133,6 +106,7 @@ mod test { utils::to_checksum, }; use std::{convert::TryFrom, error::Error}; + use summa_solvency::merkle_sum_tree::MerkleSumTree; use tokio::{ join, time::{sleep, Duration}, @@ -141,8 +115,8 @@ mod test { use crate::apis::{address_ownership::AddressOwnership, round::Round}; use crate::contracts::{ generated::summa_contract::{ - AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Asset, - SolvencyProofSubmittedFilter, + AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Cryptocurrency, + LiabilitiesCommitmentSubmittedFilter, }, signer::{AddressInput, SummaSigner}, }; @@ -170,7 +144,7 @@ mod test { } #[tokio::test] - async fn test_concurrent_proof_submissions() -> Result<(), Box> { + async fn test_concurrent_sumbit_commitments() -> Result<(), Box> { let (anvil, _, _, _, summa_contract) = initialize_test_env(Some(1)).await; // This test ensures that two proofs, when dispatched concurrently, do not result in nonce collisions. @@ -183,32 +157,22 @@ mod test { ) .await?; - // At least one address ownership proof should be submitted before submitting solvency proof - let mut address_ownership_client = - AddressOwnership::new(&signer, "src/apis/csv/signatures.csv").unwrap(); - - address_ownership_client - .dispatch_proof_of_address_ownership() - .await?; - - // Do sumbit solvency proofs simultaneously - let asset_csv = "src/apis/csv/assets.csv"; - let entry_csv = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; let params_path = "ptau/hermez-raw-11"; + let entry_csv = "../csv/entry_16.csv"; + let mst = MerkleSumTree::from_csv(entry_csv).unwrap(); let mut round_one = - Round::<4, 2, 14>::new(&signer, entry_csv, asset_csv, params_path, 1).unwrap(); - let mut round_two = - Round::<4, 2, 14>::new(&signer, entry_csv, asset_csv, params_path, 2).unwrap(); + Round::<4, 2, 14>::new(&signer, Box::new(mst.clone()), params_path, 1).unwrap(); + let mut round_two = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, 2).unwrap(); - // Checking block number before sending transaction of proof of solvency + // Checking block number before sending transaction of liability commitment let outer_provider: Provider = Provider::try_from(anvil.endpoint().as_str())?; let start_block_number = outer_provider.get_block_number().await?; - // Send two solvency proofs simultaneously + // Send two commitments simultaneously let (round_one_result, round_two_result) = join!( - round_one.dispatch_solvency_proof(), - round_two.dispatch_solvency_proof() + round_one.dispatch_commitment(), + round_two.dispatch_commitment() ); // Check two blocks has been mined @@ -239,7 +203,7 @@ mod test { .await?; let mut address_ownership_client = - AddressOwnership::new(&signer, "src/apis/csv/signatures.csv").unwrap(); + AddressOwnership::new(&signer, "../csv/signatures.csv").unwrap(); address_ownership_client .dispatch_proof_of_address_ownership() @@ -272,53 +236,47 @@ mod test { ); // Initialize round - let asset_csv = "src/apis/csv/assets.csv"; - let entry_csv = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; let params_path = "ptau/hermez-raw-11"; + let entry_csv = "../csv/entry_16.csv"; - let mut round = - Round::<4, 2, 14>::new(&signer, entry_csv, asset_csv, params_path, 1).unwrap(); + let mst = MerkleSumTree::from_csv(entry_csv).unwrap(); + let mut round = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, 1).unwrap(); - // Verify solvency proof - let mut solvency_proof_logs = summa_contract - .solvency_proof_submitted_filter() + let mut liability_commitment_logs = summa_contract + .liabilities_commitment_submitted_filter() .query() .await?; - assert_eq!(solvency_proof_logs.len(), 0); - - // Dispatch solvency proof - let assets = [ - Asset { - asset_name: "ETH".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863), - }, - Asset { - asset_name: "USDT".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863), - }, - ]; - - // Send sovlecy proof to contract - round.dispatch_solvency_proof().await?; - - // After sending transaction of proof of solvency, logs should be updated - solvency_proof_logs = summa_contract - .solvency_proof_submitted_filter() + assert_eq!(liability_commitment_logs.len(), 0); + + // Send liability commitment transaction + round.dispatch_commitment().await?; + + // After sending transaction of liability commitment, logs should be updated + liability_commitment_logs = summa_contract + .liabilities_commitment_submitted_filter() .query() .await?; - assert_eq!(solvency_proof_logs.len(), 1); + assert_eq!(liability_commitment_logs.len(), 1); assert_eq!( - solvency_proof_logs[0], - SolvencyProofSubmittedFilter { + liability_commitment_logs[0], + LiabilitiesCommitmentSubmittedFilter { timestamp: U256::from(1), - mst_root: "0x2E021D9BF99C5BD7267488B6A7A5CF5F7D00222A41B6A9B971899C44089E0C5" + mst_root: "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1" .parse() .unwrap(), - assets: assets.to_vec() + root_balances: vec![U256::from(556862), U256::from(556862)], + cryptocurrencies: vec![ + Cryptocurrency { + name: "ETH".to_string(), + chain: "ETH".to_string(), + }, + Cryptocurrency { + name: "USDT".to_string(), + chain: "ETH".to_string(), + }, + ], } ); diff --git a/contracts/README.md b/contracts/README.md index ac63c987..fbeea6c1 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -1,22 +1,49 @@ -# Summa Smart contract +# Summa Smart Contract -Install dependencies: +The [Summa smart contract](src/Summa.sol) acts as a registrar for Centralized Exchanges (CEXs) to commit to their liabilities by submitting a Merkle sum tree (MST) root of all the CEX liabilities owed to its users. Users can then verify their inclusion into the liabilities commitment, and the public can compare the committed total sums with the assets owned by the CEX onchain. + +## Features + +- **Address Ownership Proofs**: CEXs should submit the proof of address ownership for all addresses that hold the assets included into the commitment by using `submitProofOfAddressOwnership` function. The proofs are accepted optimistically and subject to off-chain verification. + +- **Liabilities Commitments**: CEXs can submit commitments to its liabilities in the form of MST roots and the corresponding total sums that represent the snapshots of the liabilities at a given timestamp by using `submitCommitment` function. + +- **Inclusion Verification**: Users are able to verify the zero-knowledge proof of inclusion of their balances into the MST using `verifyInclusionProof` function. The function is calling the underlying smart contract [Verifier](src/InclusionVerifier.sol). The verifier is generated from the [zk_prover](./../zk_prover/) module (see module's [readme](./../zk_prover/README.md)). + +## Installation + +Ensure you have Node.js installed on your machine before proceeding. The smart contract is written in Solidity and uses the Hardhat environment for testing and deployment. + +To set up the project environment, install the necessary dependencies: ```shell npm install ``` -Testing: +## Testing ```shell npx hardhat node REPORT_GAS=true npx hardhat test ``` -Deploying: +### Test Coverage + +```shell +npx hardhat coverage +``` + +## Deploying ```shell npx hardhat run scripts/deploy.ts --network localhost ``` -The deployment script will copy the contract ABIs from the ./artifacts/src/ to the [backend subproject](./../backend/src/contracts/abi/). The backend buildscript will then be able to generate the updated contract interfaces (see the [backend readme](./../backend/README.md)). +The following Summa contract parameters are passed to its constructor inside the deployment script: + +- verifier contract address (set automatically after the script deploys the verifier); +- the number of levels of the Merkle sum tree; +- the number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree. + +The deployment script writes the latest deployment address for the chain to the [deployments](./../backend/src/contracts/deployments.json) file in the backend project. This data can later be used by the backend module to connect to the deployed contract. +The deployment script will copy the contract ABIs from the ./artifacts/src/ to the [backend](./../backend/src/contracts/abi/) module. The backend buildscript will then be able to generate the updated contract interfaces (see the backend [readme](./../backend/README.md)). diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts index 4425c4dc..969517ab 100644 --- a/contracts/scripts/deploy.ts +++ b/contracts/scripts/deploy.ts @@ -10,19 +10,22 @@ type Deployments = { }; async function main() { - const solvencyVerifier = await ethers.deployContract( - "src/SolvencyVerifier.sol:Verifier" - ); - await solvencyVerifier.deployed(); - const inclusionVerifier = await ethers.deployContract( "src/InclusionVerifier.sol:Verifier" ); await inclusionVerifier.deployed(); + // The number of levels of the Merkle sum tree + const mstLevels = 4; + //The number of cryptocurrencies supported by the Merkle sum tree + const currenciesCount = 2; + // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree + const balanceByteRange = 14; const summa = await ethers.deployContract("Summa", [ - solvencyVerifier.address, inclusionVerifier.address, + mstLevels, + currenciesCount, + balanceByteRange, ]); await summa.deployed(); @@ -61,7 +64,6 @@ async function main() { //Copy the ABIs from `artifacts/src/*` to `backend/src/contracts/*` copyAbi(fs, "Summa", "Summa"); - copyAbi(fs, "SolvencyVerifier", "Verifier"); copyAbi(fs, "InclusionVerifier", "Verifier"); } diff --git a/contracts/src/InclusionVerifier.sol b/contracts/src/InclusionVerifier.sol index f6082fd5..cb77bddd 100644 --- a/contracts/src/InclusionVerifier.sol +++ b/contracts/src/InclusionVerifier.sol @@ -7,5 +7,5 @@ bytes memory proof ) public view returns (bool) { bool success = true; - bytes32[902] memory transcript; - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x0), 20780565364750352931855234182745264522567546354850733883253409196481354617515) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x60), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0x80), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x120), keccak256(add(transcript, 0x0), 288)){ let hash := mload(add(transcript, 0x120)) mstore(add(transcript, 0x140), mod(hash, f_q)) mstore(add(transcript, 0x160), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x180), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x200), keccak256(add(transcript, 0x160), 160)){ let hash := mload(add(transcript, 0x200)) mstore(add(transcript, 0x220), mod(hash, f_q)) mstore(add(transcript, 0x240), hash) }mstore8(add(transcript, 0x260), 1)mstore(add(transcript, 0x260), keccak256(add(transcript, 0x240), 33)){ let hash := mload(add(transcript, 0x260)) mstore(add(transcript, 0x280), mod(hash, f_q)) mstore(add(transcript, 0x2a0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2c0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x2e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3c0), keccak256(add(transcript, 0x2a0), 288)){ let hash := mload(add(transcript, 0x3c0)) mstore(add(transcript, 0x3e0), mod(hash, f_q)) mstore(add(transcript, 0x400), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x420), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x440), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x560), keccak256(add(transcript, 0x400), 352)){ let hash := mload(add(transcript, 0x560)) mstore(add(transcript, 0x580), mod(hash, f_q)) mstore(add(transcript, 0x5a0), hash) }mstore(add(transcript, 0x5c0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa20), keccak256(add(transcript, 0x5a0), 1152)){ let hash := mload(add(transcript, 0xa20)) mstore(add(transcript, 0xa40), mod(hash, f_q)) mstore(add(transcript, 0xa60), hash) }mstore8(add(transcript, 0xa80), 1)mstore(add(transcript, 0xa80), keccak256(add(transcript, 0xa60), 33)){ let hash := mload(add(transcript, 0xa80)) mstore(add(transcript, 0xaa0), mod(hash, f_q)) mstore(add(transcript, 0xac0), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xae0), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb00), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb20), keccak256(add(transcript, 0xac0), 96)){ let hash := mload(add(transcript, 0xb20)) mstore(add(transcript, 0xb40), mod(hash, f_q)) mstore(add(transcript, 0xb60), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xb80), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xba0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), addmod(mload(add(transcript, 0xd00)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd40)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x580)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd40)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x580)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd40)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x580)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd40)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x580)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd40)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x580)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd40)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd40)), 1, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd40)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)){ let prod := mload(add(transcript, 0xd80)) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xd20)), prod, f_q) mstore(add(transcript, 0x1040), prod) }mstore(add(transcript, 0x1080), 32)mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), mload(add(transcript, 0x1040)))mstore(add(transcript, 0x1100), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1080), 0xc0, add(transcript, 0x1060), 0x20), 1), success){ let inv := mload(add(transcript, 0x1060)) let v v := mload(add(transcript, 0xd20)) mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xd80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd80), inv) }mstore(add(transcript, 0x1140), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1200)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x40)), f_q), result, f_q)mstore(add(transcript, 0x1240), result) }mstore(add(transcript, 0x1260), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1260)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1300), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x1320)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x12e0)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), addmod(mload(add(transcript, 0x13a0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x12c0)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x1360)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1460), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), addmod(mload(add(transcript, 0x1460)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x14a0)), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x12c0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x14e0)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1540)), f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x640)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x1300)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x1580)), mload(add(transcript, 0x15a0)), f_q))mstore(add(transcript, 0x15e0), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x6a0)), f_q))mstore(add(transcript, 0x1600), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x600)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x620)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16a0), addmod(mload(add(transcript, 0x1660)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), addmod(mload(add(transcript, 0x1640)), sub(f_q, mload(add(transcript, 0x16a0))), f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1700)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x640)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1300)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1780), addmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x600)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x17e0), mulmod(mload(add(transcript, 0x620)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x17e0)), f_q))mstore(add(transcript, 0x1820), addmod(mload(add(transcript, 0x17a0)), sub(f_q, mload(add(transcript, 0x1800))), f_q))mstore(add(transcript, 0x1840), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1860)), f_q))mstore(add(transcript, 0x18a0), addmod(1, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x18a0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x18e0), addmod(2, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1920), addmod(4, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x1980), addmod(mload(add(transcript, 0x1960)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x19a0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x19c0)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x1a20)), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1aa0)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1b60), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1bc0), addmod(mload(add(transcript, 0x1b80)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1c20), addmod(mload(add(transcript, 0x1be0)), mload(add(transcript, 0x1c00)), f_q))mstore(add(transcript, 0x1c40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), addmod(3, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1ca0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), addmod(mload(add(transcript, 0x1c40)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1d20), addmod(mload(add(transcript, 0x1ce0)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1d80)), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), addmod(1, sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1e00), mulmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e20), addmod(mload(add(transcript, 0x1d40)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1e20)), f_q))mstore(add(transcript, 0x1e60), mulmod(2, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ec0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1ea0)), sub(f_q, mload(add(transcript, 0x1ec0))), f_q))mstore(add(transcript, 0x1f00), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1f20), addmod(mload(add(transcript, 0x1ee0)), sub(f_q, mload(add(transcript, 0x1f00))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e40)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1fc0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x1fe0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x2000)), mload(add(transcript, 0x1fc0)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2040)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x8e0))), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2140), mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x2140)), sub(f_q, mload(add(transcript, 0x940))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x2160)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x21a0)), f_q))mstore(add(transcript, 0x21e0), addmod(mload(add(transcript, 0x940)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2200), mulmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x21c0)), mload(add(transcript, 0x2200)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), addmod(1, sub(f_q, mload(add(transcript, 0x1140))), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x1160)), mload(add(transcript, 0x1180)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x22c0), addmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x22c0)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x2260)), sub(f_q, mload(add(transcript, 0x22e0))), f_q))mstore(add(transcript, 0x2320), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2340), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2320)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x23a0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x23a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x23e0), mulmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x2400), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x2420)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x24c0), addmod(mload(add(transcript, 0x24a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x24e0), mulmod(mload(add(transcript, 0x24c0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x2500), mulmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x900)), f_q))mstore(add(transcript, 0x2520), mulmod(1, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x25a0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2580)), f_q))mstore(add(transcript, 0x2640), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x2680)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x26c0), mulmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x26e0), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(mload(add(transcript, 0x2760)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x27a0), addmod(mload(add(transcript, 0x2500)), sub(f_q, mload(add(transcript, 0x2780))), f_q))mstore(add(transcript, 0x27c0), mulmod(mload(add(transcript, 0x27a0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x2240)), mload(add(transcript, 0x27c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x28a0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x2880)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2860)), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2920), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2940)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2960)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x29a0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x2900)), sub(f_q, mload(add(transcript, 0x2a40))), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x2800)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2aa0)), f_q))mstore(add(transcript, 0x2ae0), addmod(1, sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x2ae0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x2ac0)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2b20)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x2b60)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ba0)), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2c20)), f_q))mstore(add(transcript, 0x2c80), mulmod(256, mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x2ca0), addmod(mload(add(transcript, 0x5c0)), sub(f_q, mload(add(transcript, 0x2c80))), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d60), addmod(mload(add(transcript, 0x2c60)), sub(f_q, mload(add(transcript, 0x2d40))), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2da0), addmod(mload(add(transcript, 0x2be0)), mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2dc0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2da0)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0xa00))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x2e00)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2e20)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2e80), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2ea0), mulmod(mload(add(transcript, 0x2e80)), mload(add(transcript, 0x2e60)), f_q))mstore(add(transcript, 0x2ec0), addmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x2ee0), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x2ee0)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f20), mulmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f60), mulmod(1, mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f80), mulmod(1, mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2fa0), mulmod(1, mload(add(transcript, 0x2f00)), f_q))mstore(add(transcript, 0x2fc0), mulmod(1, mload(add(transcript, 0x2f20)), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2ec0)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x580)), 1, f_q))mstore(add(transcript, 0x3040), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3020))), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x3080), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3060))), f_q))mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x580)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x30c0), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30a0))), f_q))mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3100), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30e0))), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3140), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x3160), result) }mstore(add(transcript, 0x3180), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3080)), f_q))mstore(add(transcript, 0x31c0), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x3100)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x31e0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3200), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3220), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3240), result) }mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x30c0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x32c0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x32e0), result) }mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3100)), f_q)){ let prod := mload(add(transcript, 0x3120)) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x3320), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3340), prod) prod := mulmod(mload(add(transcript, 0x31e0)), prod, f_q) mstore(add(transcript, 0x3360), prod) prod := mulmod(mload(add(transcript, 0x3180)), prod, f_q) mstore(add(transcript, 0x3380), prod) prod := mulmod(mload(add(transcript, 0x3200)), prod, f_q) mstore(add(transcript, 0x33a0), prod) prod := mulmod(mload(add(transcript, 0x3220)), prod, f_q) mstore(add(transcript, 0x33c0), prod) prod := mulmod(mload(add(transcript, 0x3240)), prod, f_q) mstore(add(transcript, 0x33e0), prod) prod := mulmod(mload(add(transcript, 0x3260)), prod, f_q) mstore(add(transcript, 0x3400), prod) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3420), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3440), prod) prod := mulmod(mload(add(transcript, 0x31a0)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x3300)), prod, f_q) mstore(add(transcript, 0x34c0), prod) }mstore(add(transcript, 0x3500), 32)mstore(add(transcript, 0x3520), 32)mstore(add(transcript, 0x3540), 32)mstore(add(transcript, 0x3560), mload(add(transcript, 0x34c0)))mstore(add(transcript, 0x3580), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x35a0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3500), 0xc0, add(transcript, 0x34e0), 0x20), 1), success){ let inv := mload(add(transcript, 0x34e0)) let v v := mload(add(transcript, 0x3300)) mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31a0)) mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3440)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3400)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3260)) mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x33e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3240)) mstore(add(transcript, 0x3240), mulmod(mload(add(transcript, 0x33c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3220)) mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x33a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3200)) mstore(add(transcript, 0x3200), mulmod(mload(add(transcript, 0x3380)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3180)) mstore(add(transcript, 0x3180), mulmod(mload(add(transcript, 0x3360)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31e0)) mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x3340)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x3320)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x3120)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3120), inv) }{ let result := mload(add(transcript, 0x3120))result := addmod(mload(add(transcript, 0x3140)), result, f_q)result := addmod(mload(add(transcript, 0x3160)), result, f_q)mstore(add(transcript, 0x35c0), result) }mstore(add(transcript, 0x35e0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3180)), f_q)){ let result := mload(add(transcript, 0x31e0))mstore(add(transcript, 0x3600), result) }mstore(add(transcript, 0x3620), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3260)), f_q)){ let result := mload(add(transcript, 0x3200))result := addmod(mload(add(transcript, 0x3220)), result, f_q)result := addmod(mload(add(transcript, 0x3240)), result, f_q)mstore(add(transcript, 0x3640), result) }mstore(add(transcript, 0x3660), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x31a0)), f_q)){ let result := mload(add(transcript, 0x3280))result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3680), result) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3300)), f_q)){ let result := mload(add(transcript, 0x32c0))result := addmod(mload(add(transcript, 0x32e0)), result, f_q)mstore(add(transcript, 0x36c0), result) }{ let prod := mload(add(transcript, 0x35c0)) prod := mulmod(mload(add(transcript, 0x3600)), prod, f_q) mstore(add(transcript, 0x36e0), prod) prod := mulmod(mload(add(transcript, 0x3640)), prod, f_q) mstore(add(transcript, 0x3700), prod) prod := mulmod(mload(add(transcript, 0x3680)), prod, f_q) mstore(add(transcript, 0x3720), prod) prod := mulmod(mload(add(transcript, 0x36c0)), prod, f_q) mstore(add(transcript, 0x3740), prod) }mstore(add(transcript, 0x3780), 32)mstore(add(transcript, 0x37a0), 32)mstore(add(transcript, 0x37c0), 32)mstore(add(transcript, 0x37e0), mload(add(transcript, 0x3740)))mstore(add(transcript, 0x3800), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3820), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3780), 0xc0, add(transcript, 0x3760), 0x20), 1), success){ let inv := mload(add(transcript, 0x3760)) let v v := mload(add(transcript, 0x36c0)) mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3720)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3680)) mstore(add(transcript, 0x3680), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3640)) mstore(add(transcript, 0x3640), mulmod(mload(add(transcript, 0x36e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3600)) mstore(add(transcript, 0x3600), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x35c0), inv) }mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x35e0)), mload(add(transcript, 0x3600)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3620)), mload(add(transcript, 0x3640)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3660)), mload(add(transcript, 0x3680)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x36a0)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0x3900)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3980)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x39c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0xaa0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xaa0)), f_q)){ let result := mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3bc0), result) }mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c00), mulmod(sub(f_q, mload(add(transcript, 0x3be0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3c80), mulmod(1, mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), 1, f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3c80)), 1, f_q))mstore(add(transcript, 0x3d00), mulmod(1, mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3d20), result) }mstore(add(transcript, 0x3d40), mulmod(mload(add(transcript, 0x3d20)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3d60), mulmod(sub(f_q, mload(add(transcript, 0x3d40))), 1, f_q))mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d00)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3da0), result) }mstore(add(transcript, 0x3dc0), mulmod(mload(add(transcript, 0x3da0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3de0), mulmod(sub(f_q, mload(add(transcript, 0x3dc0))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e20), addmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3de0)), f_q)){ let result := mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3e40), result) }mstore(add(transcript, 0x3e60), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3e80), mulmod(sub(f_q, mload(add(transcript, 0x3e60))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ec0), addmod(mload(add(transcript, 0x3e20)), mload(add(transcript, 0x3e80)), f_q)){ let result := mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2f60)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4960), result) }mstore(add(transcript, 0x4980), mulmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x49a0), mulmod(sub(f_q, mload(add(transcript, 0x4980))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a60), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x49a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4a80), result) }mstore(add(transcript, 0x4aa0), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4ac0), mulmod(sub(f_q, mload(add(transcript, 0x4aa0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4ae0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4b00), addmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x4ac0)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e60), addmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0x4b20)), f_q))mstore(add(transcript, 0x4e80), mulmod(1, mload(add(transcript, 0x3620)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3200)), f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3220)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3240)), f_q), result, f_q)mstore(add(transcript, 0x4ea0), result) }mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x4ea0)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4ee0), mulmod(sub(f_q, mload(add(transcript, 0x4ec0))), 1, f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4e80)), 1, f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4ee0)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4f00)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f60), addmod(mload(add(transcript, 0x4e60)), mload(add(transcript, 0x4f20)), f_q))mstore(add(transcript, 0x4f80), mulmod(1, mload(add(transcript, 0x3660)), f_q)){ let result := mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x4fa0), result) }mstore(add(transcript, 0x4fc0), mulmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4fe0), mulmod(sub(f_q, mload(add(transcript, 0x4fc0))), 1, f_q))mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4f80)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x5020), result) }mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x5060), mulmod(sub(f_q, mload(add(transcript, 0x5040))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x4f80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x50e0), mulmod(mload(add(transcript, 0x5000)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x5080)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5120), addmod(mload(add(transcript, 0x4f60)), mload(add(transcript, 0x50c0)), f_q))mstore(add(transcript, 0x5140), mulmod(1, mload(add(transcript, 0x36a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x32c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x32e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), 1, f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x5140)), 1, f_q))mstore(add(transcript, 0x51e0), mulmod(mload(add(transcript, 0x51a0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5220), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51e0)), f_q))mstore(add(transcript, 0x5240), mulmod(1, mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x5260), mulmod(1, mload(add(transcript, 0xb40)), f_q))mstore(add(transcript, 0x5280), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x52a0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x52c0), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x52a0)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x60))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0xc0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x100)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x5540), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) mstore(add(transcript, 0x5620), 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) mstore(add(transcript, 0x5700), 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) mstore(add(transcript, 0x57e0), 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) mstore(add(transcript, 0x58c0), 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) mstore(add(transcript, 0x59a0), 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) mstore(add(transcript, 0x5a80), 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) mstore(add(transcript, 0x5b60), 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) mstore(add(transcript, 0x5c40), 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) mstore(add(transcript, 0x5d20), 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) mstore(add(transcript, 0x5e00), 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) mstore(add(transcript, 0x5ee0), 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) mstore(add(transcript, 0x5fc0), 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e) mstore(add(transcript, 0x60a0), 0x2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf4407)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) mstore(add(transcript, 0x6180), 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28)mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x6260), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) mstore(add(transcript, 0x6340), 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56)mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), 0x2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d) mstore(add(transcript, 0x6420), 0x13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69)mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x420))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x440)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x460))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x66e0), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0x500)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x520))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x540)))mstore(add(transcript, 0x68a0), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6860), 0x60, add(transcript, 0x6860), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x6860))) mstore(add(transcript, 0x6920), mload(add(transcript, 0x6880)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x68c0), 0x80, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6940), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6960), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6980), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6940), 0x60, add(transcript, 0x6940), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x68e0)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x6940))) mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6960)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x69a0), 0x80, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a20), mload(add(transcript, 0x2c0))) mstore(add(transcript, 0x6a40), mload(add(transcript, 0x2e0)))mstore(add(transcript, 0x6a60), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a20), 0x60, add(transcript, 0x6a20), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x69c0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x6a20))) mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a80), 0x80, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6b00), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b20), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6b40), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b00), 0x60, add(transcript, 0x6b00), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x6aa0)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x6b00))) mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6b20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6b60), 0x80, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6be0), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c00), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c20), mload(add(transcript, 0x5100)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6be0), 0x60, add(transcript, 0x6be0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x6b80)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x6be0))) mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6c00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6c40), 0x80, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x180))) mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x1a0)))mstore(add(transcript, 0x6d00), mload(add(transcript, 0x5200)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6cc0), 0x60, add(transcript, 0x6cc0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x6c60)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x6cc0))) mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ce0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d20), 0x80, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6da0), mload(add(transcript, 0xae0))) mstore(add(transcript, 0x6dc0), mload(add(transcript, 0xb00)))mstore(add(transcript, 0x6de0), sub(f_q, mload(add(transcript, 0x5240))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6da0), 0x60, add(transcript, 0x6da0), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x6d40)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x6da0))) mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6dc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e00), 0x80, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e80), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x6ea0), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x5260)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e80), 0x60, add(transcript, 0x6e80), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0x6e20)))mstore(add(transcript, 0x6f20), mload(add(transcript, 0x6e80))) mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6ea0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ee0), 0x80, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6f00)))mstore(add(transcript, 0x6fa0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x6fc0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x6fe0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7000), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7020), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x7040), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x7060), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x7080), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x70a0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x70c0), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6f60), 0x180, add(transcript, 0x6f60), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6f60)), 1), success)} return success; } } + bytes32[916] memory transcript; + assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x80), mod(mload(add(pubInputs, 0x80)), f_q))mstore(add(transcript, 0x0), 7290356956133308795219632317546298177560913853825373832110764139479796737523) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x120), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x140), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x160), keccak256(add(transcript, 0x0), 352)){ let hash := mload(add(transcript, 0x160)) mstore(add(transcript, 0x180), mod(hash, f_q)) mstore(add(transcript, 0x1a0), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x200), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x220), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x240), keccak256(add(transcript, 0x1a0), 160)){ let hash := mload(add(transcript, 0x240)) mstore(add(transcript, 0x260), mod(hash, f_q)) mstore(add(transcript, 0x280), hash) }mstore8(add(transcript, 0x2a0), 1)mstore(add(transcript, 0x2a0), keccak256(add(transcript, 0x280), 33)){ let hash := mload(add(transcript, 0x2a0)) mstore(add(transcript, 0x2c0), mod(hash, f_q)) mstore(add(transcript, 0x2e0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3c0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x400), keccak256(add(transcript, 0x2e0), 288)){ let hash := mload(add(transcript, 0x400)) mstore(add(transcript, 0x420), mod(hash, f_q)) mstore(add(transcript, 0x440), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x560), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x580), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x5a0), keccak256(add(transcript, 0x440), 352)){ let hash := mload(add(transcript, 0x5a0)) mstore(add(transcript, 0x5c0), mod(hash, f_q)) mstore(add(transcript, 0x5e0), hash) }mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa20), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa40), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa60), keccak256(add(transcript, 0x5e0), 1152)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) }mstore8(add(transcript, 0xac0), 1)mstore(add(transcript, 0xac0), keccak256(add(transcript, 0xaa0), 33)){ let hash := mload(add(transcript, 0xac0)) mstore(add(transcript, 0xae0), mod(hash, f_q)) mstore(add(transcript, 0xb00), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb20), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb40), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb60), keccak256(add(transcript, 0xb00), 96)){ let hash := mload(add(transcript, 0xb60)) mstore(add(transcript, 0xb80), mod(hash, f_q)) mstore(add(transcript, 0xba0), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xbc0), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xbe0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0xd60), addmod(mload(add(transcript, 0xd40)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd60)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd80)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5c0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd80)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5c0)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd80)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5c0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd80)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5c0)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd80)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5c0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd80)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd80)), 1, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf60), mulmod(mload(add(transcript, 0xd80)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf80), addmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q))mstore(add(transcript, 0xfa0), mulmod(mload(add(transcript, 0xd80)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xfc0), addmod(mload(add(transcript, 0x5c0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xfe0), mulmod(mload(add(transcript, 0xd80)), 11322573621548282883955256084347882816245615123967859588024989498742209856615, f_q))mstore(add(transcript, 0x1000), addmod(mload(add(transcript, 0x5c0)), 10565669250290992338291149660909392272302749276448174755673214687833598639002, f_q)){ let prod := mload(add(transcript, 0xdc0)) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0x1060), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1080), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x10a0), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x10c0), prod) prod := mulmod(mload(add(transcript, 0xf80)), prod, f_q) mstore(add(transcript, 0x10e0), prod) prod := mulmod(mload(add(transcript, 0xfc0)), prod, f_q) mstore(add(transcript, 0x1100), prod) prod := mulmod(mload(add(transcript, 0x1000)), prod, f_q) mstore(add(transcript, 0x1120), prod) prod := mulmod(mload(add(transcript, 0xd60)), prod, f_q) mstore(add(transcript, 0x1140), prod) }mstore(add(transcript, 0x1180), 32)mstore(add(transcript, 0x11a0), 32)mstore(add(transcript, 0x11c0), 32)mstore(add(transcript, 0x11e0), mload(add(transcript, 0x1140)))mstore(add(transcript, 0x1200), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1220), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1180), 0xc0, add(transcript, 0x1160), 0x20), 1), success){ let inv := mload(add(transcript, 0x1160)) let v v := mload(add(transcript, 0xd60)) mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0x1120)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x1000)) mstore(add(transcript, 0x1000), mulmod(mload(add(transcript, 0x1100)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xfc0)) mstore(add(transcript, 0xfc0), mulmod(mload(add(transcript, 0x10e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf80)) mstore(add(transcript, 0xf80), mulmod(mload(add(transcript, 0x10c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x10a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1080)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0x1060)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xdc0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xdc0), inv) }mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0xf60)), mload(add(transcript, 0xf80)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0xfa0)), mload(add(transcript, 0xfc0)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0xfe0)), mload(add(transcript, 0x1000)), f_q)){ let result := mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x60)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x80)), f_q), result, f_q)mstore(add(transcript, 0x1380), result) }mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13a0)), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1440), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1460)), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), mulmod(mload(add(transcript, 0x14a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x14e0), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x14e0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1540), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1400)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x14a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x15a0), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x15a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), addmod(mload(add(transcript, 0x1400)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1680), addmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x680)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x1440)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), addmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x640)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x660)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17a0)), mload(add(transcript, 0x17c0)), f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x1780)), sub(f_q, mload(add(transcript, 0x17e0))), f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x680)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x18a0), mulmod(mload(add(transcript, 0x1440)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x18c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x640)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1920), mulmod(mload(add(transcript, 0x660)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1940), addmod(mload(add(transcript, 0x1900)), mload(add(transcript, 0x1920)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x18e0)), sub(f_q, mload(add(transcript, 0x1940))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x19c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), addmod(1, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a00), mulmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1a20), addmod(2, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a40), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a60), addmod(4, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1ac0), addmod(mload(add(transcript, 0x1aa0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), addmod(mload(add(transcript, 0x6a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b60), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b80), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1be0), addmod(mload(add(transcript, 0x1ba0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1c40)), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d00), addmod(mload(add(transcript, 0x1cc0)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x1d20)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), addmod(3, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1de0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1e80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1ea0)), f_q))mstore(add(transcript, 0x1ee0), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1f00)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1fc0), mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x1fe0), addmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x2000)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2040)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x620)), f_q))mstore(add(transcript, 0x20e0), addmod(mload(add(transcript, 0x20c0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x2100), mulmod(mload(add(transcript, 0x20e0)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2140), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2120)), f_q))mstore(add(transcript, 0x2160), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x620)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x21c0)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x2200), addmod(mload(add(transcript, 0x2140)), mload(add(transcript, 0x21e0)), f_q))mstore(add(transcript, 0x2220), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2200)), f_q))mstore(add(transcript, 0x2240), addmod(mload(add(transcript, 0x2220)), mload(add(transcript, 0x21e0)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x2280), addmod(1, sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x22a0), mulmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x22c0), addmod(mload(add(transcript, 0x2260)), mload(add(transcript, 0x22a0)), f_q))mstore(add(transcript, 0x22e0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2300), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x2300)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x22e0)), mload(add(transcript, 0x2340)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x23a0), addmod(mload(add(transcript, 0x980)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x23c0), mulmod(mload(add(transcript, 0x23a0)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x2380)), mload(add(transcript, 0x23c0)), f_q))mstore(add(transcript, 0x2400), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x2420), addmod(1, sub(f_q, mload(add(transcript, 0x1240))), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x2460), addmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x2480), addmod(mload(add(transcript, 0x2460)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x2480)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x24c0), addmod(mload(add(transcript, 0x2420)), sub(f_q, mload(add(transcript, 0x24a0))), f_q))mstore(add(transcript, 0x24e0), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x24e0)), f_q))mstore(add(transcript, 0x2520), addmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x25a0), mulmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x2640), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2660), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), addmod(mload(add(transcript, 0x2660)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x26a0), mulmod(mload(add(transcript, 0x2680)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x26c0), mulmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x26e0), mulmod(1, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2760), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2780), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2760)), f_q))mstore(add(transcript, 0x27a0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x27a0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x27e0), mulmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2740)), f_q))mstore(add(transcript, 0x2800), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x28a0), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x28c0), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x28a0)), f_q))mstore(add(transcript, 0x28e0), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x28c0)), f_q))mstore(add(transcript, 0x2900), addmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2920), mulmod(mload(add(transcript, 0x2900)), mload(add(transcript, 0x2880)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x2920)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x2960), addmod(mload(add(transcript, 0x26c0)), sub(f_q, mload(add(transcript, 0x2940))), f_q))mstore(add(transcript, 0x2980), mulmod(mload(add(transcript, 0x2960)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x29a0), addmod(mload(add(transcript, 0x2400)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x29e0), mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x29e0)), f_q))mstore(add(transcript, 0x2a20), addmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x2a40)), f_q))mstore(add(transcript, 0x2a80), addmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2aa0), mulmod(mload(add(transcript, 0x2a80)), mload(add(transcript, 0x2a20)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2ae0), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2ae0)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2b60), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2b80), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2b60)), f_q))mstore(add(transcript, 0x2ba0), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x2b80)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2ba0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x2bc0)), mload(add(transcript, 0x2b40)), f_q))mstore(add(transcript, 0x2c00), mulmod(mload(add(transcript, 0x2be0)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2c20), addmod(mload(add(transcript, 0x2ac0)), sub(f_q, mload(add(transcript, 0x2c00))), f_q))mstore(add(transcript, 0x2c40), mulmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2c60), addmod(mload(add(transcript, 0x29c0)), mload(add(transcript, 0x2c40)), f_q))mstore(add(transcript, 0x2c80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), addmod(1, sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x2c80)), mload(add(transcript, 0x2cc0)), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2ce0)), f_q))mstore(add(transcript, 0x2d20), mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2d40), addmod(mload(add(transcript, 0x2d20)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x2d80), addmod(mload(add(transcript, 0x2d00)), mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2dc0), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2de0), mulmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x9e0)), f_q))mstore(add(transcript, 0x2e00), addmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2e20), mulmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x2de0)), f_q))mstore(add(transcript, 0x2e40), mulmod(256, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x2e60), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x2e40))), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x2e60)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0x2e80)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x2ea0)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x2ee0)), mload(add(transcript, 0x2ec0)), f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0x2e20)), sub(f_q, mload(add(transcript, 0x2f00))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0x2da0)), mload(add(transcript, 0x2f40)), f_q))mstore(add(transcript, 0x2f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x2fa0), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa40))), f_q))mstore(add(transcript, 0x2fc0), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2fe0), addmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x2fc0)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2fe0)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x3040), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa20))), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x3040)), mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x3080), addmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x3060)), f_q))mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0xd40)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30c0), mulmod(mload(add(transcript, 0x30a0)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x30c0)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3100), mulmod(mload(add(transcript, 0x30e0)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3120), mulmod(1, mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3140), mulmod(1, mload(add(transcript, 0x30a0)), f_q))mstore(add(transcript, 0x3160), mulmod(1, mload(add(transcript, 0x30c0)), f_q))mstore(add(transcript, 0x3180), mulmod(1, mload(add(transcript, 0x30e0)), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3080)), mload(add(transcript, 0xd60)), f_q))mstore(add(transcript, 0x31c0), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x5c0)), 1, f_q))mstore(add(transcript, 0x3200), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x31e0))), f_q))mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x3240), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3220))), f_q))mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x5c0)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x3280), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3260))), f_q))mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x32c0), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x32a0))), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x32e0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3300), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x3320), result) }mstore(add(transcript, 0x3340), mulmod(1, mload(add(transcript, 0x3200)), f_q))mstore(add(transcript, 0x3360), mulmod(mload(add(transcript, 0x3340)), mload(add(transcript, 0x3240)), f_q))mstore(add(transcript, 0x3380), mulmod(mload(add(transcript, 0x3360)), mload(add(transcript, 0x32c0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x33a0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x33c0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x33e0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3400), result) }mstore(add(transcript, 0x3420), mulmod(mload(add(transcript, 0x3360)), mload(add(transcript, 0x3280)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x3440), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x3460), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x3480), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x34a0), result) }mstore(add(transcript, 0x34c0), mulmod(mload(add(transcript, 0x3340)), mload(add(transcript, 0x32c0)), f_q)){ let prod := mload(add(transcript, 0x32e0)) prod := mulmod(mload(add(transcript, 0x3300)), prod, f_q) mstore(add(transcript, 0x34e0), prod) prod := mulmod(mload(add(transcript, 0x3320)), prod, f_q) mstore(add(transcript, 0x3500), prod) prod := mulmod(mload(add(transcript, 0x33a0)), prod, f_q) mstore(add(transcript, 0x3520), prod) prod := mulmod(mload(add(transcript, 0x3340)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x33c0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x33e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x3400)), prod, f_q) mstore(add(transcript, 0x35a0), prod) prod := mulmod(mload(add(transcript, 0x3420)), prod, f_q) mstore(add(transcript, 0x35c0), prod) prod := mulmod(mload(add(transcript, 0x3440)), prod, f_q) mstore(add(transcript, 0x35e0), prod) prod := mulmod(mload(add(transcript, 0x3460)), prod, f_q) mstore(add(transcript, 0x3600), prod) prod := mulmod(mload(add(transcript, 0x3360)), prod, f_q) mstore(add(transcript, 0x3620), prod) prod := mulmod(mload(add(transcript, 0x3480)), prod, f_q) mstore(add(transcript, 0x3640), prod) prod := mulmod(mload(add(transcript, 0x34a0)), prod, f_q) mstore(add(transcript, 0x3660), prod) prod := mulmod(mload(add(transcript, 0x34c0)), prod, f_q) mstore(add(transcript, 0x3680), prod) }mstore(add(transcript, 0x36c0), 32)mstore(add(transcript, 0x36e0), 32)mstore(add(transcript, 0x3700), 32)mstore(add(transcript, 0x3720), mload(add(transcript, 0x3680)))mstore(add(transcript, 0x3740), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3760), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x36c0), 0xc0, add(transcript, 0x36a0), 0x20), 1), success){ let inv := mload(add(transcript, 0x36a0)) let v v := mload(add(transcript, 0x34c0)) mstore(add(transcript, 0x34c0), mulmod(mload(add(transcript, 0x3660)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34a0)) mstore(add(transcript, 0x34a0), mulmod(mload(add(transcript, 0x3640)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3480)) mstore(add(transcript, 0x3480), mulmod(mload(add(transcript, 0x3620)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3360)) mstore(add(transcript, 0x3360), mulmod(mload(add(transcript, 0x3600)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3460)) mstore(add(transcript, 0x3460), mulmod(mload(add(transcript, 0x35e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3440)) mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3420)) mstore(add(transcript, 0x3420), mulmod(mload(add(transcript, 0x35a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3400)) mstore(add(transcript, 0x3400), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33e0)) mstore(add(transcript, 0x33e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33c0)) mstore(add(transcript, 0x33c0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3340)) mstore(add(transcript, 0x3340), mulmod(mload(add(transcript, 0x3520)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33a0)) mstore(add(transcript, 0x33a0), mulmod(mload(add(transcript, 0x3500)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3320)) mstore(add(transcript, 0x3320), mulmod(mload(add(transcript, 0x34e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3300)) mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x32e0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x32e0), inv) }{ let result := mload(add(transcript, 0x32e0))result := addmod(mload(add(transcript, 0x3300)), result, f_q)result := addmod(mload(add(transcript, 0x3320)), result, f_q)mstore(add(transcript, 0x3780), result) }mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3380)), mload(add(transcript, 0x3340)), f_q)){ let result := mload(add(transcript, 0x33a0))mstore(add(transcript, 0x37c0), result) }mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x3380)), mload(add(transcript, 0x3420)), f_q)){ let result := mload(add(transcript, 0x33c0))result := addmod(mload(add(transcript, 0x33e0)), result, f_q)result := addmod(mload(add(transcript, 0x3400)), result, f_q)mstore(add(transcript, 0x3800), result) }mstore(add(transcript, 0x3820), mulmod(mload(add(transcript, 0x3380)), mload(add(transcript, 0x3360)), f_q)){ let result := mload(add(transcript, 0x3440))result := addmod(mload(add(transcript, 0x3460)), result, f_q)mstore(add(transcript, 0x3840), result) }mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3380)), mload(add(transcript, 0x34c0)), f_q)){ let result := mload(add(transcript, 0x3480))result := addmod(mload(add(transcript, 0x34a0)), result, f_q)mstore(add(transcript, 0x3880), result) }{ let prod := mload(add(transcript, 0x3780)) prod := mulmod(mload(add(transcript, 0x37c0)), prod, f_q) mstore(add(transcript, 0x38a0), prod) prod := mulmod(mload(add(transcript, 0x3800)), prod, f_q) mstore(add(transcript, 0x38c0), prod) prod := mulmod(mload(add(transcript, 0x3840)), prod, f_q) mstore(add(transcript, 0x38e0), prod) prod := mulmod(mload(add(transcript, 0x3880)), prod, f_q) mstore(add(transcript, 0x3900), prod) }mstore(add(transcript, 0x3940), 32)mstore(add(transcript, 0x3960), 32)mstore(add(transcript, 0x3980), 32)mstore(add(transcript, 0x39a0), mload(add(transcript, 0x3900)))mstore(add(transcript, 0x39c0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x39e0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3940), 0xc0, add(transcript, 0x3920), 0x20), 1), success){ let inv := mload(add(transcript, 0x3920)) let v v := mload(add(transcript, 0x3880)) mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x38e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3840)) mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x38c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3800)) mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x38a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x37c0)) mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x3780)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3780), inv) }mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3820)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3860)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0x3b20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3bc0), mulmod(mload(add(transcript, 0x3ba0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c20), mulmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c60), mulmod(mload(add(transcript, 0x3c40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0x3c60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ca0), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d00), mulmod(mload(add(transcript, 0xae0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3d40), mulmod(mload(add(transcript, 0x3d20)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3d60), mulmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0xae0)), f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x32e0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x3300)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x3320)), f_q), result, f_q)mstore(add(transcript, 0x3d80), result) }mstore(add(transcript, 0x3da0), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x3dc0), mulmod(sub(f_q, mload(add(transcript, 0x3da0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x32e0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3300)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x3320)), f_q), result, f_q)mstore(add(transcript, 0x3de0), result) }mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3de0)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x3e20), mulmod(sub(f_q, mload(add(transcript, 0x3e00))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3e40), mulmod(1, mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3e60), addmod(mload(add(transcript, 0x3dc0)), mload(add(transcript, 0x3e20)), f_q))mstore(add(transcript, 0x3e80), mulmod(mload(add(transcript, 0x3e60)), 1, f_q))mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3e40)), 1, f_q))mstore(add(transcript, 0x3ec0), mulmod(1, mload(add(transcript, 0x37a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), 1, f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3ec0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x3f60), result) }mstore(add(transcript, 0x3f80), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x3fa0), mulmod(sub(f_q, mload(add(transcript, 0x3f80))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3fc0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3fe0), addmod(mload(add(transcript, 0x3f20)), mload(add(transcript, 0x3fa0)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4000), result) }mstore(add(transcript, 0x4020), mulmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4040), mulmod(sub(f_q, mload(add(transcript, 0x4020))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4060), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4080), addmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0x4040)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x40a0), result) }mstore(add(transcript, 0x40c0), mulmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x40e0), mulmod(sub(f_q, mload(add(transcript, 0x40c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4100), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4120), addmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0x40e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4140), result) }mstore(add(transcript, 0x4160), mulmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4180), mulmod(sub(f_q, mload(add(transcript, 0x4160))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x41a0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x41c0), addmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0x4180)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x41e0), result) }mstore(add(transcript, 0x4200), mulmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4220), mulmod(sub(f_q, mload(add(transcript, 0x4200))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4240), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4260), addmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0x4220)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4280), result) }mstore(add(transcript, 0x42a0), mulmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x42c0), mulmod(sub(f_q, mload(add(transcript, 0x42a0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x42e0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4300), addmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0x42c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4320), result) }mstore(add(transcript, 0x4340), mulmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4360), mulmod(sub(f_q, mload(add(transcript, 0x4340))), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x4380), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x43a0), addmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0x4360)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x43c0), result) }mstore(add(transcript, 0x43e0), mulmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4400), mulmod(sub(f_q, mload(add(transcript, 0x43e0))), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4420), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4440), addmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0x4400)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4460), result) }mstore(add(transcript, 0x4480), mulmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x44a0), mulmod(sub(f_q, mload(add(transcript, 0x4480))), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x44c0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x44e0), addmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0x44a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4500), result) }mstore(add(transcript, 0x4520), mulmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4540), mulmod(sub(f_q, mload(add(transcript, 0x4520))), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4560), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4580), addmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0x4540)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x45a0), result) }mstore(add(transcript, 0x45c0), mulmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x45e0), mulmod(sub(f_q, mload(add(transcript, 0x45c0))), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4600), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4620), addmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0x45e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4640), result) }mstore(add(transcript, 0x4660), mulmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4680), mulmod(sub(f_q, mload(add(transcript, 0x4660))), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x46a0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x46c0), addmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0x4680)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x46e0), result) }mstore(add(transcript, 0x4700), mulmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4720), mulmod(sub(f_q, mload(add(transcript, 0x4700))), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4740), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4760), addmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0x4720)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4780), result) }mstore(add(transcript, 0x47a0), mulmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x47c0), mulmod(sub(f_q, mload(add(transcript, 0x47a0))), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x47e0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x4800), addmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0x47c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4820), result) }mstore(add(transcript, 0x4840), mulmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4860), mulmod(sub(f_q, mload(add(transcript, 0x4840))), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4880), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x48a0), addmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0x4860)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x48c0), result) }mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4900), mulmod(sub(f_q, mload(add(transcript, 0x48e0))), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4940), addmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0x4900)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4960), result) }mstore(add(transcript, 0x4980), mulmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x49a0), mulmod(sub(f_q, mload(add(transcript, 0x4980))), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x49e0), addmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x49a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4a00), result) }mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4a40), mulmod(sub(f_q, mload(add(transcript, 0x4a20))), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x4a60), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x4a80), addmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0x4a40)), f_q))mstore(add(transcript, 0x4aa0), mulmod(mload(add(transcript, 0x3120)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x3140)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4ae0), mulmod(mload(add(transcript, 0x3160)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x37a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4b20), result) }mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4b20)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4b60), mulmod(sub(f_q, mload(add(transcript, 0x4b40))), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x4aa0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x4ac0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x4c20), addmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x4b60)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x33a0)), f_q)mstore(add(transcript, 0x4c40), result) }mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4c40)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4c80), mulmod(sub(f_q, mload(add(transcript, 0x4c60))), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x4cc0), addmod(mload(add(transcript, 0x4c20)), mload(add(transcript, 0x4c80)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4cc0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x3fc0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4060)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4100)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x41a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4240)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x42e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4380)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4420)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x44c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4560)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e60), mulmod(mload(add(transcript, 0x4600)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e80), mulmod(mload(add(transcript, 0x46a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ea0), mulmod(mload(add(transcript, 0x4740)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x47e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ee0), mulmod(mload(add(transcript, 0x4880)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f60), mulmod(mload(add(transcript, 0x4b80)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f80), mulmod(mload(add(transcript, 0x4ba0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4fa0), mulmod(mload(add(transcript, 0x4bc0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4fc0), mulmod(mload(add(transcript, 0x4be0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4fe0), mulmod(mload(add(transcript, 0x4c00)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4ca0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x5020), addmod(mload(add(transcript, 0x3e80)), mload(add(transcript, 0x4ce0)), f_q))mstore(add(transcript, 0x5040), mulmod(1, mload(add(transcript, 0x37e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x33c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x33e0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3400)), f_q), result, f_q)mstore(add(transcript, 0x5060), result) }mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x5060)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x50a0), mulmod(sub(f_q, mload(add(transcript, 0x5080))), 1, f_q))mstore(add(transcript, 0x50c0), mulmod(mload(add(transcript, 0x5040)), 1, f_q))mstore(add(transcript, 0x50e0), mulmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x3d00)), f_q))mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x50c0)), mload(add(transcript, 0x3d00)), f_q))mstore(add(transcript, 0x5120), addmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x50e0)), f_q))mstore(add(transcript, 0x5140), mulmod(1, mload(add(transcript, 0x3820)), f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3440)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x3460)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), 1, f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x5140)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x3440)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x3460)), f_q), result, f_q)mstore(add(transcript, 0x51e0), result) }mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51e0)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x5220), mulmod(sub(f_q, mload(add(transcript, 0x5200))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x5240), mulmod(mload(add(transcript, 0x5140)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x5260), addmod(mload(add(transcript, 0x51a0)), mload(add(transcript, 0x5220)), f_q))mstore(add(transcript, 0x5280), mulmod(mload(add(transcript, 0x5260)), mload(add(transcript, 0x3d20)), f_q))mstore(add(transcript, 0x52a0), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3d20)), f_q))mstore(add(transcript, 0x52c0), mulmod(mload(add(transcript, 0x5240)), mload(add(transcript, 0x3d20)), f_q))mstore(add(transcript, 0x52e0), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x5280)), f_q))mstore(add(transcript, 0x5300), mulmod(1, mload(add(transcript, 0x3860)), f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x3480)), f_q)result := addmod(mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0x34a0)), f_q), result, f_q)mstore(add(transcript, 0x5320), result) }mstore(add(transcript, 0x5340), mulmod(mload(add(transcript, 0x5320)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x5360), mulmod(sub(f_q, mload(add(transcript, 0x5340))), 1, f_q))mstore(add(transcript, 0x5380), mulmod(mload(add(transcript, 0x5300)), 1, f_q))mstore(add(transcript, 0x53a0), mulmod(mload(add(transcript, 0x5360)), mload(add(transcript, 0x3d40)), f_q))mstore(add(transcript, 0x53c0), mulmod(mload(add(transcript, 0x5380)), mload(add(transcript, 0x3d40)), f_q))mstore(add(transcript, 0x53e0), addmod(mload(add(transcript, 0x52e0)), mload(add(transcript, 0x53a0)), f_q))mstore(add(transcript, 0x5400), mulmod(1, mload(add(transcript, 0x3380)), f_q))mstore(add(transcript, 0x5420), mulmod(1, mload(add(transcript, 0xb80)), f_q))mstore(add(transcript, 0x5440), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x5460), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x5480), mload(add(transcript, 0x53e0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x5460)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5500), mload(add(transcript, 0xc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x5540), mload(add(transcript, 0x100)))mstore(add(transcript, 0x5560), mload(add(transcript, 0x3ea0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), mload(add(transcript, 0x120))) mstore(add(transcript, 0x5620), mload(add(transcript, 0x140)))mstore(add(transcript, 0x5640), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), mload(add(transcript, 0x200))) mstore(add(transcript, 0x5700), mload(add(transcript, 0x220)))mstore(add(transcript, 0x5720), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x299b12e65399dcea3f1e0ce046cf5f93ce7ba9f779bfa39e7f0c6d4c19628a90) mstore(add(transcript, 0x57e0), 0x21c577122a3d1f4d019b93e724d981b0653ed94f492eafec50945231935f9a95)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x19d9220141bef25921d474c6e634d06dfb7d7904e59a4ec486a148b00bfd38a3) mstore(add(transcript, 0x58c0), 0x2f38511e53688056b693c84ef69a7ae2b9ab482906dc46ae9d9522fd3ce098b6)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x17e7cb6a30c4ce9a3d8de604dbaf517b1f23e440acb9e7345938ff5b245a403e) mstore(add(transcript, 0x59a0), 0x1c31a42d7da360cce8262e21fb9a5ef26a23ebbcf6995ccab89aee400c2e994b)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x05591c7faa2c9eaf1c9573a84bddec303219abf496af0899ed438853227dd056) mstore(add(transcript, 0x5a80), 0x2cfa24fde576750b4036dffe40105e6b7244f63843ec74d9d0aad48ba413287c)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) mstore(add(transcript, 0x5b60), 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x19206bebc5cc4a5b692c58bc61e7aec6d3fbb8344e39a133699f74e6f40ec2a8) mstore(add(transcript, 0x5c40), 0x0678c7bdd141bd26cbe9336f5dcf1c5a8cf21a5927afd1b2f393152ee02a6a78)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x1c6e2343333783b4f48ae7d2681afb3cdf6a4dfbc83a500cb06db3265ad3e5d5) mstore(add(transcript, 0x5d20), 0x1a3d836d4325ff30144c1e2038a4d4025fd0f01af24cfd8dfd54018e64f3b098)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b) mstore(add(transcript, 0x5e00), 0x04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91) mstore(add(transcript, 0x5ee0), 0x2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x09e3303245e3b00aca894e9fba3d5184ff3739c664e363f205d42feee327b6aa) mstore(add(transcript, 0x5fc0), 0x13ce92283cc6f648bdda86182d91852aab5c6088ab008d9cdb5522fcbf5c6289)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4e60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x08a503e7a16684a81991dbfc5ec84c9f4b0f7a506ddf26b67d305ebfc0f81743) mstore(add(transcript, 0x60a0), 0x08a2d8e1760ffb16f70147f8b44e781ced65a1e677a786cdd8bc9f947b36131c)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4e80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), 0x25632bc8012c6cbc6ddda661a9729f544c54620700c3840c01ca5b57e61a1ffe) mstore(add(transcript, 0x6180), 0x2ba5764c663a4b2892343c303da0f5664e3f620dd6b851a711781704292fd11a)mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4ea0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), 0x07cfe4f3152b1996e8eafd718451356c2044e4c239fcc29eb3a81d392e1b44ad) mstore(add(transcript, 0x6260), 0x255673e224a594e53fd5b1b4dcd46329e72a04e16056dea3d5a17e31291a9960)mstore(add(transcript, 0x6280), mload(add(transcript, 0x4ec0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), 0x136cb14b351f3b43b5e618c5c49022588edd48550f4e7d69309442e8b83d0d22) mstore(add(transcript, 0x6340), 0x0ee9bbdfce93815e79aabfc5ec92a52346c46a45e17bc5bc9ad8155e982c9cac)mstore(add(transcript, 0x6360), mload(add(transcript, 0x4ee0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x6420), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x6440), mload(add(transcript, 0x4f00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), 0x1f5d69f8adc7def353cac5301331f66a6aa12c3bdc46ba8509d81c1922944c1e) mstore(add(transcript, 0x6500), 0x050a358c8ee74901afd6bebdda35a25be99ba631232abec0bb7df23428e219eb)mstore(add(transcript, 0x6520), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), 0x1ddbf91ceeed88a8c66e9bf8d089b3098dc083f15790870796a7267f25cf9bf0) mstore(add(transcript, 0x65e0), 0x0ab4e80b0091cd40070294f754e54b127e2000572c0344c2838aeeaf251eb391)mstore(add(transcript, 0x6600), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0x460))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0x480)))mstore(add(transcript, 0x66e0), mload(add(transcript, 0x4f60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4f80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x500)))mstore(add(transcript, 0x68a0), mload(add(transcript, 0x4fa0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6860), 0x60, add(transcript, 0x6860), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x6860))) mstore(add(transcript, 0x6920), mload(add(transcript, 0x6880)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x68c0), 0x80, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6940), mload(add(transcript, 0x520))) mstore(add(transcript, 0x6960), mload(add(transcript, 0x540)))mstore(add(transcript, 0x6980), mload(add(transcript, 0x4fc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6940), 0x60, add(transcript, 0x6940), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x68e0)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x6940))) mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6960)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x69a0), 0x80, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a20), mload(add(transcript, 0x560))) mstore(add(transcript, 0x6a40), mload(add(transcript, 0x580)))mstore(add(transcript, 0x6a60), mload(add(transcript, 0x4fe0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a20), 0x60, add(transcript, 0x6a20), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x69c0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x6a20))) mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a80), 0x80, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6b00), mload(add(transcript, 0x3c0))) mstore(add(transcript, 0x6b20), mload(add(transcript, 0x3e0)))mstore(add(transcript, 0x6b40), mload(add(transcript, 0x5000)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b00), 0x60, add(transcript, 0x6b00), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x6aa0)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x6b00))) mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6b20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6b60), 0x80, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6be0), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6c00), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6c20), mload(add(transcript, 0x5100)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6be0), 0x60, add(transcript, 0x6be0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x6b80)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x6be0))) mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6c00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6c40), 0x80, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6d00), mload(add(transcript, 0x52a0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6cc0), 0x60, add(transcript, 0x6cc0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x6c60)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x6cc0))) mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ce0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d20), 0x80, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6da0), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6dc0), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6de0), mload(add(transcript, 0x52c0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6da0), 0x60, add(transcript, 0x6da0), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x6d40)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x6da0))) mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6dc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e00), 0x80, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e80), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x6ea0), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x53c0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e80), 0x60, add(transcript, 0x6e80), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0x6e20)))mstore(add(transcript, 0x6f20), mload(add(transcript, 0x6e80))) mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6ea0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ee0), 0x80, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f60), mload(add(transcript, 0xb20))) mstore(add(transcript, 0x6f80), mload(add(transcript, 0xb40)))mstore(add(transcript, 0x6fa0), sub(f_q, mload(add(transcript, 0x5400))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6f60), 0x60, add(transcript, 0x6f60), 0x40), 1), success)mstore(add(transcript, 0x6fc0), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6fe0), mload(add(transcript, 0x6f00)))mstore(add(transcript, 0x7000), mload(add(transcript, 0x6f60))) mstore(add(transcript, 0x7020), mload(add(transcript, 0x6f80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6fc0), 0x80, add(transcript, 0x6fc0), 0x40), 1), success)mstore(add(transcript, 0x7040), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x7060), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x7080), mload(add(transcript, 0x5420)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x7040), 0x60, add(transcript, 0x7040), 0x40), 1), success)mstore(add(transcript, 0x70a0), mload(add(transcript, 0x6fc0))) mstore(add(transcript, 0x70c0), mload(add(transcript, 0x6fe0)))mstore(add(transcript, 0x70e0), mload(add(transcript, 0x7040))) mstore(add(transcript, 0x7100), mload(add(transcript, 0x7060)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x70a0), 0x80, add(transcript, 0x70a0), 0x40), 1), success)mstore(add(transcript, 0x7120), mload(add(transcript, 0x70a0))) mstore(add(transcript, 0x7140), mload(add(transcript, 0x70c0)))mstore(add(transcript, 0x7160), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x7180), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x71a0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x71c0), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x71e0), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x7200), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x7220), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x7240), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x7260), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x7280), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x7120), 0x180, add(transcript, 0x7120), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x7120)), 1), success)} return success; } } diff --git a/contracts/src/InclusionVerifier.yul b/contracts/src/InclusionVerifier.yul index 55fc481d..009e639b 100644 --- a/contracts/src/InclusionVerifier.yul +++ b/contracts/src/InclusionVerifier.yul @@ -33,15 +33,9 @@ } mstore(0x20, mod(calldataload(0x0), f_q)) mstore(0x40, mod(calldataload(0x20), f_q)) -mstore(0x0, 20780565364750352931855234182745264522567546354850733883253409196481354617515) - - { - let x := calldataload(0x40) - mstore(0x60, x) - let y := calldataload(0x60) - mstore(0x80, y) - success := and(validate_ec_point(x, y), success) - } +mstore(0x60, mod(calldataload(0x40), f_q)) +mstore(0x80, mod(calldataload(0x60), f_q)) +mstore(0x0, 7290356956133308795219632317546298177560913853825373832110764139479796737523) { let x := calldataload(0x80) @@ -58,20 +52,20 @@ mstore(0x0, 20780565364750352931855234182745264522567546354850733883253409196481 mstore(0x100, y) success := and(validate_ec_point(x, y), success) } -mstore(0x120, keccak256(0x0, 288)) -{ - let hash := mload(0x120) - mstore(0x140, mod(hash, f_q)) - mstore(0x160, hash) - } { let x := calldataload(0x100) - mstore(0x180, x) + mstore(0x120, x) let y := calldataload(0x120) - mstore(0x1a0, y) + mstore(0x140, y) success := and(validate_ec_point(x, y), success) } +mstore(0x160, keccak256(0x0, 352)) +{ + let hash := mload(0x160) + mstore(0x180, mod(hash, f_q)) + mstore(0x1a0, hash) + } { let x := calldataload(0x140) @@ -80,27 +74,27 @@ mstore(0x120, keccak256(0x0, 288)) mstore(0x1e0, y) success := and(validate_ec_point(x, y), success) } -mstore(0x200, keccak256(0x160, 160)) -{ - let hash := mload(0x200) - mstore(0x220, mod(hash, f_q)) - mstore(0x240, hash) - } -mstore8(608, 1) -mstore(0x260, keccak256(0x240, 33)) -{ - let hash := mload(0x260) - mstore(0x280, mod(hash, f_q)) - mstore(0x2a0, hash) - } { let x := calldataload(0x180) - mstore(0x2c0, x) + mstore(0x200, x) let y := calldataload(0x1a0) - mstore(0x2e0, y) + mstore(0x220, y) success := and(validate_ec_point(x, y), success) } +mstore(0x240, keccak256(0x1a0, 160)) +{ + let hash := mload(0x240) + mstore(0x260, mod(hash, f_q)) + mstore(0x280, hash) + } +mstore8(672, 1) +mstore(0x2a0, keccak256(0x280, 33)) +{ + let hash := mload(0x2a0) + mstore(0x2c0, mod(hash, f_q)) + mstore(0x2e0, hash) + } { let x := calldataload(0x1c0) @@ -125,20 +119,20 @@ mstore(0x260, keccak256(0x240, 33)) mstore(0x3a0, y) success := and(validate_ec_point(x, y), success) } -mstore(0x3c0, keccak256(0x2a0, 288)) -{ - let hash := mload(0x3c0) - mstore(0x3e0, mod(hash, f_q)) - mstore(0x400, hash) - } { let x := calldataload(0x280) - mstore(0x420, x) + mstore(0x3c0, x) let y := calldataload(0x2a0) - mstore(0x440, y) + mstore(0x3e0, y) success := and(validate_ec_point(x, y), success) } +mstore(0x400, keccak256(0x2e0, 288)) +{ + let hash := mload(0x400) + mstore(0x420, mod(hash, f_q)) + mstore(0x440, hash) + } { let x := calldataload(0x2c0) @@ -171,14 +165,20 @@ mstore(0x3c0, keccak256(0x2a0, 288)) mstore(0x540, y) success := and(validate_ec_point(x, y), success) } -mstore(0x560, keccak256(0x400, 352)) + + { + let x := calldataload(0x3c0) + mstore(0x560, x) + let y := calldataload(0x3e0) + mstore(0x580, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0x5a0, keccak256(0x440, 352)) { - let hash := mload(0x560) - mstore(0x580, mod(hash, f_q)) - mstore(0x5a0, hash) + let hash := mload(0x5a0) + mstore(0x5c0, mod(hash, f_q)) + mstore(0x5e0, hash) } -mstore(0x5c0, mod(calldataload(0x3c0), f_q)) -mstore(0x5e0, mod(calldataload(0x3e0), f_q)) mstore(0x600, mod(calldataload(0x400), f_q)) mstore(0x620, mod(calldataload(0x420), f_q)) mstore(0x640, mod(calldataload(0x440), f_q)) @@ -212,44 +212,44 @@ mstore(0x9a0, mod(calldataload(0x7a0), f_q)) mstore(0x9c0, mod(calldataload(0x7c0), f_q)) mstore(0x9e0, mod(calldataload(0x7e0), f_q)) mstore(0xa00, mod(calldataload(0x800), f_q)) -mstore(0xa20, keccak256(0x5a0, 1152)) +mstore(0xa20, mod(calldataload(0x820), f_q)) +mstore(0xa40, mod(calldataload(0x840), f_q)) +mstore(0xa60, keccak256(0x5e0, 1152)) { - let hash := mload(0xa20) - mstore(0xa40, mod(hash, f_q)) - mstore(0xa60, hash) + let hash := mload(0xa60) + mstore(0xa80, mod(hash, f_q)) + mstore(0xaa0, hash) } -mstore8(2688, 1) -mstore(0xa80, keccak256(0xa60, 33)) +mstore8(2752, 1) +mstore(0xac0, keccak256(0xaa0, 33)) { - let hash := mload(0xa80) - mstore(0xaa0, mod(hash, f_q)) - mstore(0xac0, hash) + let hash := mload(0xac0) + mstore(0xae0, mod(hash, f_q)) + mstore(0xb00, hash) } { - let x := calldataload(0x820) - mstore(0xae0, x) - let y := calldataload(0x840) - mstore(0xb00, y) + let x := calldataload(0x860) + mstore(0xb20, x) + let y := calldataload(0x880) + mstore(0xb40, y) success := and(validate_ec_point(x, y), success) } -mstore(0xb20, keccak256(0xac0, 96)) +mstore(0xb60, keccak256(0xb00, 96)) { - let hash := mload(0xb20) - mstore(0xb40, mod(hash, f_q)) - mstore(0xb60, hash) + let hash := mload(0xb60) + mstore(0xb80, mod(hash, f_q)) + mstore(0xba0, hash) } { - let x := calldataload(0x860) - mstore(0xb80, x) - let y := calldataload(0x880) - mstore(0xba0, y) + let x := calldataload(0x8a0) + mstore(0xbc0, x) + let y := calldataload(0x8c0) + mstore(0xbe0, y) success := and(validate_ec_point(x, y), success) } -mstore(0xbc0, mulmod(mload(0x580), mload(0x580), f_q)) -mstore(0xbe0, mulmod(mload(0xbc0), mload(0xbc0), f_q)) -mstore(0xc00, mulmod(mload(0xbe0), mload(0xbe0), f_q)) +mstore(0xc00, mulmod(mload(0x5c0), mload(0x5c0), f_q)) mstore(0xc20, mulmod(mload(0xc00), mload(0xc00), f_q)) mstore(0xc40, mulmod(mload(0xc20), mload(0xc20), f_q)) mstore(0xc60, mulmod(mload(0xc40), mload(0xc40), f_q)) @@ -258,1172 +258,1182 @@ mstore(0xca0, mulmod(mload(0xc80), mload(0xc80), f_q)) mstore(0xcc0, mulmod(mload(0xca0), mload(0xca0), f_q)) mstore(0xce0, mulmod(mload(0xcc0), mload(0xcc0), f_q)) mstore(0xd00, mulmod(mload(0xce0), mload(0xce0), f_q)) -mstore(0xd20, addmod(mload(0xd00), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) -mstore(0xd40, mulmod(mload(0xd20), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q)) -mstore(0xd60, mulmod(mload(0xd40), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) -mstore(0xd80, addmod(mload(0x580), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q)) -mstore(0xda0, mulmod(mload(0xd40), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q)) -mstore(0xdc0, addmod(mload(0x580), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q)) -mstore(0xde0, mulmod(mload(0xd40), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q)) -mstore(0xe00, addmod(mload(0x580), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q)) -mstore(0xe20, mulmod(mload(0xd40), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q)) -mstore(0xe40, addmod(mload(0x580), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q)) -mstore(0xe60, mulmod(mload(0xd40), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q)) -mstore(0xe80, addmod(mload(0x580), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q)) -mstore(0xea0, mulmod(mload(0xd40), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) -mstore(0xec0, addmod(mload(0x580), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q)) -mstore(0xee0, mulmod(mload(0xd40), 1, f_q)) -mstore(0xf00, addmod(mload(0x580), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) -mstore(0xf20, mulmod(mload(0xd40), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) -mstore(0xf40, addmod(mload(0x580), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)) +mstore(0xd20, mulmod(mload(0xd00), mload(0xd00), f_q)) +mstore(0xd40, mulmod(mload(0xd20), mload(0xd20), f_q)) +mstore(0xd60, addmod(mload(0xd40), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0xd80, mulmod(mload(0xd60), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q)) +mstore(0xda0, mulmod(mload(0xd80), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) +mstore(0xdc0, addmod(mload(0x5c0), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q)) +mstore(0xde0, mulmod(mload(0xd80), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q)) +mstore(0xe00, addmod(mload(0x5c0), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q)) +mstore(0xe20, mulmod(mload(0xd80), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q)) +mstore(0xe40, addmod(mload(0x5c0), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q)) +mstore(0xe60, mulmod(mload(0xd80), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q)) +mstore(0xe80, addmod(mload(0x5c0), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q)) +mstore(0xea0, mulmod(mload(0xd80), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q)) +mstore(0xec0, addmod(mload(0x5c0), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q)) +mstore(0xee0, mulmod(mload(0xd80), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) +mstore(0xf00, addmod(mload(0x5c0), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q)) +mstore(0xf20, mulmod(mload(0xd80), 1, f_q)) +mstore(0xf40, addmod(mload(0x5c0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0xf60, mulmod(mload(0xd80), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) +mstore(0xf80, addmod(mload(0x5c0), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)) +mstore(0xfa0, mulmod(mload(0xd80), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q)) +mstore(0xfc0, addmod(mload(0x5c0), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q)) +mstore(0xfe0, mulmod(mload(0xd80), 11322573621548282883955256084347882816245615123967859588024989498742209856615, f_q)) +mstore(0x1000, addmod(mload(0x5c0), 10565669250290992338291149660909392272302749276448174755673214687833598639002, f_q)) { - let prod := mload(0xd80) + let prod := mload(0xdc0) - prod := mulmod(mload(0xdc0), prod, f_q) - mstore(0xf60, prod) - prod := mulmod(mload(0xe00), prod, f_q) - mstore(0xf80, prod) + mstore(0x1020, prod) prod := mulmod(mload(0xe40), prod, f_q) - mstore(0xfa0, prod) + mstore(0x1040, prod) prod := mulmod(mload(0xe80), prod, f_q) - mstore(0xfc0, prod) + mstore(0x1060, prod) prod := mulmod(mload(0xec0), prod, f_q) - mstore(0xfe0, prod) + mstore(0x1080, prod) prod := mulmod(mload(0xf00), prod, f_q) - mstore(0x1000, prod) + mstore(0x10a0, prod) prod := mulmod(mload(0xf40), prod, f_q) - mstore(0x1020, prod) + mstore(0x10c0, prod) - prod := mulmod(mload(0xd20), prod, f_q) - mstore(0x1040, prod) + prod := mulmod(mload(0xf80), prod, f_q) + mstore(0x10e0, prod) + + prod := mulmod(mload(0xfc0), prod, f_q) + mstore(0x1100, prod) + + prod := mulmod(mload(0x1000), prod, f_q) + mstore(0x1120, prod) + + prod := mulmod(mload(0xd60), prod, f_q) + mstore(0x1140, prod) } -mstore(0x1080, 32) -mstore(0x10a0, 32) -mstore(0x10c0, 32) -mstore(0x10e0, mload(0x1040)) -mstore(0x1100, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x1120, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x1080, 0xc0, 0x1060, 0x20), 1), success) +mstore(0x1180, 32) +mstore(0x11a0, 32) +mstore(0x11c0, 32) +mstore(0x11e0, mload(0x1140)) +mstore(0x1200, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x1220, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x1180, 0xc0, 0x1160, 0x20), 1), success) { - let inv := mload(0x1060) + let inv := mload(0x1160) let v - v := mload(0xd20) - mstore(3360, mulmod(mload(0x1020), inv, f_q)) + v := mload(0xd60) + mstore(3424, mulmod(mload(0x1120), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1000) + mstore(4096, mulmod(mload(0x1100), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xfc0) + mstore(4032, mulmod(mload(0x10e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xf80) + mstore(3968, mulmod(mload(0x10c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xf40) - mstore(3904, mulmod(mload(0x1000), inv, f_q)) + mstore(3904, mulmod(mload(0x10a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xf00) - mstore(3840, mulmod(mload(0xfe0), inv, f_q)) + mstore(3840, mulmod(mload(0x1080), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xec0) - mstore(3776, mulmod(mload(0xfc0), inv, f_q)) + mstore(3776, mulmod(mload(0x1060), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xe80) - mstore(3712, mulmod(mload(0xfa0), inv, f_q)) + mstore(3712, mulmod(mload(0x1040), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xe40) - mstore(3648, mulmod(mload(0xf80), inv, f_q)) + mstore(3648, mulmod(mload(0x1020), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0xe00) - mstore(3584, mulmod(mload(0xf60), inv, f_q)) + mstore(3584, mulmod(mload(0xdc0), inv, f_q)) inv := mulmod(v, inv, f_q) - - v := mload(0xdc0) - mstore(3520, mulmod(mload(0xd80), inv, f_q)) - inv := mulmod(v, inv, f_q) - mstore(0xd80, inv) + mstore(0xdc0, inv) } -mstore(0x1140, mulmod(mload(0xd60), mload(0xd80), f_q)) -mstore(0x1160, mulmod(mload(0xda0), mload(0xdc0), f_q)) -mstore(0x1180, mulmod(mload(0xde0), mload(0xe00), f_q)) -mstore(0x11a0, mulmod(mload(0xe20), mload(0xe40), f_q)) -mstore(0x11c0, mulmod(mload(0xe60), mload(0xe80), f_q)) -mstore(0x11e0, mulmod(mload(0xea0), mload(0xec0), f_q)) -mstore(0x1200, mulmod(mload(0xee0), mload(0xf00), f_q)) -mstore(0x1220, mulmod(mload(0xf20), mload(0xf40), f_q)) +mstore(0x1240, mulmod(mload(0xda0), mload(0xdc0), f_q)) +mstore(0x1260, mulmod(mload(0xde0), mload(0xe00), f_q)) +mstore(0x1280, mulmod(mload(0xe20), mload(0xe40), f_q)) +mstore(0x12a0, mulmod(mload(0xe60), mload(0xe80), f_q)) +mstore(0x12c0, mulmod(mload(0xea0), mload(0xec0), f_q)) +mstore(0x12e0, mulmod(mload(0xee0), mload(0xf00), f_q)) +mstore(0x1300, mulmod(mload(0xf20), mload(0xf40), f_q)) +mstore(0x1320, mulmod(mload(0xf60), mload(0xf80), f_q)) +mstore(0x1340, mulmod(mload(0xfa0), mload(0xfc0), f_q)) +mstore(0x1360, mulmod(mload(0xfe0), mload(0x1000), f_q)) { - let result := mulmod(mload(0x1200), mload(0x20), f_q) -result := addmod(mulmod(mload(0x1220), mload(0x40), f_q), result, f_q) -mstore(4672, result) - } -mstore(0x1260, addmod(mload(0x5c0), mload(0x6e0), f_q)) -mstore(0x1280, mulmod(mload(0x1260), mload(0x1260), f_q)) -mstore(0x12a0, mulmod(mload(0x1280), mload(0x1280), f_q)) -mstore(0x12c0, mulmod(mload(0x1260), mload(0x12a0), f_q)) -mstore(0x12e0, mulmod(mload(0x12c0), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) -mstore(0x1300, addmod(mload(0x5e0), mload(0x700), f_q)) -mstore(0x1320, mulmod(mload(0x1300), mload(0x1300), f_q)) -mstore(0x1340, mulmod(mload(0x1320), mload(0x1320), f_q)) -mstore(0x1360, mulmod(mload(0x1300), mload(0x1340), f_q)) -mstore(0x1380, mulmod(mload(0x1360), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) -mstore(0x13a0, addmod(mload(0x12e0), mload(0x1380), f_q)) -mstore(0x13c0, addmod(mload(0x13a0), sub(f_q, mload(0x600)), f_q)) -mstore(0x13e0, mulmod(mload(0x13c0), mload(0x780), f_q)) -mstore(0x1400, mulmod(mload(0x3e0), mload(0x13e0), f_q)) -mstore(0x1420, mulmod(mload(0x12c0), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) -mstore(0x1440, mulmod(mload(0x1360), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) -mstore(0x1460, addmod(mload(0x1420), mload(0x1440), f_q)) -mstore(0x1480, addmod(mload(0x1460), sub(f_q, mload(0x620)), f_q)) -mstore(0x14a0, mulmod(mload(0x1480), mload(0x780), f_q)) -mstore(0x14c0, addmod(mload(0x1400), mload(0x14a0), f_q)) -mstore(0x14e0, mulmod(mload(0x3e0), mload(0x14c0), f_q)) -mstore(0x1500, addmod(mload(0x12c0), sub(f_q, mload(0x640)), f_q)) -mstore(0x1520, mulmod(mload(0x1500), mload(0x7a0), f_q)) -mstore(0x1540, addmod(mload(0x14e0), mload(0x1520), f_q)) -mstore(0x1560, mulmod(mload(0x3e0), mload(0x1540), f_q)) -mstore(0x1580, mulmod(mload(0x640), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) -mstore(0x15a0, mulmod(mload(0x1300), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) -mstore(0x15c0, addmod(mload(0x1580), mload(0x15a0), f_q)) -mstore(0x15e0, addmod(mload(0x15c0), mload(0x6a0), f_q)) -mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q)) -mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q)) -mstore(0x1640, mulmod(mload(0x15e0), mload(0x1620), f_q)) -mstore(0x1660, mulmod(mload(0x600), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q)) -mstore(0x1680, mulmod(mload(0x620), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q)) -mstore(0x16a0, addmod(mload(0x1660), mload(0x1680), f_q)) -mstore(0x16c0, addmod(mload(0x1640), sub(f_q, mload(0x16a0)), f_q)) -mstore(0x16e0, mulmod(mload(0x16c0), mload(0x7a0), f_q)) -mstore(0x1700, addmod(mload(0x1560), mload(0x16e0), f_q)) -mstore(0x1720, mulmod(mload(0x3e0), mload(0x1700), f_q)) -mstore(0x1740, mulmod(mload(0x640), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) -mstore(0x1760, mulmod(mload(0x1300), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) -mstore(0x1780, addmod(mload(0x1740), mload(0x1760), f_q)) -mstore(0x17a0, addmod(mload(0x1780), mload(0x6c0), f_q)) -mstore(0x17c0, mulmod(mload(0x600), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q)) -mstore(0x17e0, mulmod(mload(0x620), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q)) -mstore(0x1800, addmod(mload(0x17c0), mload(0x17e0), f_q)) -mstore(0x1820, addmod(mload(0x17a0), sub(f_q, mload(0x1800)), f_q)) -mstore(0x1840, mulmod(mload(0x1820), mload(0x7a0), f_q)) -mstore(0x1860, addmod(mload(0x1720), mload(0x1840), f_q)) -mstore(0x1880, mulmod(mload(0x3e0), mload(0x1860), f_q)) -mstore(0x18a0, addmod(1, sub(f_q, mload(0x760)), f_q)) -mstore(0x18c0, mulmod(mload(0x18a0), mload(0x760), f_q)) -mstore(0x18e0, addmod(2, sub(f_q, mload(0x760)), f_q)) -mstore(0x1900, mulmod(mload(0x18e0), mload(0x18c0), f_q)) -mstore(0x1920, addmod(4, sub(f_q, mload(0x760)), f_q)) -mstore(0x1940, mulmod(mload(0x1920), mload(0x1900), f_q)) -mstore(0x1960, addmod(mload(0x680), mload(0x5c0), f_q)) -mstore(0x1980, addmod(mload(0x1960), sub(f_q, mload(0x600)), f_q)) -mstore(0x19a0, mulmod(mload(0x1980), mload(0x1940), f_q)) -mstore(0x19c0, addmod(mload(0x1880), mload(0x19a0), f_q)) -mstore(0x19e0, mulmod(mload(0x3e0), mload(0x19c0), f_q)) -mstore(0x1a00, addmod(mload(0x660), sub(f_q, mload(0x620)), f_q)) -mstore(0x1a20, mulmod(mload(0x1a00), mload(0x1940), f_q)) -mstore(0x1a40, addmod(mload(0x19e0), mload(0x1a20), f_q)) -mstore(0x1a60, mulmod(mload(0x3e0), mload(0x1a40), f_q)) -mstore(0x1a80, mulmod(mload(0x13c0), mload(0x7c0), f_q)) -mstore(0x1aa0, addmod(mload(0x1a60), mload(0x1a80), f_q)) -mstore(0x1ac0, mulmod(mload(0x3e0), mload(0x1aa0), f_q)) -mstore(0x1ae0, mulmod(mload(0x1480), mload(0x7c0), f_q)) -mstore(0x1b00, addmod(mload(0x1ac0), mload(0x1ae0), f_q)) -mstore(0x1b20, mulmod(mload(0x3e0), mload(0x1b00), f_q)) -mstore(0x1b40, mulmod(mload(0x1500), mload(0x7e0), f_q)) -mstore(0x1b60, addmod(mload(0x1b20), mload(0x1b40), f_q)) -mstore(0x1b80, mulmod(mload(0x3e0), mload(0x1b60), f_q)) -mstore(0x1ba0, mulmod(mload(0x16c0), mload(0x7e0), f_q)) -mstore(0x1bc0, addmod(mload(0x1b80), mload(0x1ba0), f_q)) -mstore(0x1be0, mulmod(mload(0x3e0), mload(0x1bc0), f_q)) -mstore(0x1c00, mulmod(mload(0x1820), mload(0x7e0), f_q)) -mstore(0x1c20, addmod(mload(0x1be0), mload(0x1c00), f_q)) -mstore(0x1c40, mulmod(mload(0x3e0), mload(0x1c20), f_q)) -mstore(0x1c60, addmod(3, sub(f_q, mload(0x760)), f_q)) -mstore(0x1c80, mulmod(mload(0x1c60), mload(0x1900), f_q)) -mstore(0x1ca0, mulmod(mload(0x1980), mload(0x1c80), f_q)) -mstore(0x1cc0, addmod(mload(0x1c40), mload(0x1ca0), f_q)) -mstore(0x1ce0, mulmod(mload(0x3e0), mload(0x1cc0), f_q)) -mstore(0x1d00, mulmod(mload(0x1a00), mload(0x1c80), f_q)) -mstore(0x1d20, addmod(mload(0x1ce0), mload(0x1d00), f_q)) -mstore(0x1d40, mulmod(mload(0x3e0), mload(0x1d20), f_q)) -mstore(0x1d60, mulmod(mload(0x18e0), mload(0x760), f_q)) -mstore(0x1d80, mulmod(mload(0x1c60), mload(0x1d60), f_q)) -mstore(0x1da0, mulmod(mload(0x1920), mload(0x1d80), f_q)) -mstore(0x1dc0, mulmod(mload(0x640), mload(0x1da0), f_q)) -mstore(0x1de0, addmod(1, sub(f_q, mload(0x640)), f_q)) -mstore(0x1e00, mulmod(mload(0x1de0), mload(0x1dc0), f_q)) -mstore(0x1e20, addmod(mload(0x1d40), mload(0x1e00), f_q)) -mstore(0x1e40, mulmod(mload(0x3e0), mload(0x1e20), f_q)) -mstore(0x1e60, mulmod(2, mload(0x640), f_q)) -mstore(0x1e80, addmod(mload(0x5e0), sub(f_q, mload(0x5c0)), f_q)) -mstore(0x1ea0, mulmod(mload(0x1e80), mload(0x1e60), f_q)) -mstore(0x1ec0, addmod(mload(0x600), sub(f_q, mload(0x5c0)), f_q)) -mstore(0x1ee0, addmod(mload(0x1ea0), sub(f_q, mload(0x1ec0)), f_q)) -mstore(0x1f00, addmod(mload(0x5e0), sub(f_q, mload(0x620)), f_q)) -mstore(0x1f20, addmod(mload(0x1ee0), sub(f_q, mload(0x1f00)), f_q)) -mstore(0x1f40, mulmod(mload(0x1f20), mload(0x1da0), f_q)) -mstore(0x1f60, addmod(mload(0x1e40), mload(0x1f40), f_q)) -mstore(0x1f80, mulmod(mload(0x3e0), mload(0x1f60), f_q)) -mstore(0x1fa0, mulmod(mload(0x1c60), mload(0x18c0), f_q)) -mstore(0x1fc0, mulmod(mload(0x1920), mload(0x1fa0), f_q)) -mstore(0x1fe0, addmod(mload(0x5c0), mload(0x5e0), f_q)) + let result := mulmod(mload(0x1300), mload(0x20), f_q) +result := addmod(mulmod(mload(0x1320), mload(0x40), f_q), result, f_q) +result := addmod(mulmod(mload(0x1340), mload(0x60), f_q), result, f_q) +result := addmod(mulmod(mload(0x1360), mload(0x80), f_q), result, f_q) +mstore(4992, result) + } +mstore(0x13a0, addmod(mload(0x600), mload(0x720), f_q)) +mstore(0x13c0, mulmod(mload(0x13a0), mload(0x13a0), f_q)) +mstore(0x13e0, mulmod(mload(0x13c0), mload(0x13c0), f_q)) +mstore(0x1400, mulmod(mload(0x13a0), mload(0x13e0), f_q)) +mstore(0x1420, mulmod(mload(0x1400), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) +mstore(0x1440, addmod(mload(0x620), mload(0x740), f_q)) +mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q)) +mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q)) +mstore(0x14a0, mulmod(mload(0x1440), mload(0x1480), f_q)) +mstore(0x14c0, mulmod(mload(0x14a0), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) +mstore(0x14e0, addmod(mload(0x1420), mload(0x14c0), f_q)) +mstore(0x1500, addmod(mload(0x14e0), sub(f_q, mload(0x640)), f_q)) +mstore(0x1520, mulmod(mload(0x1500), mload(0x7c0), f_q)) +mstore(0x1540, mulmod(mload(0x420), mload(0x1520), f_q)) +mstore(0x1560, mulmod(mload(0x1400), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) +mstore(0x1580, mulmod(mload(0x14a0), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) +mstore(0x15a0, addmod(mload(0x1560), mload(0x1580), f_q)) +mstore(0x15c0, addmod(mload(0x15a0), sub(f_q, mload(0x660)), f_q)) +mstore(0x15e0, mulmod(mload(0x15c0), mload(0x7c0), f_q)) +mstore(0x1600, addmod(mload(0x1540), mload(0x15e0), f_q)) +mstore(0x1620, mulmod(mload(0x420), mload(0x1600), f_q)) +mstore(0x1640, addmod(mload(0x1400), sub(f_q, mload(0x680)), f_q)) +mstore(0x1660, mulmod(mload(0x1640), mload(0x7e0), f_q)) +mstore(0x1680, addmod(mload(0x1620), mload(0x1660), f_q)) +mstore(0x16a0, mulmod(mload(0x420), mload(0x1680), f_q)) +mstore(0x16c0, mulmod(mload(0x680), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) +mstore(0x16e0, mulmod(mload(0x1440), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) +mstore(0x1700, addmod(mload(0x16c0), mload(0x16e0), f_q)) +mstore(0x1720, addmod(mload(0x1700), mload(0x6e0), f_q)) +mstore(0x1740, mulmod(mload(0x1720), mload(0x1720), f_q)) +mstore(0x1760, mulmod(mload(0x1740), mload(0x1740), f_q)) +mstore(0x1780, mulmod(mload(0x1720), mload(0x1760), f_q)) +mstore(0x17a0, mulmod(mload(0x640), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q)) +mstore(0x17c0, mulmod(mload(0x660), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q)) +mstore(0x17e0, addmod(mload(0x17a0), mload(0x17c0), f_q)) +mstore(0x1800, addmod(mload(0x1780), sub(f_q, mload(0x17e0)), f_q)) +mstore(0x1820, mulmod(mload(0x1800), mload(0x7e0), f_q)) +mstore(0x1840, addmod(mload(0x16a0), mload(0x1820), f_q)) +mstore(0x1860, mulmod(mload(0x420), mload(0x1840), f_q)) +mstore(0x1880, mulmod(mload(0x680), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) +mstore(0x18a0, mulmod(mload(0x1440), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) +mstore(0x18c0, addmod(mload(0x1880), mload(0x18a0), f_q)) +mstore(0x18e0, addmod(mload(0x18c0), mload(0x700), f_q)) +mstore(0x1900, mulmod(mload(0x640), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q)) +mstore(0x1920, mulmod(mload(0x660), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q)) +mstore(0x1940, addmod(mload(0x1900), mload(0x1920), f_q)) +mstore(0x1960, addmod(mload(0x18e0), sub(f_q, mload(0x1940)), f_q)) +mstore(0x1980, mulmod(mload(0x1960), mload(0x7e0), f_q)) +mstore(0x19a0, addmod(mload(0x1860), mload(0x1980), f_q)) +mstore(0x19c0, mulmod(mload(0x420), mload(0x19a0), f_q)) +mstore(0x19e0, addmod(1, sub(f_q, mload(0x7a0)), f_q)) +mstore(0x1a00, mulmod(mload(0x19e0), mload(0x7a0), f_q)) +mstore(0x1a20, addmod(2, sub(f_q, mload(0x7a0)), f_q)) +mstore(0x1a40, mulmod(mload(0x1a20), mload(0x1a00), f_q)) +mstore(0x1a60, addmod(4, sub(f_q, mload(0x7a0)), f_q)) +mstore(0x1a80, mulmod(mload(0x1a60), mload(0x1a40), f_q)) +mstore(0x1aa0, addmod(mload(0x6c0), mload(0x600), f_q)) +mstore(0x1ac0, addmod(mload(0x1aa0), sub(f_q, mload(0x640)), f_q)) +mstore(0x1ae0, mulmod(mload(0x1ac0), mload(0x1a80), f_q)) +mstore(0x1b00, addmod(mload(0x19c0), mload(0x1ae0), f_q)) +mstore(0x1b20, mulmod(mload(0x420), mload(0x1b00), f_q)) +mstore(0x1b40, addmod(mload(0x6a0), sub(f_q, mload(0x660)), f_q)) +mstore(0x1b60, mulmod(mload(0x1b40), mload(0x1a80), f_q)) +mstore(0x1b80, addmod(mload(0x1b20), mload(0x1b60), f_q)) +mstore(0x1ba0, mulmod(mload(0x420), mload(0x1b80), f_q)) +mstore(0x1bc0, mulmod(mload(0x1500), mload(0x800), f_q)) +mstore(0x1be0, addmod(mload(0x1ba0), mload(0x1bc0), f_q)) +mstore(0x1c00, mulmod(mload(0x420), mload(0x1be0), f_q)) +mstore(0x1c20, mulmod(mload(0x15c0), mload(0x800), f_q)) +mstore(0x1c40, addmod(mload(0x1c00), mload(0x1c20), f_q)) +mstore(0x1c60, mulmod(mload(0x420), mload(0x1c40), f_q)) +mstore(0x1c80, mulmod(mload(0x1640), mload(0x820), f_q)) +mstore(0x1ca0, addmod(mload(0x1c60), mload(0x1c80), f_q)) +mstore(0x1cc0, mulmod(mload(0x420), mload(0x1ca0), f_q)) +mstore(0x1ce0, mulmod(mload(0x1800), mload(0x820), f_q)) +mstore(0x1d00, addmod(mload(0x1cc0), mload(0x1ce0), f_q)) +mstore(0x1d20, mulmod(mload(0x420), mload(0x1d00), f_q)) +mstore(0x1d40, mulmod(mload(0x1960), mload(0x820), f_q)) +mstore(0x1d60, addmod(mload(0x1d20), mload(0x1d40), f_q)) +mstore(0x1d80, mulmod(mload(0x420), mload(0x1d60), f_q)) +mstore(0x1da0, addmod(3, sub(f_q, mload(0x7a0)), f_q)) +mstore(0x1dc0, mulmod(mload(0x1da0), mload(0x1a40), f_q)) +mstore(0x1de0, mulmod(mload(0x1ac0), mload(0x1dc0), f_q)) +mstore(0x1e00, addmod(mload(0x1d80), mload(0x1de0), f_q)) +mstore(0x1e20, mulmod(mload(0x420), mload(0x1e00), f_q)) +mstore(0x1e40, mulmod(mload(0x1b40), mload(0x1dc0), f_q)) +mstore(0x1e60, addmod(mload(0x1e20), mload(0x1e40), f_q)) +mstore(0x1e80, mulmod(mload(0x420), mload(0x1e60), f_q)) +mstore(0x1ea0, mulmod(mload(0x1a20), mload(0x7a0), f_q)) +mstore(0x1ec0, mulmod(mload(0x1da0), mload(0x1ea0), f_q)) +mstore(0x1ee0, mulmod(mload(0x1a60), mload(0x1ec0), f_q)) +mstore(0x1f00, mulmod(mload(0x680), mload(0x1ee0), f_q)) +mstore(0x1f20, addmod(1, sub(f_q, mload(0x680)), f_q)) +mstore(0x1f40, mulmod(mload(0x1f20), mload(0x1f00), f_q)) +mstore(0x1f60, addmod(mload(0x1e80), mload(0x1f40), f_q)) +mstore(0x1f80, mulmod(mload(0x420), mload(0x1f60), f_q)) +mstore(0x1fa0, addmod(mload(0x620), sub(f_q, mload(0x600)), f_q)) +mstore(0x1fc0, mulmod(mload(0x680), mload(0x1fa0), f_q)) +mstore(0x1fe0, addmod(mload(0x1fc0), mload(0x600), f_q)) mstore(0x2000, addmod(mload(0x1fe0), sub(f_q, mload(0x640)), f_q)) -mstore(0x2020, mulmod(mload(0x2000), mload(0x1fc0), f_q)) +mstore(0x2020, mulmod(mload(0x2000), mload(0x1ee0), f_q)) mstore(0x2040, addmod(mload(0x1f80), mload(0x2020), f_q)) -mstore(0x2060, mulmod(mload(0x3e0), mload(0x2040), f_q)) -mstore(0x2080, addmod(mload(0x2060), mload(0x2020), f_q)) -mstore(0x20a0, mulmod(mload(0x3e0), mload(0x2080), f_q)) -mstore(0x20c0, addmod(1, sub(f_q, mload(0x8e0)), f_q)) -mstore(0x20e0, mulmod(mload(0x20c0), mload(0x1200), f_q)) -mstore(0x2100, addmod(mload(0x20a0), mload(0x20e0), f_q)) -mstore(0x2120, mulmod(mload(0x3e0), mload(0x2100), f_q)) -mstore(0x2140, mulmod(mload(0x940), mload(0x940), f_q)) -mstore(0x2160, addmod(mload(0x2140), sub(f_q, mload(0x940)), f_q)) -mstore(0x2180, mulmod(mload(0x2160), mload(0x1140), f_q)) -mstore(0x21a0, addmod(mload(0x2120), mload(0x2180), f_q)) -mstore(0x21c0, mulmod(mload(0x3e0), mload(0x21a0), f_q)) -mstore(0x21e0, addmod(mload(0x940), sub(f_q, mload(0x920)), f_q)) -mstore(0x2200, mulmod(mload(0x21e0), mload(0x1200), f_q)) -mstore(0x2220, addmod(mload(0x21c0), mload(0x2200), f_q)) -mstore(0x2240, mulmod(mload(0x3e0), mload(0x2220), f_q)) -mstore(0x2260, addmod(1, sub(f_q, mload(0x1140)), f_q)) -mstore(0x2280, addmod(mload(0x1160), mload(0x1180), f_q)) -mstore(0x22a0, addmod(mload(0x2280), mload(0x11a0), f_q)) -mstore(0x22c0, addmod(mload(0x22a0), mload(0x11c0), f_q)) -mstore(0x22e0, addmod(mload(0x22c0), mload(0x11e0), f_q)) -mstore(0x2300, addmod(mload(0x2260), sub(f_q, mload(0x22e0)), f_q)) -mstore(0x2320, mulmod(mload(0x820), mload(0x220), f_q)) -mstore(0x2340, addmod(mload(0x6a0), mload(0x2320), f_q)) -mstore(0x2360, addmod(mload(0x2340), mload(0x280), f_q)) -mstore(0x2380, mulmod(mload(0x840), mload(0x220), f_q)) -mstore(0x23a0, addmod(mload(0x5c0), mload(0x2380), f_q)) -mstore(0x23c0, addmod(mload(0x23a0), mload(0x280), f_q)) -mstore(0x23e0, mulmod(mload(0x23c0), mload(0x2360), f_q)) -mstore(0x2400, mulmod(mload(0x860), mload(0x220), f_q)) -mstore(0x2420, addmod(mload(0x5e0), mload(0x2400), f_q)) -mstore(0x2440, addmod(mload(0x2420), mload(0x280), f_q)) -mstore(0x2460, mulmod(mload(0x2440), mload(0x23e0), f_q)) -mstore(0x2480, mulmod(mload(0x880), mload(0x220), f_q)) -mstore(0x24a0, addmod(mload(0x6c0), mload(0x2480), f_q)) -mstore(0x24c0, addmod(mload(0x24a0), mload(0x280), f_q)) -mstore(0x24e0, mulmod(mload(0x24c0), mload(0x2460), f_q)) -mstore(0x2500, mulmod(mload(0x24e0), mload(0x900), f_q)) -mstore(0x2520, mulmod(1, mload(0x220), f_q)) -mstore(0x2540, mulmod(mload(0x580), mload(0x2520), f_q)) -mstore(0x2560, addmod(mload(0x6a0), mload(0x2540), f_q)) -mstore(0x2580, addmod(mload(0x2560), mload(0x280), f_q)) -mstore(0x25a0, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x220), f_q)) -mstore(0x25c0, mulmod(mload(0x580), mload(0x25a0), f_q)) -mstore(0x25e0, addmod(mload(0x5c0), mload(0x25c0), f_q)) -mstore(0x2600, addmod(mload(0x25e0), mload(0x280), f_q)) -mstore(0x2620, mulmod(mload(0x2600), mload(0x2580), f_q)) -mstore(0x2640, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x220), f_q)) -mstore(0x2660, mulmod(mload(0x580), mload(0x2640), f_q)) -mstore(0x2680, addmod(mload(0x5e0), mload(0x2660), f_q)) -mstore(0x26a0, addmod(mload(0x2680), mload(0x280), f_q)) -mstore(0x26c0, mulmod(mload(0x26a0), mload(0x2620), f_q)) -mstore(0x26e0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x220), f_q)) -mstore(0x2700, mulmod(mload(0x580), mload(0x26e0), f_q)) -mstore(0x2720, addmod(mload(0x6c0), mload(0x2700), f_q)) -mstore(0x2740, addmod(mload(0x2720), mload(0x280), f_q)) -mstore(0x2760, mulmod(mload(0x2740), mload(0x26c0), f_q)) -mstore(0x2780, mulmod(mload(0x2760), mload(0x8e0), f_q)) -mstore(0x27a0, addmod(mload(0x2500), sub(f_q, mload(0x2780)), f_q)) -mstore(0x27c0, mulmod(mload(0x27a0), mload(0x2300), f_q)) -mstore(0x27e0, addmod(mload(0x2240), mload(0x27c0), f_q)) -mstore(0x2800, mulmod(mload(0x3e0), mload(0x27e0), f_q)) -mstore(0x2820, mulmod(mload(0x8a0), mload(0x220), f_q)) -mstore(0x2840, addmod(mload(0x640), mload(0x2820), f_q)) -mstore(0x2860, addmod(mload(0x2840), mload(0x280), f_q)) -mstore(0x2880, mulmod(mload(0x8c0), mload(0x220), f_q)) -mstore(0x28a0, addmod(mload(0x1240), mload(0x2880), f_q)) -mstore(0x28c0, addmod(mload(0x28a0), mload(0x280), f_q)) -mstore(0x28e0, mulmod(mload(0x28c0), mload(0x2860), f_q)) -mstore(0x2900, mulmod(mload(0x28e0), mload(0x960), f_q)) -mstore(0x2920, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x220), f_q)) -mstore(0x2940, mulmod(mload(0x580), mload(0x2920), f_q)) -mstore(0x2960, addmod(mload(0x640), mload(0x2940), f_q)) -mstore(0x2980, addmod(mload(0x2960), mload(0x280), f_q)) -mstore(0x29a0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x220), f_q)) -mstore(0x29c0, mulmod(mload(0x580), mload(0x29a0), f_q)) -mstore(0x29e0, addmod(mload(0x1240), mload(0x29c0), f_q)) -mstore(0x2a00, addmod(mload(0x29e0), mload(0x280), f_q)) -mstore(0x2a20, mulmod(mload(0x2a00), mload(0x2980), f_q)) -mstore(0x2a40, mulmod(mload(0x2a20), mload(0x940), f_q)) -mstore(0x2a60, addmod(mload(0x2900), sub(f_q, mload(0x2a40)), f_q)) -mstore(0x2a80, mulmod(mload(0x2a60), mload(0x2300), f_q)) -mstore(0x2aa0, addmod(mload(0x2800), mload(0x2a80), f_q)) -mstore(0x2ac0, mulmod(mload(0x3e0), mload(0x2aa0), f_q)) -mstore(0x2ae0, addmod(1, sub(f_q, mload(0x980)), f_q)) -mstore(0x2b00, mulmod(mload(0x2ae0), mload(0x1200), f_q)) -mstore(0x2b20, addmod(mload(0x2ac0), mload(0x2b00), f_q)) -mstore(0x2b40, mulmod(mload(0x3e0), mload(0x2b20), f_q)) -mstore(0x2b60, mulmod(mload(0x980), mload(0x980), f_q)) -mstore(0x2b80, addmod(mload(0x2b60), sub(f_q, mload(0x980)), f_q)) -mstore(0x2ba0, mulmod(mload(0x2b80), mload(0x1140), f_q)) -mstore(0x2bc0, addmod(mload(0x2b40), mload(0x2ba0), f_q)) -mstore(0x2be0, mulmod(mload(0x3e0), mload(0x2bc0), f_q)) -mstore(0x2c00, addmod(mload(0x9c0), mload(0x220), f_q)) -mstore(0x2c20, mulmod(mload(0x2c00), mload(0x9a0), f_q)) -mstore(0x2c40, addmod(mload(0xa00), mload(0x280), f_q)) -mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2c20), f_q)) -mstore(0x2c80, mulmod(256, mload(0x600), f_q)) -mstore(0x2ca0, addmod(mload(0x5c0), sub(f_q, mload(0x2c80)), f_q)) -mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x740), f_q)) -mstore(0x2ce0, addmod(mload(0x2cc0), mload(0x220), f_q)) -mstore(0x2d00, mulmod(mload(0x2ce0), mload(0x980), f_q)) -mstore(0x2d20, addmod(mload(0x720), mload(0x280), f_q)) -mstore(0x2d40, mulmod(mload(0x2d20), mload(0x2d00), f_q)) -mstore(0x2d60, addmod(mload(0x2c60), sub(f_q, mload(0x2d40)), f_q)) -mstore(0x2d80, mulmod(mload(0x2d60), mload(0x2300), f_q)) -mstore(0x2da0, addmod(mload(0x2be0), mload(0x2d80), f_q)) -mstore(0x2dc0, mulmod(mload(0x3e0), mload(0x2da0), f_q)) -mstore(0x2de0, addmod(mload(0x9c0), sub(f_q, mload(0xa00)), f_q)) -mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1200), f_q)) -mstore(0x2e20, addmod(mload(0x2dc0), mload(0x2e00), f_q)) -mstore(0x2e40, mulmod(mload(0x3e0), mload(0x2e20), f_q)) -mstore(0x2e60, mulmod(mload(0x2de0), mload(0x2300), f_q)) -mstore(0x2e80, addmod(mload(0x9c0), sub(f_q, mload(0x9e0)), f_q)) -mstore(0x2ea0, mulmod(mload(0x2e80), mload(0x2e60), f_q)) -mstore(0x2ec0, addmod(mload(0x2e40), mload(0x2ea0), f_q)) -mstore(0x2ee0, mulmod(mload(0xd00), mload(0xd00), f_q)) -mstore(0x2f00, mulmod(mload(0x2ee0), mload(0xd00), f_q)) -mstore(0x2f20, mulmod(mload(0x2f00), mload(0xd00), f_q)) -mstore(0x2f40, mulmod(mload(0x2f20), mload(0xd00), f_q)) -mstore(0x2f60, mulmod(1, mload(0xd00), f_q)) -mstore(0x2f80, mulmod(1, mload(0x2ee0), f_q)) -mstore(0x2fa0, mulmod(1, mload(0x2f00), f_q)) -mstore(0x2fc0, mulmod(1, mload(0x2f20), f_q)) -mstore(0x2fe0, mulmod(mload(0x2ec0), mload(0xd20), f_q)) -mstore(0x3000, mulmod(mload(0xbc0), mload(0x580), f_q)) -mstore(0x3020, mulmod(mload(0x580), 1, f_q)) -mstore(0x3040, addmod(mload(0xb40), sub(f_q, mload(0x3020)), f_q)) -mstore(0x3060, mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) -mstore(0x3080, addmod(mload(0xb40), sub(f_q, mload(0x3060)), f_q)) -mstore(0x30a0, mulmod(mload(0x580), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) -mstore(0x30c0, addmod(mload(0xb40), sub(f_q, mload(0x30a0)), f_q)) -mstore(0x30e0, mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) -mstore(0x3100, addmod(mload(0xb40), sub(f_q, mload(0x30e0)), f_q)) +mstore(0x2060, mulmod(mload(0x420), mload(0x2040), f_q)) +mstore(0x2080, addmod(mload(0x600), sub(f_q, mload(0x620)), f_q)) +mstore(0x20a0, mulmod(mload(0x680), mload(0x2080), f_q)) +mstore(0x20c0, addmod(mload(0x20a0), mload(0x620), f_q)) +mstore(0x20e0, addmod(mload(0x20c0), sub(f_q, mload(0x660)), f_q)) +mstore(0x2100, mulmod(mload(0x20e0), mload(0x1ee0), f_q)) +mstore(0x2120, addmod(mload(0x2060), mload(0x2100), f_q)) +mstore(0x2140, mulmod(mload(0x420), mload(0x2120), f_q)) +mstore(0x2160, mulmod(mload(0x1da0), mload(0x1a00), f_q)) +mstore(0x2180, mulmod(mload(0x1a60), mload(0x2160), f_q)) +mstore(0x21a0, addmod(mload(0x600), mload(0x620), f_q)) +mstore(0x21c0, addmod(mload(0x21a0), sub(f_q, mload(0x680)), f_q)) +mstore(0x21e0, mulmod(mload(0x21c0), mload(0x2180), f_q)) +mstore(0x2200, addmod(mload(0x2140), mload(0x21e0), f_q)) +mstore(0x2220, mulmod(mload(0x420), mload(0x2200), f_q)) +mstore(0x2240, addmod(mload(0x2220), mload(0x21e0), f_q)) +mstore(0x2260, mulmod(mload(0x420), mload(0x2240), f_q)) +mstore(0x2280, addmod(1, sub(f_q, mload(0x920)), f_q)) +mstore(0x22a0, mulmod(mload(0x2280), mload(0x1300), f_q)) +mstore(0x22c0, addmod(mload(0x2260), mload(0x22a0), f_q)) +mstore(0x22e0, mulmod(mload(0x420), mload(0x22c0), f_q)) +mstore(0x2300, mulmod(mload(0x980), mload(0x980), f_q)) +mstore(0x2320, addmod(mload(0x2300), sub(f_q, mload(0x980)), f_q)) +mstore(0x2340, mulmod(mload(0x2320), mload(0x1240), f_q)) +mstore(0x2360, addmod(mload(0x22e0), mload(0x2340), f_q)) +mstore(0x2380, mulmod(mload(0x420), mload(0x2360), f_q)) +mstore(0x23a0, addmod(mload(0x980), sub(f_q, mload(0x960)), f_q)) +mstore(0x23c0, mulmod(mload(0x23a0), mload(0x1300), f_q)) +mstore(0x23e0, addmod(mload(0x2380), mload(0x23c0), f_q)) +mstore(0x2400, mulmod(mload(0x420), mload(0x23e0), f_q)) +mstore(0x2420, addmod(1, sub(f_q, mload(0x1240)), f_q)) +mstore(0x2440, addmod(mload(0x1260), mload(0x1280), f_q)) +mstore(0x2460, addmod(mload(0x2440), mload(0x12a0), f_q)) +mstore(0x2480, addmod(mload(0x2460), mload(0x12c0), f_q)) +mstore(0x24a0, addmod(mload(0x2480), mload(0x12e0), f_q)) +mstore(0x24c0, addmod(mload(0x2420), sub(f_q, mload(0x24a0)), f_q)) +mstore(0x24e0, mulmod(mload(0x860), mload(0x260), f_q)) +mstore(0x2500, addmod(mload(0x6e0), mload(0x24e0), f_q)) +mstore(0x2520, addmod(mload(0x2500), mload(0x2c0), f_q)) +mstore(0x2540, mulmod(mload(0x880), mload(0x260), f_q)) +mstore(0x2560, addmod(mload(0x600), mload(0x2540), f_q)) +mstore(0x2580, addmod(mload(0x2560), mload(0x2c0), f_q)) +mstore(0x25a0, mulmod(mload(0x2580), mload(0x2520), f_q)) +mstore(0x25c0, mulmod(mload(0x8a0), mload(0x260), f_q)) +mstore(0x25e0, addmod(mload(0x620), mload(0x25c0), f_q)) +mstore(0x2600, addmod(mload(0x25e0), mload(0x2c0), f_q)) +mstore(0x2620, mulmod(mload(0x2600), mload(0x25a0), f_q)) +mstore(0x2640, mulmod(mload(0x8c0), mload(0x260), f_q)) +mstore(0x2660, addmod(mload(0x700), mload(0x2640), f_q)) +mstore(0x2680, addmod(mload(0x2660), mload(0x2c0), f_q)) +mstore(0x26a0, mulmod(mload(0x2680), mload(0x2620), f_q)) +mstore(0x26c0, mulmod(mload(0x26a0), mload(0x940), f_q)) +mstore(0x26e0, mulmod(1, mload(0x260), f_q)) +mstore(0x2700, mulmod(mload(0x5c0), mload(0x26e0), f_q)) +mstore(0x2720, addmod(mload(0x6e0), mload(0x2700), f_q)) +mstore(0x2740, addmod(mload(0x2720), mload(0x2c0), f_q)) +mstore(0x2760, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x260), f_q)) +mstore(0x2780, mulmod(mload(0x5c0), mload(0x2760), f_q)) +mstore(0x27a0, addmod(mload(0x600), mload(0x2780), f_q)) +mstore(0x27c0, addmod(mload(0x27a0), mload(0x2c0), f_q)) +mstore(0x27e0, mulmod(mload(0x27c0), mload(0x2740), f_q)) +mstore(0x2800, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x260), f_q)) +mstore(0x2820, mulmod(mload(0x5c0), mload(0x2800), f_q)) +mstore(0x2840, addmod(mload(0x620), mload(0x2820), f_q)) +mstore(0x2860, addmod(mload(0x2840), mload(0x2c0), f_q)) +mstore(0x2880, mulmod(mload(0x2860), mload(0x27e0), f_q)) +mstore(0x28a0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x260), f_q)) +mstore(0x28c0, mulmod(mload(0x5c0), mload(0x28a0), f_q)) +mstore(0x28e0, addmod(mload(0x700), mload(0x28c0), f_q)) +mstore(0x2900, addmod(mload(0x28e0), mload(0x2c0), f_q)) +mstore(0x2920, mulmod(mload(0x2900), mload(0x2880), f_q)) +mstore(0x2940, mulmod(mload(0x2920), mload(0x920), f_q)) +mstore(0x2960, addmod(mload(0x26c0), sub(f_q, mload(0x2940)), f_q)) +mstore(0x2980, mulmod(mload(0x2960), mload(0x24c0), f_q)) +mstore(0x29a0, addmod(mload(0x2400), mload(0x2980), f_q)) +mstore(0x29c0, mulmod(mload(0x420), mload(0x29a0), f_q)) +mstore(0x29e0, mulmod(mload(0x8e0), mload(0x260), f_q)) +mstore(0x2a00, addmod(mload(0x680), mload(0x29e0), f_q)) +mstore(0x2a20, addmod(mload(0x2a00), mload(0x2c0), f_q)) +mstore(0x2a40, mulmod(mload(0x900), mload(0x260), f_q)) +mstore(0x2a60, addmod(mload(0x1380), mload(0x2a40), f_q)) +mstore(0x2a80, addmod(mload(0x2a60), mload(0x2c0), f_q)) +mstore(0x2aa0, mulmod(mload(0x2a80), mload(0x2a20), f_q)) +mstore(0x2ac0, mulmod(mload(0x2aa0), mload(0x9a0), f_q)) +mstore(0x2ae0, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x260), f_q)) +mstore(0x2b00, mulmod(mload(0x5c0), mload(0x2ae0), f_q)) +mstore(0x2b20, addmod(mload(0x680), mload(0x2b00), f_q)) +mstore(0x2b40, addmod(mload(0x2b20), mload(0x2c0), f_q)) +mstore(0x2b60, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x260), f_q)) +mstore(0x2b80, mulmod(mload(0x5c0), mload(0x2b60), f_q)) +mstore(0x2ba0, addmod(mload(0x1380), mload(0x2b80), f_q)) +mstore(0x2bc0, addmod(mload(0x2ba0), mload(0x2c0), f_q)) +mstore(0x2be0, mulmod(mload(0x2bc0), mload(0x2b40), f_q)) +mstore(0x2c00, mulmod(mload(0x2be0), mload(0x980), f_q)) +mstore(0x2c20, addmod(mload(0x2ac0), sub(f_q, mload(0x2c00)), f_q)) +mstore(0x2c40, mulmod(mload(0x2c20), mload(0x24c0), f_q)) +mstore(0x2c60, addmod(mload(0x29c0), mload(0x2c40), f_q)) +mstore(0x2c80, mulmod(mload(0x420), mload(0x2c60), f_q)) +mstore(0x2ca0, addmod(1, sub(f_q, mload(0x9c0)), f_q)) +mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x1300), f_q)) +mstore(0x2ce0, addmod(mload(0x2c80), mload(0x2cc0), f_q)) +mstore(0x2d00, mulmod(mload(0x420), mload(0x2ce0), f_q)) +mstore(0x2d20, mulmod(mload(0x9c0), mload(0x9c0), f_q)) +mstore(0x2d40, addmod(mload(0x2d20), sub(f_q, mload(0x9c0)), f_q)) +mstore(0x2d60, mulmod(mload(0x2d40), mload(0x1240), f_q)) +mstore(0x2d80, addmod(mload(0x2d00), mload(0x2d60), f_q)) +mstore(0x2da0, mulmod(mload(0x420), mload(0x2d80), f_q)) +mstore(0x2dc0, addmod(mload(0xa00), mload(0x260), f_q)) +mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x9e0), f_q)) +mstore(0x2e00, addmod(mload(0xa40), mload(0x2c0), f_q)) +mstore(0x2e20, mulmod(mload(0x2e00), mload(0x2de0), f_q)) +mstore(0x2e40, mulmod(256, mload(0x640), f_q)) +mstore(0x2e60, addmod(mload(0x600), sub(f_q, mload(0x2e40)), f_q)) +mstore(0x2e80, mulmod(mload(0x2e60), mload(0x780), f_q)) +mstore(0x2ea0, addmod(mload(0x2e80), mload(0x260), f_q)) +mstore(0x2ec0, mulmod(mload(0x2ea0), mload(0x9c0), f_q)) +mstore(0x2ee0, addmod(mload(0x760), mload(0x2c0), f_q)) +mstore(0x2f00, mulmod(mload(0x2ee0), mload(0x2ec0), f_q)) +mstore(0x2f20, addmod(mload(0x2e20), sub(f_q, mload(0x2f00)), f_q)) +mstore(0x2f40, mulmod(mload(0x2f20), mload(0x24c0), f_q)) +mstore(0x2f60, addmod(mload(0x2da0), mload(0x2f40), f_q)) +mstore(0x2f80, mulmod(mload(0x420), mload(0x2f60), f_q)) +mstore(0x2fa0, addmod(mload(0xa00), sub(f_q, mload(0xa40)), f_q)) +mstore(0x2fc0, mulmod(mload(0x2fa0), mload(0x1300), f_q)) +mstore(0x2fe0, addmod(mload(0x2f80), mload(0x2fc0), f_q)) +mstore(0x3000, mulmod(mload(0x420), mload(0x2fe0), f_q)) +mstore(0x3020, mulmod(mload(0x2fa0), mload(0x24c0), f_q)) +mstore(0x3040, addmod(mload(0xa00), sub(f_q, mload(0xa20)), f_q)) +mstore(0x3060, mulmod(mload(0x3040), mload(0x3020), f_q)) +mstore(0x3080, addmod(mload(0x3000), mload(0x3060), f_q)) +mstore(0x30a0, mulmod(mload(0xd40), mload(0xd40), f_q)) +mstore(0x30c0, mulmod(mload(0x30a0), mload(0xd40), f_q)) +mstore(0x30e0, mulmod(mload(0x30c0), mload(0xd40), f_q)) +mstore(0x3100, mulmod(mload(0x30e0), mload(0xd40), f_q)) +mstore(0x3120, mulmod(1, mload(0xd40), f_q)) +mstore(0x3140, mulmod(1, mload(0x30a0), f_q)) +mstore(0x3160, mulmod(1, mload(0x30c0), f_q)) +mstore(0x3180, mulmod(1, mload(0x30e0), f_q)) +mstore(0x31a0, mulmod(mload(0x3080), mload(0xd60), f_q)) +mstore(0x31c0, mulmod(mload(0xc00), mload(0x5c0), f_q)) +mstore(0x31e0, mulmod(mload(0x5c0), 1, f_q)) +mstore(0x3200, addmod(mload(0xb80), sub(f_q, mload(0x31e0)), f_q)) +mstore(0x3220, mulmod(mload(0x5c0), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) +mstore(0x3240, addmod(mload(0xb80), sub(f_q, mload(0x3220)), f_q)) +mstore(0x3260, mulmod(mload(0x5c0), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) +mstore(0x3280, addmod(mload(0xb80), sub(f_q, mload(0x3260)), f_q)) +mstore(0x32a0, mulmod(mload(0x5c0), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) +mstore(0x32c0, addmod(mload(0xb80), sub(f_q, mload(0x32a0)), f_q)) { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q) -mstore(12576, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q) +mstore(13024, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q) -mstore(12608, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q) +mstore(13056, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q) -mstore(12640, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q) +mstore(13088, result) } -mstore(0x3180, mulmod(1, mload(0x3040), f_q)) -mstore(0x31a0, mulmod(mload(0x3180), mload(0x3080), f_q)) -mstore(0x31c0, mulmod(mload(0x31a0), mload(0x3100), f_q)) +mstore(0x3340, mulmod(1, mload(0x3200), f_q)) +mstore(0x3360, mulmod(mload(0x3340), mload(0x3240), f_q)) +mstore(0x3380, mulmod(mload(0x3360), mload(0x32c0), f_q)) { - let result := mulmod(mload(0xb40), 1, f_q) -result := addmod(mulmod(mload(0x580), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q) -mstore(12768, result) + let result := mulmod(mload(0xb80), 1, f_q) +result := addmod(mulmod(mload(0x5c0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q) +mstore(13216, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q) -mstore(12800, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q) +mstore(13248, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q) -mstore(12832, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q) +mstore(13280, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q) -mstore(12864, result) + let result := mulmod(mload(0xb80), mulmod(mload(0xc00), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0xc00), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q) +mstore(13312, result) } -mstore(0x3260, mulmod(mload(0x31a0), mload(0x30c0), f_q)) +mstore(0x3420, mulmod(mload(0x3360), mload(0x3280), f_q)) { - let result := mulmod(mload(0xb40), mulmod(mload(0x580), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q) -mstore(12928, result) + let result := mulmod(mload(0xb80), mulmod(mload(0x5c0), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0x5c0), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q) +mstore(13376, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q) -mstore(12960, result) + let result := mulmod(mload(0xb80), mulmod(mload(0x5c0), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0x5c0), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q) +mstore(13408, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0x580), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q) -mstore(12992, result) + let result := mulmod(mload(0xb80), mulmod(mload(0x5c0), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0x5c0), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q) +mstore(13440, result) } { - let result := mulmod(mload(0xb40), mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q) -result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q) -mstore(13024, result) + let result := mulmod(mload(0xb80), mulmod(mload(0x5c0), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q) +result := addmod(mulmod(mload(0x5c0), mulmod(mload(0x5c0), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q) +mstore(13472, result) } -mstore(0x3300, mulmod(mload(0x3180), mload(0x3100), f_q)) +mstore(0x34c0, mulmod(mload(0x3340), mload(0x32c0), f_q)) { - let prod := mload(0x3120) + let prod := mload(0x32e0) - prod := mulmod(mload(0x3140), prod, f_q) - mstore(0x3320, prod) + prod := mulmod(mload(0x3300), prod, f_q) + mstore(0x34e0, prod) - prod := mulmod(mload(0x3160), prod, f_q) - mstore(0x3340, prod) + prod := mulmod(mload(0x3320), prod, f_q) + mstore(0x3500, prod) - prod := mulmod(mload(0x31e0), prod, f_q) - mstore(0x3360, prod) + prod := mulmod(mload(0x33a0), prod, f_q) + mstore(0x3520, prod) - prod := mulmod(mload(0x3180), prod, f_q) - mstore(0x3380, prod) + prod := mulmod(mload(0x3340), prod, f_q) + mstore(0x3540, prod) - prod := mulmod(mload(0x3200), prod, f_q) - mstore(0x33a0, prod) + prod := mulmod(mload(0x33c0), prod, f_q) + mstore(0x3560, prod) - prod := mulmod(mload(0x3220), prod, f_q) - mstore(0x33c0, prod) + prod := mulmod(mload(0x33e0), prod, f_q) + mstore(0x3580, prod) - prod := mulmod(mload(0x3240), prod, f_q) - mstore(0x33e0, prod) + prod := mulmod(mload(0x3400), prod, f_q) + mstore(0x35a0, prod) - prod := mulmod(mload(0x3260), prod, f_q) - mstore(0x3400, prod) + prod := mulmod(mload(0x3420), prod, f_q) + mstore(0x35c0, prod) - prod := mulmod(mload(0x3280), prod, f_q) - mstore(0x3420, prod) + prod := mulmod(mload(0x3440), prod, f_q) + mstore(0x35e0, prod) - prod := mulmod(mload(0x32a0), prod, f_q) - mstore(0x3440, prod) + prod := mulmod(mload(0x3460), prod, f_q) + mstore(0x3600, prod) - prod := mulmod(mload(0x31a0), prod, f_q) - mstore(0x3460, prod) + prod := mulmod(mload(0x3360), prod, f_q) + mstore(0x3620, prod) - prod := mulmod(mload(0x32c0), prod, f_q) - mstore(0x3480, prod) + prod := mulmod(mload(0x3480), prod, f_q) + mstore(0x3640, prod) - prod := mulmod(mload(0x32e0), prod, f_q) - mstore(0x34a0, prod) + prod := mulmod(mload(0x34a0), prod, f_q) + mstore(0x3660, prod) - prod := mulmod(mload(0x3300), prod, f_q) - mstore(0x34c0, prod) + prod := mulmod(mload(0x34c0), prod, f_q) + mstore(0x3680, prod) } -mstore(0x3500, 32) -mstore(0x3520, 32) -mstore(0x3540, 32) -mstore(0x3560, mload(0x34c0)) -mstore(0x3580, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x35a0, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x3500, 0xc0, 0x34e0, 0x20), 1), success) +mstore(0x36c0, 32) +mstore(0x36e0, 32) +mstore(0x3700, 32) +mstore(0x3720, mload(0x3680)) +mstore(0x3740, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x3760, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x36c0, 0xc0, 0x36a0, 0x20), 1), success) { - let inv := mload(0x34e0) + let inv := mload(0x36a0) let v - v := mload(0x3300) - mstore(13056, mulmod(mload(0x34a0), inv, f_q)) + v := mload(0x34c0) + mstore(13504, mulmod(mload(0x3660), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x32e0) - mstore(13024, mulmod(mload(0x3480), inv, f_q)) + v := mload(0x34a0) + mstore(13472, mulmod(mload(0x3640), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x32c0) - mstore(12992, mulmod(mload(0x3460), inv, f_q)) + v := mload(0x3480) + mstore(13440, mulmod(mload(0x3620), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x31a0) - mstore(12704, mulmod(mload(0x3440), inv, f_q)) + v := mload(0x3360) + mstore(13152, mulmod(mload(0x3600), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x32a0) - mstore(12960, mulmod(mload(0x3420), inv, f_q)) + v := mload(0x3460) + mstore(13408, mulmod(mload(0x35e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3280) - mstore(12928, mulmod(mload(0x3400), inv, f_q)) + v := mload(0x3440) + mstore(13376, mulmod(mload(0x35c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3260) - mstore(12896, mulmod(mload(0x33e0), inv, f_q)) + v := mload(0x3420) + mstore(13344, mulmod(mload(0x35a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3240) - mstore(12864, mulmod(mload(0x33c0), inv, f_q)) + v := mload(0x3400) + mstore(13312, mulmod(mload(0x3580), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3220) - mstore(12832, mulmod(mload(0x33a0), inv, f_q)) + v := mload(0x33e0) + mstore(13280, mulmod(mload(0x3560), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3200) - mstore(12800, mulmod(mload(0x3380), inv, f_q)) + v := mload(0x33c0) + mstore(13248, mulmod(mload(0x3540), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3180) - mstore(12672, mulmod(mload(0x3360), inv, f_q)) + v := mload(0x3340) + mstore(13120, mulmod(mload(0x3520), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x31e0) - mstore(12768, mulmod(mload(0x3340), inv, f_q)) + v := mload(0x33a0) + mstore(13216, mulmod(mload(0x3500), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3160) - mstore(12640, mulmod(mload(0x3320), inv, f_q)) + v := mload(0x3320) + mstore(13088, mulmod(mload(0x34e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3140) - mstore(12608, mulmod(mload(0x3120), inv, f_q)) + v := mload(0x3300) + mstore(13056, mulmod(mload(0x32e0), inv, f_q)) inv := mulmod(v, inv, f_q) - mstore(0x3120, inv) + mstore(0x32e0, inv) } { - let result := mload(0x3120) -result := addmod(mload(0x3140), result, f_q) -result := addmod(mload(0x3160), result, f_q) -mstore(13760, result) + let result := mload(0x32e0) +result := addmod(mload(0x3300), result, f_q) +result := addmod(mload(0x3320), result, f_q) +mstore(14208, result) } -mstore(0x35e0, mulmod(mload(0x31c0), mload(0x3180), f_q)) +mstore(0x37a0, mulmod(mload(0x3380), mload(0x3340), f_q)) { - let result := mload(0x31e0) -mstore(13824, result) + let result := mload(0x33a0) +mstore(14272, result) } -mstore(0x3620, mulmod(mload(0x31c0), mload(0x3260), f_q)) +mstore(0x37e0, mulmod(mload(0x3380), mload(0x3420), f_q)) { - let result := mload(0x3200) -result := addmod(mload(0x3220), result, f_q) -result := addmod(mload(0x3240), result, f_q) -mstore(13888, result) + let result := mload(0x33c0) +result := addmod(mload(0x33e0), result, f_q) +result := addmod(mload(0x3400), result, f_q) +mstore(14336, result) } -mstore(0x3660, mulmod(mload(0x31c0), mload(0x31a0), f_q)) +mstore(0x3820, mulmod(mload(0x3380), mload(0x3360), f_q)) { - let result := mload(0x3280) -result := addmod(mload(0x32a0), result, f_q) -mstore(13952, result) + let result := mload(0x3440) +result := addmod(mload(0x3460), result, f_q) +mstore(14400, result) } -mstore(0x36a0, mulmod(mload(0x31c0), mload(0x3300), f_q)) +mstore(0x3860, mulmod(mload(0x3380), mload(0x34c0), f_q)) { - let result := mload(0x32c0) -result := addmod(mload(0x32e0), result, f_q) -mstore(14016, result) + let result := mload(0x3480) +result := addmod(mload(0x34a0), result, f_q) +mstore(14464, result) } { - let prod := mload(0x35c0) + let prod := mload(0x3780) - prod := mulmod(mload(0x3600), prod, f_q) - mstore(0x36e0, prod) + prod := mulmod(mload(0x37c0), prod, f_q) + mstore(0x38a0, prod) - prod := mulmod(mload(0x3640), prod, f_q) - mstore(0x3700, prod) + prod := mulmod(mload(0x3800), prod, f_q) + mstore(0x38c0, prod) - prod := mulmod(mload(0x3680), prod, f_q) - mstore(0x3720, prod) + prod := mulmod(mload(0x3840), prod, f_q) + mstore(0x38e0, prod) - prod := mulmod(mload(0x36c0), prod, f_q) - mstore(0x3740, prod) + prod := mulmod(mload(0x3880), prod, f_q) + mstore(0x3900, prod) } -mstore(0x3780, 32) -mstore(0x37a0, 32) -mstore(0x37c0, 32) -mstore(0x37e0, mload(0x3740)) -mstore(0x3800, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x3820, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x3780, 0xc0, 0x3760, 0x20), 1), success) +mstore(0x3940, 32) +mstore(0x3960, 32) +mstore(0x3980, 32) +mstore(0x39a0, mload(0x3900)) +mstore(0x39c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x39e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x3940, 0xc0, 0x3920, 0x20), 1), success) { - let inv := mload(0x3760) + let inv := mload(0x3920) let v - v := mload(0x36c0) - mstore(14016, mulmod(mload(0x3720), inv, f_q)) + v := mload(0x3880) + mstore(14464, mulmod(mload(0x38e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3680) - mstore(13952, mulmod(mload(0x3700), inv, f_q)) + v := mload(0x3840) + mstore(14400, mulmod(mload(0x38c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3640) - mstore(13888, mulmod(mload(0x36e0), inv, f_q)) + v := mload(0x3800) + mstore(14336, mulmod(mload(0x38a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3600) - mstore(13824, mulmod(mload(0x35c0), inv, f_q)) + v := mload(0x37c0) + mstore(14272, mulmod(mload(0x3780), inv, f_q)) inv := mulmod(v, inv, f_q) - mstore(0x35c0, inv) + mstore(0x3780, inv) } -mstore(0x3840, mulmod(mload(0x35e0), mload(0x3600), f_q)) -mstore(0x3860, mulmod(mload(0x3620), mload(0x3640), f_q)) -mstore(0x3880, mulmod(mload(0x3660), mload(0x3680), f_q)) -mstore(0x38a0, mulmod(mload(0x36a0), mload(0x36c0), f_q)) -mstore(0x38c0, mulmod(mload(0xa40), mload(0xa40), f_q)) -mstore(0x38e0, mulmod(mload(0x38c0), mload(0xa40), f_q)) -mstore(0x3900, mulmod(mload(0x38e0), mload(0xa40), f_q)) -mstore(0x3920, mulmod(mload(0x3900), mload(0xa40), f_q)) -mstore(0x3940, mulmod(mload(0x3920), mload(0xa40), f_q)) -mstore(0x3960, mulmod(mload(0x3940), mload(0xa40), f_q)) -mstore(0x3980, mulmod(mload(0x3960), mload(0xa40), f_q)) -mstore(0x39a0, mulmod(mload(0x3980), mload(0xa40), f_q)) -mstore(0x39c0, mulmod(mload(0x39a0), mload(0xa40), f_q)) -mstore(0x39e0, mulmod(mload(0x39c0), mload(0xa40), f_q)) -mstore(0x3a00, mulmod(mload(0x39e0), mload(0xa40), f_q)) -mstore(0x3a20, mulmod(mload(0x3a00), mload(0xa40), f_q)) -mstore(0x3a40, mulmod(mload(0x3a20), mload(0xa40), f_q)) -mstore(0x3a60, mulmod(mload(0x3a40), mload(0xa40), f_q)) -mstore(0x3a80, mulmod(mload(0x3a60), mload(0xa40), f_q)) -mstore(0x3aa0, mulmod(mload(0x3a80), mload(0xa40), f_q)) -mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0xa40), f_q)) -mstore(0x3ae0, mulmod(mload(0x3ac0), mload(0xa40), f_q)) -mstore(0x3b00, mulmod(mload(0x3ae0), mload(0xa40), f_q)) -mstore(0x3b20, mulmod(mload(0x3b00), mload(0xa40), f_q)) -mstore(0x3b40, mulmod(mload(0xaa0), mload(0xaa0), f_q)) -mstore(0x3b60, mulmod(mload(0x3b40), mload(0xaa0), f_q)) -mstore(0x3b80, mulmod(mload(0x3b60), mload(0xaa0), f_q)) -mstore(0x3ba0, mulmod(mload(0x3b80), mload(0xaa0), f_q)) +mstore(0x3a00, mulmod(mload(0x37a0), mload(0x37c0), f_q)) +mstore(0x3a20, mulmod(mload(0x37e0), mload(0x3800), f_q)) +mstore(0x3a40, mulmod(mload(0x3820), mload(0x3840), f_q)) +mstore(0x3a60, mulmod(mload(0x3860), mload(0x3880), f_q)) +mstore(0x3a80, mulmod(mload(0xa80), mload(0xa80), f_q)) +mstore(0x3aa0, mulmod(mload(0x3a80), mload(0xa80), f_q)) +mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0xa80), f_q)) +mstore(0x3ae0, mulmod(mload(0x3ac0), mload(0xa80), f_q)) +mstore(0x3b00, mulmod(mload(0x3ae0), mload(0xa80), f_q)) +mstore(0x3b20, mulmod(mload(0x3b00), mload(0xa80), f_q)) +mstore(0x3b40, mulmod(mload(0x3b20), mload(0xa80), f_q)) +mstore(0x3b60, mulmod(mload(0x3b40), mload(0xa80), f_q)) +mstore(0x3b80, mulmod(mload(0x3b60), mload(0xa80), f_q)) +mstore(0x3ba0, mulmod(mload(0x3b80), mload(0xa80), f_q)) +mstore(0x3bc0, mulmod(mload(0x3ba0), mload(0xa80), f_q)) +mstore(0x3be0, mulmod(mload(0x3bc0), mload(0xa80), f_q)) +mstore(0x3c00, mulmod(mload(0x3be0), mload(0xa80), f_q)) +mstore(0x3c20, mulmod(mload(0x3c00), mload(0xa80), f_q)) +mstore(0x3c40, mulmod(mload(0x3c20), mload(0xa80), f_q)) +mstore(0x3c60, mulmod(mload(0x3c40), mload(0xa80), f_q)) +mstore(0x3c80, mulmod(mload(0x3c60), mload(0xa80), f_q)) +mstore(0x3ca0, mulmod(mload(0x3c80), mload(0xa80), f_q)) +mstore(0x3cc0, mulmod(mload(0x3ca0), mload(0xa80), f_q)) +mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0xa80), f_q)) +mstore(0x3d00, mulmod(mload(0xae0), mload(0xae0), f_q)) +mstore(0x3d20, mulmod(mload(0x3d00), mload(0xae0), f_q)) +mstore(0x3d40, mulmod(mload(0x3d20), mload(0xae0), f_q)) +mstore(0x3d60, mulmod(mload(0x3d40), mload(0xae0), f_q)) { - let result := mulmod(mload(0x5c0), mload(0x3120), f_q) -result := addmod(mulmod(mload(0x600), mload(0x3140), f_q), result, f_q) -result := addmod(mulmod(mload(0x680), mload(0x3160), f_q), result, f_q) -mstore(15296, result) + let result := mulmod(mload(0x600), mload(0x32e0), f_q) +result := addmod(mulmod(mload(0x640), mload(0x3300), f_q), result, f_q) +result := addmod(mulmod(mload(0x6c0), mload(0x3320), f_q), result, f_q) +mstore(15744, result) } -mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x35c0), f_q)) -mstore(0x3c00, mulmod(sub(f_q, mload(0x3be0)), 1, f_q)) -{ - let result := mulmod(mload(0x5e0), mload(0x3120), f_q) -result := addmod(mulmod(mload(0x620), mload(0x3140), f_q), result, f_q) -result := addmod(mulmod(mload(0x660), mload(0x3160), f_q), result, f_q) -mstore(15392, result) - } -mstore(0x3c40, mulmod(mload(0x3c20), mload(0x35c0), f_q)) -mstore(0x3c60, mulmod(sub(f_q, mload(0x3c40)), mload(0xa40), f_q)) -mstore(0x3c80, mulmod(1, mload(0xa40), f_q)) -mstore(0x3ca0, addmod(mload(0x3c00), mload(0x3c60), f_q)) -mstore(0x3cc0, mulmod(mload(0x3ca0), 1, f_q)) -mstore(0x3ce0, mulmod(mload(0x3c80), 1, f_q)) -mstore(0x3d00, mulmod(1, mload(0x35e0), f_q)) +mstore(0x3da0, mulmod(mload(0x3d80), mload(0x3780), f_q)) +mstore(0x3dc0, mulmod(sub(f_q, mload(0x3da0)), 1, f_q)) { - let result := mulmod(mload(0x640), mload(0x31e0), f_q) -mstore(15648, result) - } -mstore(0x3d40, mulmod(mload(0x3d20), mload(0x3840), f_q)) -mstore(0x3d60, mulmod(sub(f_q, mload(0x3d40)), 1, f_q)) -mstore(0x3d80, mulmod(mload(0x3d00), 1, f_q)) + let result := mulmod(mload(0x620), mload(0x32e0), f_q) +result := addmod(mulmod(mload(0x660), mload(0x3300), f_q), result, f_q) +result := addmod(mulmod(mload(0x6a0), mload(0x3320), f_q), result, f_q) +mstore(15840, result) + } +mstore(0x3e00, mulmod(mload(0x3de0), mload(0x3780), f_q)) +mstore(0x3e20, mulmod(sub(f_q, mload(0x3e00)), mload(0xa80), f_q)) +mstore(0x3e40, mulmod(1, mload(0xa80), f_q)) +mstore(0x3e60, addmod(mload(0x3dc0), mload(0x3e20), f_q)) +mstore(0x3e80, mulmod(mload(0x3e60), 1, f_q)) +mstore(0x3ea0, mulmod(mload(0x3e40), 1, f_q)) +mstore(0x3ec0, mulmod(1, mload(0x37a0), f_q)) { - let result := mulmod(mload(0xa00), mload(0x31e0), f_q) -mstore(15776, result) + let result := mulmod(mload(0x680), mload(0x33a0), f_q) +mstore(16096, result) } -mstore(0x3dc0, mulmod(mload(0x3da0), mload(0x3840), f_q)) -mstore(0x3de0, mulmod(sub(f_q, mload(0x3dc0)), mload(0xa40), f_q)) -mstore(0x3e00, mulmod(mload(0x3d00), mload(0xa40), f_q)) -mstore(0x3e20, addmod(mload(0x3d60), mload(0x3de0), f_q)) +mstore(0x3f00, mulmod(mload(0x3ee0), mload(0x3a00), f_q)) +mstore(0x3f20, mulmod(sub(f_q, mload(0x3f00)), 1, f_q)) +mstore(0x3f40, mulmod(mload(0x3ec0), 1, f_q)) { - let result := mulmod(mload(0x6a0), mload(0x31e0), f_q) -mstore(15936, result) + let result := mulmod(mload(0xa40), mload(0x33a0), f_q) +mstore(16224, result) } -mstore(0x3e60, mulmod(mload(0x3e40), mload(0x3840), f_q)) -mstore(0x3e80, mulmod(sub(f_q, mload(0x3e60)), mload(0x38c0), f_q)) -mstore(0x3ea0, mulmod(mload(0x3d00), mload(0x38c0), f_q)) -mstore(0x3ec0, addmod(mload(0x3e20), mload(0x3e80), f_q)) +mstore(0x3f80, mulmod(mload(0x3f60), mload(0x3a00), f_q)) +mstore(0x3fa0, mulmod(sub(f_q, mload(0x3f80)), mload(0xa80), f_q)) +mstore(0x3fc0, mulmod(mload(0x3ec0), mload(0xa80), f_q)) +mstore(0x3fe0, addmod(mload(0x3f20), mload(0x3fa0), f_q)) { - let result := mulmod(mload(0x6c0), mload(0x31e0), f_q) -mstore(16096, result) + let result := mulmod(mload(0x6e0), mload(0x33a0), f_q) +mstore(16384, result) } -mstore(0x3f00, mulmod(mload(0x3ee0), mload(0x3840), f_q)) -mstore(0x3f20, mulmod(sub(f_q, mload(0x3f00)), mload(0x38e0), f_q)) -mstore(0x3f40, mulmod(mload(0x3d00), mload(0x38e0), f_q)) -mstore(0x3f60, addmod(mload(0x3ec0), mload(0x3f20), f_q)) +mstore(0x4020, mulmod(mload(0x4000), mload(0x3a00), f_q)) +mstore(0x4040, mulmod(sub(f_q, mload(0x4020)), mload(0x3a80), f_q)) +mstore(0x4060, mulmod(mload(0x3ec0), mload(0x3a80), f_q)) +mstore(0x4080, addmod(mload(0x3fe0), mload(0x4040), f_q)) { - let result := mulmod(mload(0x6e0), mload(0x31e0), f_q) -mstore(16256, result) + let result := mulmod(mload(0x700), mload(0x33a0), f_q) +mstore(16544, result) } -mstore(0x3fa0, mulmod(mload(0x3f80), mload(0x3840), f_q)) -mstore(0x3fc0, mulmod(sub(f_q, mload(0x3fa0)), mload(0x3900), f_q)) -mstore(0x3fe0, mulmod(mload(0x3d00), mload(0x3900), f_q)) -mstore(0x4000, addmod(mload(0x3f60), mload(0x3fc0), f_q)) +mstore(0x40c0, mulmod(mload(0x40a0), mload(0x3a00), f_q)) +mstore(0x40e0, mulmod(sub(f_q, mload(0x40c0)), mload(0x3aa0), f_q)) +mstore(0x4100, mulmod(mload(0x3ec0), mload(0x3aa0), f_q)) +mstore(0x4120, addmod(mload(0x4080), mload(0x40e0), f_q)) { - let result := mulmod(mload(0x700), mload(0x31e0), f_q) -mstore(16416, result) + let result := mulmod(mload(0x720), mload(0x33a0), f_q) +mstore(16704, result) } -mstore(0x4040, mulmod(mload(0x4020), mload(0x3840), f_q)) -mstore(0x4060, mulmod(sub(f_q, mload(0x4040)), mload(0x3920), f_q)) -mstore(0x4080, mulmod(mload(0x3d00), mload(0x3920), f_q)) -mstore(0x40a0, addmod(mload(0x4000), mload(0x4060), f_q)) +mstore(0x4160, mulmod(mload(0x4140), mload(0x3a00), f_q)) +mstore(0x4180, mulmod(sub(f_q, mload(0x4160)), mload(0x3ac0), f_q)) +mstore(0x41a0, mulmod(mload(0x3ec0), mload(0x3ac0), f_q)) +mstore(0x41c0, addmod(mload(0x4120), mload(0x4180), f_q)) { - let result := mulmod(mload(0x720), mload(0x31e0), f_q) -mstore(16576, result) + let result := mulmod(mload(0x740), mload(0x33a0), f_q) +mstore(16864, result) } -mstore(0x40e0, mulmod(mload(0x40c0), mload(0x3840), f_q)) -mstore(0x4100, mulmod(sub(f_q, mload(0x40e0)), mload(0x3940), f_q)) -mstore(0x4120, mulmod(mload(0x3d00), mload(0x3940), f_q)) -mstore(0x4140, addmod(mload(0x40a0), mload(0x4100), f_q)) +mstore(0x4200, mulmod(mload(0x41e0), mload(0x3a00), f_q)) +mstore(0x4220, mulmod(sub(f_q, mload(0x4200)), mload(0x3ae0), f_q)) +mstore(0x4240, mulmod(mload(0x3ec0), mload(0x3ae0), f_q)) +mstore(0x4260, addmod(mload(0x41c0), mload(0x4220), f_q)) { - let result := mulmod(mload(0x740), mload(0x31e0), f_q) -mstore(16736, result) + let result := mulmod(mload(0x760), mload(0x33a0), f_q) +mstore(17024, result) } -mstore(0x4180, mulmod(mload(0x4160), mload(0x3840), f_q)) -mstore(0x41a0, mulmod(sub(f_q, mload(0x4180)), mload(0x3960), f_q)) -mstore(0x41c0, mulmod(mload(0x3d00), mload(0x3960), f_q)) -mstore(0x41e0, addmod(mload(0x4140), mload(0x41a0), f_q)) +mstore(0x42a0, mulmod(mload(0x4280), mload(0x3a00), f_q)) +mstore(0x42c0, mulmod(sub(f_q, mload(0x42a0)), mload(0x3b00), f_q)) +mstore(0x42e0, mulmod(mload(0x3ec0), mload(0x3b00), f_q)) +mstore(0x4300, addmod(mload(0x4260), mload(0x42c0), f_q)) { - let result := mulmod(mload(0x760), mload(0x31e0), f_q) -mstore(16896, result) + let result := mulmod(mload(0x780), mload(0x33a0), f_q) +mstore(17184, result) } -mstore(0x4220, mulmod(mload(0x4200), mload(0x3840), f_q)) -mstore(0x4240, mulmod(sub(f_q, mload(0x4220)), mload(0x3980), f_q)) -mstore(0x4260, mulmod(mload(0x3d00), mload(0x3980), f_q)) -mstore(0x4280, addmod(mload(0x41e0), mload(0x4240), f_q)) +mstore(0x4340, mulmod(mload(0x4320), mload(0x3a00), f_q)) +mstore(0x4360, mulmod(sub(f_q, mload(0x4340)), mload(0x3b20), f_q)) +mstore(0x4380, mulmod(mload(0x3ec0), mload(0x3b20), f_q)) +mstore(0x43a0, addmod(mload(0x4300), mload(0x4360), f_q)) { - let result := mulmod(mload(0x780), mload(0x31e0), f_q) -mstore(17056, result) + let result := mulmod(mload(0x7a0), mload(0x33a0), f_q) +mstore(17344, result) } -mstore(0x42c0, mulmod(mload(0x42a0), mload(0x3840), f_q)) -mstore(0x42e0, mulmod(sub(f_q, mload(0x42c0)), mload(0x39a0), f_q)) -mstore(0x4300, mulmod(mload(0x3d00), mload(0x39a0), f_q)) -mstore(0x4320, addmod(mload(0x4280), mload(0x42e0), f_q)) +mstore(0x43e0, mulmod(mload(0x43c0), mload(0x3a00), f_q)) +mstore(0x4400, mulmod(sub(f_q, mload(0x43e0)), mload(0x3b40), f_q)) +mstore(0x4420, mulmod(mload(0x3ec0), mload(0x3b40), f_q)) +mstore(0x4440, addmod(mload(0x43a0), mload(0x4400), f_q)) { - let result := mulmod(mload(0x7a0), mload(0x31e0), f_q) -mstore(17216, result) + let result := mulmod(mload(0x7c0), mload(0x33a0), f_q) +mstore(17504, result) } -mstore(0x4360, mulmod(mload(0x4340), mload(0x3840), f_q)) -mstore(0x4380, mulmod(sub(f_q, mload(0x4360)), mload(0x39c0), f_q)) -mstore(0x43a0, mulmod(mload(0x3d00), mload(0x39c0), f_q)) -mstore(0x43c0, addmod(mload(0x4320), mload(0x4380), f_q)) +mstore(0x4480, mulmod(mload(0x4460), mload(0x3a00), f_q)) +mstore(0x44a0, mulmod(sub(f_q, mload(0x4480)), mload(0x3b60), f_q)) +mstore(0x44c0, mulmod(mload(0x3ec0), mload(0x3b60), f_q)) +mstore(0x44e0, addmod(mload(0x4440), mload(0x44a0), f_q)) { - let result := mulmod(mload(0x7c0), mload(0x31e0), f_q) -mstore(17376, result) + let result := mulmod(mload(0x7e0), mload(0x33a0), f_q) +mstore(17664, result) } -mstore(0x4400, mulmod(mload(0x43e0), mload(0x3840), f_q)) -mstore(0x4420, mulmod(sub(f_q, mload(0x4400)), mload(0x39e0), f_q)) -mstore(0x4440, mulmod(mload(0x3d00), mload(0x39e0), f_q)) -mstore(0x4460, addmod(mload(0x43c0), mload(0x4420), f_q)) +mstore(0x4520, mulmod(mload(0x4500), mload(0x3a00), f_q)) +mstore(0x4540, mulmod(sub(f_q, mload(0x4520)), mload(0x3b80), f_q)) +mstore(0x4560, mulmod(mload(0x3ec0), mload(0x3b80), f_q)) +mstore(0x4580, addmod(mload(0x44e0), mload(0x4540), f_q)) { - let result := mulmod(mload(0x7e0), mload(0x31e0), f_q) -mstore(17536, result) + let result := mulmod(mload(0x800), mload(0x33a0), f_q) +mstore(17824, result) } -mstore(0x44a0, mulmod(mload(0x4480), mload(0x3840), f_q)) -mstore(0x44c0, mulmod(sub(f_q, mload(0x44a0)), mload(0x3a00), f_q)) -mstore(0x44e0, mulmod(mload(0x3d00), mload(0x3a00), f_q)) -mstore(0x4500, addmod(mload(0x4460), mload(0x44c0), f_q)) +mstore(0x45c0, mulmod(mload(0x45a0), mload(0x3a00), f_q)) +mstore(0x45e0, mulmod(sub(f_q, mload(0x45c0)), mload(0x3ba0), f_q)) +mstore(0x4600, mulmod(mload(0x3ec0), mload(0x3ba0), f_q)) +mstore(0x4620, addmod(mload(0x4580), mload(0x45e0), f_q)) { - let result := mulmod(mload(0x820), mload(0x31e0), f_q) -mstore(17696, result) + let result := mulmod(mload(0x820), mload(0x33a0), f_q) +mstore(17984, result) } -mstore(0x4540, mulmod(mload(0x4520), mload(0x3840), f_q)) -mstore(0x4560, mulmod(sub(f_q, mload(0x4540)), mload(0x3a20), f_q)) -mstore(0x4580, mulmod(mload(0x3d00), mload(0x3a20), f_q)) -mstore(0x45a0, addmod(mload(0x4500), mload(0x4560), f_q)) +mstore(0x4660, mulmod(mload(0x4640), mload(0x3a00), f_q)) +mstore(0x4680, mulmod(sub(f_q, mload(0x4660)), mload(0x3bc0), f_q)) +mstore(0x46a0, mulmod(mload(0x3ec0), mload(0x3bc0), f_q)) +mstore(0x46c0, addmod(mload(0x4620), mload(0x4680), f_q)) { - let result := mulmod(mload(0x840), mload(0x31e0), f_q) -mstore(17856, result) + let result := mulmod(mload(0x860), mload(0x33a0), f_q) +mstore(18144, result) } -mstore(0x45e0, mulmod(mload(0x45c0), mload(0x3840), f_q)) -mstore(0x4600, mulmod(sub(f_q, mload(0x45e0)), mload(0x3a40), f_q)) -mstore(0x4620, mulmod(mload(0x3d00), mload(0x3a40), f_q)) -mstore(0x4640, addmod(mload(0x45a0), mload(0x4600), f_q)) +mstore(0x4700, mulmod(mload(0x46e0), mload(0x3a00), f_q)) +mstore(0x4720, mulmod(sub(f_q, mload(0x4700)), mload(0x3be0), f_q)) +mstore(0x4740, mulmod(mload(0x3ec0), mload(0x3be0), f_q)) +mstore(0x4760, addmod(mload(0x46c0), mload(0x4720), f_q)) { - let result := mulmod(mload(0x860), mload(0x31e0), f_q) -mstore(18016, result) + let result := mulmod(mload(0x880), mload(0x33a0), f_q) +mstore(18304, result) } -mstore(0x4680, mulmod(mload(0x4660), mload(0x3840), f_q)) -mstore(0x46a0, mulmod(sub(f_q, mload(0x4680)), mload(0x3a60), f_q)) -mstore(0x46c0, mulmod(mload(0x3d00), mload(0x3a60), f_q)) -mstore(0x46e0, addmod(mload(0x4640), mload(0x46a0), f_q)) +mstore(0x47a0, mulmod(mload(0x4780), mload(0x3a00), f_q)) +mstore(0x47c0, mulmod(sub(f_q, mload(0x47a0)), mload(0x3c00), f_q)) +mstore(0x47e0, mulmod(mload(0x3ec0), mload(0x3c00), f_q)) +mstore(0x4800, addmod(mload(0x4760), mload(0x47c0), f_q)) { - let result := mulmod(mload(0x880), mload(0x31e0), f_q) -mstore(18176, result) + let result := mulmod(mload(0x8a0), mload(0x33a0), f_q) +mstore(18464, result) } -mstore(0x4720, mulmod(mload(0x4700), mload(0x3840), f_q)) -mstore(0x4740, mulmod(sub(f_q, mload(0x4720)), mload(0x3a80), f_q)) -mstore(0x4760, mulmod(mload(0x3d00), mload(0x3a80), f_q)) -mstore(0x4780, addmod(mload(0x46e0), mload(0x4740), f_q)) +mstore(0x4840, mulmod(mload(0x4820), mload(0x3a00), f_q)) +mstore(0x4860, mulmod(sub(f_q, mload(0x4840)), mload(0x3c20), f_q)) +mstore(0x4880, mulmod(mload(0x3ec0), mload(0x3c20), f_q)) +mstore(0x48a0, addmod(mload(0x4800), mload(0x4860), f_q)) { - let result := mulmod(mload(0x8a0), mload(0x31e0), f_q) -mstore(18336, result) + let result := mulmod(mload(0x8c0), mload(0x33a0), f_q) +mstore(18624, result) } -mstore(0x47c0, mulmod(mload(0x47a0), mload(0x3840), f_q)) -mstore(0x47e0, mulmod(sub(f_q, mload(0x47c0)), mload(0x3aa0), f_q)) -mstore(0x4800, mulmod(mload(0x3d00), mload(0x3aa0), f_q)) -mstore(0x4820, addmod(mload(0x4780), mload(0x47e0), f_q)) +mstore(0x48e0, mulmod(mload(0x48c0), mload(0x3a00), f_q)) +mstore(0x4900, mulmod(sub(f_q, mload(0x48e0)), mload(0x3c40), f_q)) +mstore(0x4920, mulmod(mload(0x3ec0), mload(0x3c40), f_q)) +mstore(0x4940, addmod(mload(0x48a0), mload(0x4900), f_q)) { - let result := mulmod(mload(0x8c0), mload(0x31e0), f_q) -mstore(18496, result) - } -mstore(0x4860, mulmod(mload(0x4840), mload(0x3840), f_q)) -mstore(0x4880, mulmod(sub(f_q, mload(0x4860)), mload(0x3ac0), f_q)) -mstore(0x48a0, mulmod(mload(0x3d00), mload(0x3ac0), f_q)) -mstore(0x48c0, addmod(mload(0x4820), mload(0x4880), f_q)) -mstore(0x48e0, mulmod(mload(0x2f60), mload(0x35e0), f_q)) -mstore(0x4900, mulmod(mload(0x2f80), mload(0x35e0), f_q)) -mstore(0x4920, mulmod(mload(0x2fa0), mload(0x35e0), f_q)) -mstore(0x4940, mulmod(mload(0x2fc0), mload(0x35e0), f_q)) -{ - let result := mulmod(mload(0x2fe0), mload(0x31e0), f_q) + let result := mulmod(mload(0x8e0), mload(0x33a0), f_q) mstore(18784, result) } -mstore(0x4980, mulmod(mload(0x4960), mload(0x3840), f_q)) -mstore(0x49a0, mulmod(sub(f_q, mload(0x4980)), mload(0x3ae0), f_q)) -mstore(0x49c0, mulmod(mload(0x3d00), mload(0x3ae0), f_q)) -mstore(0x49e0, mulmod(mload(0x48e0), mload(0x3ae0), f_q)) -mstore(0x4a00, mulmod(mload(0x4900), mload(0x3ae0), f_q)) -mstore(0x4a20, mulmod(mload(0x4920), mload(0x3ae0), f_q)) -mstore(0x4a40, mulmod(mload(0x4940), mload(0x3ae0), f_q)) -mstore(0x4a60, addmod(mload(0x48c0), mload(0x49a0), f_q)) +mstore(0x4980, mulmod(mload(0x4960), mload(0x3a00), f_q)) +mstore(0x49a0, mulmod(sub(f_q, mload(0x4980)), mload(0x3c60), f_q)) +mstore(0x49c0, mulmod(mload(0x3ec0), mload(0x3c60), f_q)) +mstore(0x49e0, addmod(mload(0x4940), mload(0x49a0), f_q)) { - let result := mulmod(mload(0x800), mload(0x31e0), f_q) -mstore(19072, result) - } -mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x3840), f_q)) -mstore(0x4ac0, mulmod(sub(f_q, mload(0x4aa0)), mload(0x3b00), f_q)) -mstore(0x4ae0, mulmod(mload(0x3d00), mload(0x3b00), f_q)) -mstore(0x4b00, addmod(mload(0x4a60), mload(0x4ac0), f_q)) -mstore(0x4b20, mulmod(mload(0x4b00), mload(0xaa0), f_q)) -mstore(0x4b40, mulmod(mload(0x3d80), mload(0xaa0), f_q)) -mstore(0x4b60, mulmod(mload(0x3e00), mload(0xaa0), f_q)) -mstore(0x4b80, mulmod(mload(0x3ea0), mload(0xaa0), f_q)) -mstore(0x4ba0, mulmod(mload(0x3f40), mload(0xaa0), f_q)) -mstore(0x4bc0, mulmod(mload(0x3fe0), mload(0xaa0), f_q)) -mstore(0x4be0, mulmod(mload(0x4080), mload(0xaa0), f_q)) -mstore(0x4c00, mulmod(mload(0x4120), mload(0xaa0), f_q)) -mstore(0x4c20, mulmod(mload(0x41c0), mload(0xaa0), f_q)) -mstore(0x4c40, mulmod(mload(0x4260), mload(0xaa0), f_q)) -mstore(0x4c60, mulmod(mload(0x4300), mload(0xaa0), f_q)) -mstore(0x4c80, mulmod(mload(0x43a0), mload(0xaa0), f_q)) -mstore(0x4ca0, mulmod(mload(0x4440), mload(0xaa0), f_q)) -mstore(0x4cc0, mulmod(mload(0x44e0), mload(0xaa0), f_q)) -mstore(0x4ce0, mulmod(mload(0x4580), mload(0xaa0), f_q)) -mstore(0x4d00, mulmod(mload(0x4620), mload(0xaa0), f_q)) -mstore(0x4d20, mulmod(mload(0x46c0), mload(0xaa0), f_q)) -mstore(0x4d40, mulmod(mload(0x4760), mload(0xaa0), f_q)) -mstore(0x4d60, mulmod(mload(0x4800), mload(0xaa0), f_q)) -mstore(0x4d80, mulmod(mload(0x48a0), mload(0xaa0), f_q)) -mstore(0x4da0, mulmod(mload(0x49c0), mload(0xaa0), f_q)) -mstore(0x4dc0, mulmod(mload(0x49e0), mload(0xaa0), f_q)) -mstore(0x4de0, mulmod(mload(0x4a00), mload(0xaa0), f_q)) -mstore(0x4e00, mulmod(mload(0x4a20), mload(0xaa0), f_q)) -mstore(0x4e20, mulmod(mload(0x4a40), mload(0xaa0), f_q)) -mstore(0x4e40, mulmod(mload(0x4ae0), mload(0xaa0), f_q)) -mstore(0x4e60, addmod(mload(0x3cc0), mload(0x4b20), f_q)) -mstore(0x4e80, mulmod(1, mload(0x3620), f_q)) + let result := mulmod(mload(0x900), mload(0x33a0), f_q) +mstore(18944, result) + } +mstore(0x4a20, mulmod(mload(0x4a00), mload(0x3a00), f_q)) +mstore(0x4a40, mulmod(sub(f_q, mload(0x4a20)), mload(0x3c80), f_q)) +mstore(0x4a60, mulmod(mload(0x3ec0), mload(0x3c80), f_q)) +mstore(0x4a80, addmod(mload(0x49e0), mload(0x4a40), f_q)) +mstore(0x4aa0, mulmod(mload(0x3120), mload(0x37a0), f_q)) +mstore(0x4ac0, mulmod(mload(0x3140), mload(0x37a0), f_q)) +mstore(0x4ae0, mulmod(mload(0x3160), mload(0x37a0), f_q)) +mstore(0x4b00, mulmod(mload(0x3180), mload(0x37a0), f_q)) { - let result := mulmod(mload(0x8e0), mload(0x3200), f_q) -result := addmod(mulmod(mload(0x900), mload(0x3220), f_q), result, f_q) -result := addmod(mulmod(mload(0x920), mload(0x3240), f_q), result, f_q) -mstore(20128, result) - } -mstore(0x4ec0, mulmod(mload(0x4ea0), mload(0x3860), f_q)) -mstore(0x4ee0, mulmod(sub(f_q, mload(0x4ec0)), 1, f_q)) -mstore(0x4f00, mulmod(mload(0x4e80), 1, f_q)) -mstore(0x4f20, mulmod(mload(0x4ee0), mload(0x3b40), f_q)) -mstore(0x4f40, mulmod(mload(0x4f00), mload(0x3b40), f_q)) -mstore(0x4f60, addmod(mload(0x4e60), mload(0x4f20), f_q)) -mstore(0x4f80, mulmod(1, mload(0x3660), f_q)) + let result := mulmod(mload(0x31a0), mload(0x33a0), f_q) +mstore(19232, result) + } +mstore(0x4b40, mulmod(mload(0x4b20), mload(0x3a00), f_q)) +mstore(0x4b60, mulmod(sub(f_q, mload(0x4b40)), mload(0x3ca0), f_q)) +mstore(0x4b80, mulmod(mload(0x3ec0), mload(0x3ca0), f_q)) +mstore(0x4ba0, mulmod(mload(0x4aa0), mload(0x3ca0), f_q)) +mstore(0x4bc0, mulmod(mload(0x4ac0), mload(0x3ca0), f_q)) +mstore(0x4be0, mulmod(mload(0x4ae0), mload(0x3ca0), f_q)) +mstore(0x4c00, mulmod(mload(0x4b00), mload(0x3ca0), f_q)) +mstore(0x4c20, addmod(mload(0x4a80), mload(0x4b60), f_q)) { - let result := mulmod(mload(0x940), mload(0x3280), f_q) -result := addmod(mulmod(mload(0x960), mload(0x32a0), f_q), result, f_q) -mstore(20384, result) - } -mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x3880), f_q)) -mstore(0x4fe0, mulmod(sub(f_q, mload(0x4fc0)), 1, f_q)) -mstore(0x5000, mulmod(mload(0x4f80), 1, f_q)) + let result := mulmod(mload(0x840), mload(0x33a0), f_q) +mstore(19520, result) + } +mstore(0x4c60, mulmod(mload(0x4c40), mload(0x3a00), f_q)) +mstore(0x4c80, mulmod(sub(f_q, mload(0x4c60)), mload(0x3cc0), f_q)) +mstore(0x4ca0, mulmod(mload(0x3ec0), mload(0x3cc0), f_q)) +mstore(0x4cc0, addmod(mload(0x4c20), mload(0x4c80), f_q)) +mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0xae0), f_q)) +mstore(0x4d00, mulmod(mload(0x3f40), mload(0xae0), f_q)) +mstore(0x4d20, mulmod(mload(0x3fc0), mload(0xae0), f_q)) +mstore(0x4d40, mulmod(mload(0x4060), mload(0xae0), f_q)) +mstore(0x4d60, mulmod(mload(0x4100), mload(0xae0), f_q)) +mstore(0x4d80, mulmod(mload(0x41a0), mload(0xae0), f_q)) +mstore(0x4da0, mulmod(mload(0x4240), mload(0xae0), f_q)) +mstore(0x4dc0, mulmod(mload(0x42e0), mload(0xae0), f_q)) +mstore(0x4de0, mulmod(mload(0x4380), mload(0xae0), f_q)) +mstore(0x4e00, mulmod(mload(0x4420), mload(0xae0), f_q)) +mstore(0x4e20, mulmod(mload(0x44c0), mload(0xae0), f_q)) +mstore(0x4e40, mulmod(mload(0x4560), mload(0xae0), f_q)) +mstore(0x4e60, mulmod(mload(0x4600), mload(0xae0), f_q)) +mstore(0x4e80, mulmod(mload(0x46a0), mload(0xae0), f_q)) +mstore(0x4ea0, mulmod(mload(0x4740), mload(0xae0), f_q)) +mstore(0x4ec0, mulmod(mload(0x47e0), mload(0xae0), f_q)) +mstore(0x4ee0, mulmod(mload(0x4880), mload(0xae0), f_q)) +mstore(0x4f00, mulmod(mload(0x4920), mload(0xae0), f_q)) +mstore(0x4f20, mulmod(mload(0x49c0), mload(0xae0), f_q)) +mstore(0x4f40, mulmod(mload(0x4a60), mload(0xae0), f_q)) +mstore(0x4f60, mulmod(mload(0x4b80), mload(0xae0), f_q)) +mstore(0x4f80, mulmod(mload(0x4ba0), mload(0xae0), f_q)) +mstore(0x4fa0, mulmod(mload(0x4bc0), mload(0xae0), f_q)) +mstore(0x4fc0, mulmod(mload(0x4be0), mload(0xae0), f_q)) +mstore(0x4fe0, mulmod(mload(0x4c00), mload(0xae0), f_q)) +mstore(0x5000, mulmod(mload(0x4ca0), mload(0xae0), f_q)) +mstore(0x5020, addmod(mload(0x3e80), mload(0x4ce0), f_q)) +mstore(0x5040, mulmod(1, mload(0x37e0), f_q)) { - let result := mulmod(mload(0x980), mload(0x3280), f_q) -result := addmod(mulmod(mload(0x9a0), mload(0x32a0), f_q), result, f_q) -mstore(20512, result) - } -mstore(0x5040, mulmod(mload(0x5020), mload(0x3880), f_q)) -mstore(0x5060, mulmod(sub(f_q, mload(0x5040)), mload(0xa40), f_q)) -mstore(0x5080, mulmod(mload(0x4f80), mload(0xa40), f_q)) -mstore(0x50a0, addmod(mload(0x4fe0), mload(0x5060), f_q)) -mstore(0x50c0, mulmod(mload(0x50a0), mload(0x3b60), f_q)) -mstore(0x50e0, mulmod(mload(0x5000), mload(0x3b60), f_q)) -mstore(0x5100, mulmod(mload(0x5080), mload(0x3b60), f_q)) -mstore(0x5120, addmod(mload(0x4f60), mload(0x50c0), f_q)) -mstore(0x5140, mulmod(1, mload(0x36a0), f_q)) + let result := mulmod(mload(0x920), mload(0x33c0), f_q) +result := addmod(mulmod(mload(0x940), mload(0x33e0), f_q), result, f_q) +result := addmod(mulmod(mload(0x960), mload(0x3400), f_q), result, f_q) +mstore(20576, result) + } +mstore(0x5080, mulmod(mload(0x5060), mload(0x3a20), f_q)) +mstore(0x50a0, mulmod(sub(f_q, mload(0x5080)), 1, f_q)) +mstore(0x50c0, mulmod(mload(0x5040), 1, f_q)) +mstore(0x50e0, mulmod(mload(0x50a0), mload(0x3d00), f_q)) +mstore(0x5100, mulmod(mload(0x50c0), mload(0x3d00), f_q)) +mstore(0x5120, addmod(mload(0x5020), mload(0x50e0), f_q)) +mstore(0x5140, mulmod(1, mload(0x3820), f_q)) { - let result := mulmod(mload(0x9c0), mload(0x32c0), f_q) -result := addmod(mulmod(mload(0x9e0), mload(0x32e0), f_q), result, f_q) + let result := mulmod(mload(0x980), mload(0x3440), f_q) +result := addmod(mulmod(mload(0x9a0), mload(0x3460), f_q), result, f_q) mstore(20832, result) } -mstore(0x5180, mulmod(mload(0x5160), mload(0x38a0), f_q)) +mstore(0x5180, mulmod(mload(0x5160), mload(0x3a40), f_q)) mstore(0x51a0, mulmod(sub(f_q, mload(0x5180)), 1, f_q)) mstore(0x51c0, mulmod(mload(0x5140), 1, f_q)) -mstore(0x51e0, mulmod(mload(0x51a0), mload(0x3b80), f_q)) -mstore(0x5200, mulmod(mload(0x51c0), mload(0x3b80), f_q)) -mstore(0x5220, addmod(mload(0x5120), mload(0x51e0), f_q)) -mstore(0x5240, mulmod(1, mload(0x31c0), f_q)) -mstore(0x5260, mulmod(1, mload(0xb40), f_q)) -mstore(0x5280, 0x0000000000000000000000000000000000000000000000000000000000000001) - mstore(0x52a0, 0x0000000000000000000000000000000000000000000000000000000000000002) -mstore(0x52c0, mload(0x5220)) -success := and(eq(staticcall(gas(), 0x7, 0x5280, 0x60, 0x5280, 0x40), 1), success) -mstore(0x52e0, mload(0x5280)) - mstore(0x5300, mload(0x52a0)) -mstore(0x5320, mload(0x60)) - mstore(0x5340, mload(0x80)) -success := and(eq(staticcall(gas(), 0x6, 0x52e0, 0x80, 0x52e0, 0x40), 1), success) -mstore(0x5360, mload(0xa0)) - mstore(0x5380, mload(0xc0)) -mstore(0x53a0, mload(0x3ce0)) -success := and(eq(staticcall(gas(), 0x7, 0x5360, 0x60, 0x5360, 0x40), 1), success) -mstore(0x53c0, mload(0x52e0)) - mstore(0x53e0, mload(0x5300)) -mstore(0x5400, mload(0x5360)) - mstore(0x5420, mload(0x5380)) -success := and(eq(staticcall(gas(), 0x6, 0x53c0, 0x80, 0x53c0, 0x40), 1), success) -mstore(0x5440, mload(0xe0)) - mstore(0x5460, mload(0x100)) -mstore(0x5480, mload(0x4b40)) +{ + let result := mulmod(mload(0x9c0), mload(0x3440), f_q) +result := addmod(mulmod(mload(0x9e0), mload(0x3460), f_q), result, f_q) +mstore(20960, result) + } +mstore(0x5200, mulmod(mload(0x51e0), mload(0x3a40), f_q)) +mstore(0x5220, mulmod(sub(f_q, mload(0x5200)), mload(0xa80), f_q)) +mstore(0x5240, mulmod(mload(0x5140), mload(0xa80), f_q)) +mstore(0x5260, addmod(mload(0x51a0), mload(0x5220), f_q)) +mstore(0x5280, mulmod(mload(0x5260), mload(0x3d20), f_q)) +mstore(0x52a0, mulmod(mload(0x51c0), mload(0x3d20), f_q)) +mstore(0x52c0, mulmod(mload(0x5240), mload(0x3d20), f_q)) +mstore(0x52e0, addmod(mload(0x5120), mload(0x5280), f_q)) +mstore(0x5300, mulmod(1, mload(0x3860), f_q)) +{ + let result := mulmod(mload(0xa00), mload(0x3480), f_q) +result := addmod(mulmod(mload(0xa20), mload(0x34a0), f_q), result, f_q) +mstore(21280, result) + } +mstore(0x5340, mulmod(mload(0x5320), mload(0x3a60), f_q)) +mstore(0x5360, mulmod(sub(f_q, mload(0x5340)), 1, f_q)) +mstore(0x5380, mulmod(mload(0x5300), 1, f_q)) +mstore(0x53a0, mulmod(mload(0x5360), mload(0x3d40), f_q)) +mstore(0x53c0, mulmod(mload(0x5380), mload(0x3d40), f_q)) +mstore(0x53e0, addmod(mload(0x52e0), mload(0x53a0), f_q)) +mstore(0x5400, mulmod(1, mload(0x3380), f_q)) +mstore(0x5420, mulmod(1, mload(0xb80), f_q)) +mstore(0x5440, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x5460, 0x0000000000000000000000000000000000000000000000000000000000000002) +mstore(0x5480, mload(0x53e0)) success := and(eq(staticcall(gas(), 0x7, 0x5440, 0x60, 0x5440, 0x40), 1), success) -mstore(0x54a0, mload(0x53c0)) - mstore(0x54c0, mload(0x53e0)) -mstore(0x54e0, mload(0x5440)) - mstore(0x5500, mload(0x5460)) +mstore(0x54a0, mload(0x5440)) + mstore(0x54c0, mload(0x5460)) +mstore(0x54e0, mload(0xa0)) + mstore(0x5500, mload(0xc0)) success := and(eq(staticcall(gas(), 0x6, 0x54a0, 0x80, 0x54a0, 0x40), 1), success) -mstore(0x5520, mload(0x1c0)) - mstore(0x5540, mload(0x1e0)) -mstore(0x5560, mload(0x4b60)) +mstore(0x5520, mload(0xe0)) + mstore(0x5540, mload(0x100)) +mstore(0x5560, mload(0x3ea0)) success := and(eq(staticcall(gas(), 0x7, 0x5520, 0x60, 0x5520, 0x40), 1), success) mstore(0x5580, mload(0x54a0)) mstore(0x55a0, mload(0x54c0)) mstore(0x55c0, mload(0x5520)) mstore(0x55e0, mload(0x5540)) success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) -mstore(0x5600, 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) - mstore(0x5620, 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc) -mstore(0x5640, mload(0x4b80)) +mstore(0x5600, mload(0x120)) + mstore(0x5620, mload(0x140)) +mstore(0x5640, mload(0x4d00)) success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) mstore(0x5660, mload(0x5580)) mstore(0x5680, mload(0x55a0)) mstore(0x56a0, mload(0x5600)) mstore(0x56c0, mload(0x5620)) success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) -mstore(0x56e0, 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) - mstore(0x5700, 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51) -mstore(0x5720, mload(0x4ba0)) +mstore(0x56e0, mload(0x200)) + mstore(0x5700, mload(0x220)) +mstore(0x5720, mload(0x4d20)) success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) mstore(0x5740, mload(0x5660)) mstore(0x5760, mload(0x5680)) mstore(0x5780, mload(0x56e0)) mstore(0x57a0, mload(0x5700)) success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) -mstore(0x57c0, 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) - mstore(0x57e0, 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83) -mstore(0x5800, mload(0x4bc0)) +mstore(0x57c0, 0x299b12e65399dcea3f1e0ce046cf5f93ce7ba9f779bfa39e7f0c6d4c19628a90) + mstore(0x57e0, 0x21c577122a3d1f4d019b93e724d981b0653ed94f492eafec50945231935f9a95) +mstore(0x5800, mload(0x4d40)) success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) mstore(0x5820, mload(0x5740)) mstore(0x5840, mload(0x5760)) mstore(0x5860, mload(0x57c0)) mstore(0x5880, mload(0x57e0)) success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) -mstore(0x58a0, 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) - mstore(0x58c0, 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43) -mstore(0x58e0, mload(0x4be0)) +mstore(0x58a0, 0x19d9220141bef25921d474c6e634d06dfb7d7904e59a4ec486a148b00bfd38a3) + mstore(0x58c0, 0x2f38511e53688056b693c84ef69a7ae2b9ab482906dc46ae9d9522fd3ce098b6) +mstore(0x58e0, mload(0x4d60)) success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) mstore(0x5900, mload(0x5820)) mstore(0x5920, mload(0x5840)) mstore(0x5940, mload(0x58a0)) mstore(0x5960, mload(0x58c0)) success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) -mstore(0x5980, 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) - mstore(0x59a0, 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0) -mstore(0x59c0, mload(0x4c00)) +mstore(0x5980, 0x17e7cb6a30c4ce9a3d8de604dbaf517b1f23e440acb9e7345938ff5b245a403e) + mstore(0x59a0, 0x1c31a42d7da360cce8262e21fb9a5ef26a23ebbcf6995ccab89aee400c2e994b) +mstore(0x59c0, mload(0x4d80)) success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) mstore(0x59e0, mload(0x5900)) mstore(0x5a00, mload(0x5920)) mstore(0x5a20, mload(0x5980)) mstore(0x5a40, mload(0x59a0)) success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) -mstore(0x5a60, 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) - mstore(0x5a80, 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf) -mstore(0x5aa0, mload(0x4c20)) +mstore(0x5a60, 0x05591c7faa2c9eaf1c9573a84bddec303219abf496af0899ed438853227dd056) + mstore(0x5a80, 0x2cfa24fde576750b4036dffe40105e6b7244f63843ec74d9d0aad48ba413287c) +mstore(0x5aa0, mload(0x4da0)) success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) mstore(0x5ac0, mload(0x59e0)) mstore(0x5ae0, mload(0x5a00)) mstore(0x5b00, mload(0x5a60)) mstore(0x5b20, mload(0x5a80)) success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) -mstore(0x5b40, 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) - mstore(0x5b60, 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2) -mstore(0x5b80, mload(0x4c40)) +mstore(0x5b40, 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) + mstore(0x5b60, 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0) +mstore(0x5b80, mload(0x4dc0)) success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) mstore(0x5ba0, mload(0x5ac0)) mstore(0x5bc0, mload(0x5ae0)) mstore(0x5be0, mload(0x5b40)) mstore(0x5c00, mload(0x5b60)) success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) -mstore(0x5c20, 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) - mstore(0x5c40, 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890) -mstore(0x5c60, mload(0x4c60)) +mstore(0x5c20, 0x19206bebc5cc4a5b692c58bc61e7aec6d3fbb8344e39a133699f74e6f40ec2a8) + mstore(0x5c40, 0x0678c7bdd141bd26cbe9336f5dcf1c5a8cf21a5927afd1b2f393152ee02a6a78) +mstore(0x5c60, mload(0x4de0)) success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) mstore(0x5c80, mload(0x5ba0)) mstore(0x5ca0, mload(0x5bc0)) mstore(0x5cc0, mload(0x5c20)) mstore(0x5ce0, mload(0x5c40)) success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) -mstore(0x5d00, 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) - mstore(0x5d20, 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d) -mstore(0x5d40, mload(0x4c80)) +mstore(0x5d00, 0x1c6e2343333783b4f48ae7d2681afb3cdf6a4dfbc83a500cb06db3265ad3e5d5) + mstore(0x5d20, 0x1a3d836d4325ff30144c1e2038a4d4025fd0f01af24cfd8dfd54018e64f3b098) +mstore(0x5d40, mload(0x4e00)) success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) mstore(0x5d60, mload(0x5c80)) mstore(0x5d80, mload(0x5ca0)) mstore(0x5da0, mload(0x5d00)) mstore(0x5dc0, mload(0x5d20)) success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) -mstore(0x5de0, 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) - mstore(0x5e00, 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68) -mstore(0x5e20, mload(0x4ca0)) +mstore(0x5de0, 0x203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b) + mstore(0x5e00, 0x04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097) +mstore(0x5e20, mload(0x4e20)) success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) mstore(0x5e40, mload(0x5d60)) mstore(0x5e60, mload(0x5d80)) mstore(0x5e80, mload(0x5de0)) mstore(0x5ea0, mload(0x5e00)) success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) -mstore(0x5ec0, 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) - mstore(0x5ee0, 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a) -mstore(0x5f00, mload(0x4cc0)) +mstore(0x5ec0, 0x20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91) + mstore(0x5ee0, 0x2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd) +mstore(0x5f00, mload(0x4e40)) success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) mstore(0x5f20, mload(0x5e40)) mstore(0x5f40, mload(0x5e60)) mstore(0x5f60, mload(0x5ec0)) mstore(0x5f80, mload(0x5ee0)) success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) -mstore(0x5fa0, 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) - mstore(0x5fc0, 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6) -mstore(0x5fe0, mload(0x4ce0)) +mstore(0x5fa0, 0x09e3303245e3b00aca894e9fba3d5184ff3739c664e363f205d42feee327b6aa) + mstore(0x5fc0, 0x13ce92283cc6f648bdda86182d91852aab5c6088ab008d9cdb5522fcbf5c6289) +mstore(0x5fe0, mload(0x4e60)) success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) mstore(0x6000, mload(0x5f20)) mstore(0x6020, mload(0x5f40)) mstore(0x6040, mload(0x5fa0)) mstore(0x6060, mload(0x5fc0)) success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) -mstore(0x6080, 0x2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e) - mstore(0x60a0, 0x2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf4407) -mstore(0x60c0, mload(0x4d00)) +mstore(0x6080, 0x08a503e7a16684a81991dbfc5ec84c9f4b0f7a506ddf26b67d305ebfc0f81743) + mstore(0x60a0, 0x08a2d8e1760ffb16f70147f8b44e781ced65a1e677a786cdd8bc9f947b36131c) +mstore(0x60c0, mload(0x4e80)) success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) mstore(0x60e0, mload(0x6000)) mstore(0x6100, mload(0x6020)) mstore(0x6120, mload(0x6080)) mstore(0x6140, mload(0x60a0)) success := and(eq(staticcall(gas(), 0x6, 0x60e0, 0x80, 0x60e0, 0x40), 1), success) -mstore(0x6160, 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) - mstore(0x6180, 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28) -mstore(0x61a0, mload(0x4d20)) +mstore(0x6160, 0x25632bc8012c6cbc6ddda661a9729f544c54620700c3840c01ca5b57e61a1ffe) + mstore(0x6180, 0x2ba5764c663a4b2892343c303da0f5664e3f620dd6b851a711781704292fd11a) +mstore(0x61a0, mload(0x4ea0)) success := and(eq(staticcall(gas(), 0x7, 0x6160, 0x60, 0x6160, 0x40), 1), success) mstore(0x61c0, mload(0x60e0)) mstore(0x61e0, mload(0x6100)) mstore(0x6200, mload(0x6160)) mstore(0x6220, mload(0x6180)) success := and(eq(staticcall(gas(), 0x6, 0x61c0, 0x80, 0x61c0, 0x40), 1), success) -mstore(0x6240, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) - mstore(0x6260, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) -mstore(0x6280, mload(0x4d40)) +mstore(0x6240, 0x07cfe4f3152b1996e8eafd718451356c2044e4c239fcc29eb3a81d392e1b44ad) + mstore(0x6260, 0x255673e224a594e53fd5b1b4dcd46329e72a04e16056dea3d5a17e31291a9960) +mstore(0x6280, mload(0x4ec0)) success := and(eq(staticcall(gas(), 0x7, 0x6240, 0x60, 0x6240, 0x40), 1), success) mstore(0x62a0, mload(0x61c0)) mstore(0x62c0, mload(0x61e0)) mstore(0x62e0, mload(0x6240)) mstore(0x6300, mload(0x6260)) success := and(eq(staticcall(gas(), 0x6, 0x62a0, 0x80, 0x62a0, 0x40), 1), success) -mstore(0x6320, 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) - mstore(0x6340, 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56) -mstore(0x6360, mload(0x4d60)) +mstore(0x6320, 0x136cb14b351f3b43b5e618c5c49022588edd48550f4e7d69309442e8b83d0d22) + mstore(0x6340, 0x0ee9bbdfce93815e79aabfc5ec92a52346c46a45e17bc5bc9ad8155e982c9cac) +mstore(0x6360, mload(0x4ee0)) success := and(eq(staticcall(gas(), 0x7, 0x6320, 0x60, 0x6320, 0x40), 1), success) mstore(0x6380, mload(0x62a0)) mstore(0x63a0, mload(0x62c0)) mstore(0x63c0, mload(0x6320)) mstore(0x63e0, mload(0x6340)) success := and(eq(staticcall(gas(), 0x6, 0x6380, 0x80, 0x6380, 0x40), 1), success) -mstore(0x6400, 0x2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d) - mstore(0x6420, 0x13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69) -mstore(0x6440, mload(0x4d80)) +mstore(0x6400, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) + mstore(0x6420, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) +mstore(0x6440, mload(0x4f00)) success := and(eq(staticcall(gas(), 0x7, 0x6400, 0x60, 0x6400, 0x40), 1), success) mstore(0x6460, mload(0x6380)) mstore(0x6480, mload(0x63a0)) mstore(0x64a0, mload(0x6400)) mstore(0x64c0, mload(0x6420)) success := and(eq(staticcall(gas(), 0x6, 0x6460, 0x80, 0x6460, 0x40), 1), success) -mstore(0x64e0, mload(0x420)) - mstore(0x6500, mload(0x440)) -mstore(0x6520, mload(0x4da0)) +mstore(0x64e0, 0x1f5d69f8adc7def353cac5301331f66a6aa12c3bdc46ba8509d81c1922944c1e) + mstore(0x6500, 0x050a358c8ee74901afd6bebdda35a25be99ba631232abec0bb7df23428e219eb) +mstore(0x6520, mload(0x4f20)) success := and(eq(staticcall(gas(), 0x7, 0x64e0, 0x60, 0x64e0, 0x40), 1), success) mstore(0x6540, mload(0x6460)) mstore(0x6560, mload(0x6480)) mstore(0x6580, mload(0x64e0)) mstore(0x65a0, mload(0x6500)) success := and(eq(staticcall(gas(), 0x6, 0x6540, 0x80, 0x6540, 0x40), 1), success) -mstore(0x65c0, mload(0x460)) - mstore(0x65e0, mload(0x480)) -mstore(0x6600, mload(0x4dc0)) +mstore(0x65c0, 0x1ddbf91ceeed88a8c66e9bf8d089b3098dc083f15790870796a7267f25cf9bf0) + mstore(0x65e0, 0x0ab4e80b0091cd40070294f754e54b127e2000572c0344c2838aeeaf251eb391) +mstore(0x6600, mload(0x4f40)) success := and(eq(staticcall(gas(), 0x7, 0x65c0, 0x60, 0x65c0, 0x40), 1), success) mstore(0x6620, mload(0x6540)) mstore(0x6640, mload(0x6560)) mstore(0x6660, mload(0x65c0)) mstore(0x6680, mload(0x65e0)) success := and(eq(staticcall(gas(), 0x6, 0x6620, 0x80, 0x6620, 0x40), 1), success) -mstore(0x66a0, mload(0x4a0)) - mstore(0x66c0, mload(0x4c0)) -mstore(0x66e0, mload(0x4de0)) +mstore(0x66a0, mload(0x460)) + mstore(0x66c0, mload(0x480)) +mstore(0x66e0, mload(0x4f60)) success := and(eq(staticcall(gas(), 0x7, 0x66a0, 0x60, 0x66a0, 0x40), 1), success) mstore(0x6700, mload(0x6620)) mstore(0x6720, mload(0x6640)) mstore(0x6740, mload(0x66a0)) mstore(0x6760, mload(0x66c0)) success := and(eq(staticcall(gas(), 0x6, 0x6700, 0x80, 0x6700, 0x40), 1), success) -mstore(0x6780, mload(0x4e0)) - mstore(0x67a0, mload(0x500)) -mstore(0x67c0, mload(0x4e00)) +mstore(0x6780, mload(0x4a0)) + mstore(0x67a0, mload(0x4c0)) +mstore(0x67c0, mload(0x4f80)) success := and(eq(staticcall(gas(), 0x7, 0x6780, 0x60, 0x6780, 0x40), 1), success) mstore(0x67e0, mload(0x6700)) mstore(0x6800, mload(0x6720)) mstore(0x6820, mload(0x6780)) mstore(0x6840, mload(0x67a0)) success := and(eq(staticcall(gas(), 0x6, 0x67e0, 0x80, 0x67e0, 0x40), 1), success) -mstore(0x6860, mload(0x520)) - mstore(0x6880, mload(0x540)) -mstore(0x68a0, mload(0x4e20)) +mstore(0x6860, mload(0x4e0)) + mstore(0x6880, mload(0x500)) +mstore(0x68a0, mload(0x4fa0)) success := and(eq(staticcall(gas(), 0x7, 0x6860, 0x60, 0x6860, 0x40), 1), success) mstore(0x68c0, mload(0x67e0)) mstore(0x68e0, mload(0x6800)) mstore(0x6900, mload(0x6860)) mstore(0x6920, mload(0x6880)) success := and(eq(staticcall(gas(), 0x6, 0x68c0, 0x80, 0x68c0, 0x40), 1), success) -mstore(0x6940, mload(0x380)) - mstore(0x6960, mload(0x3a0)) -mstore(0x6980, mload(0x4e40)) +mstore(0x6940, mload(0x520)) + mstore(0x6960, mload(0x540)) +mstore(0x6980, mload(0x4fc0)) success := and(eq(staticcall(gas(), 0x7, 0x6940, 0x60, 0x6940, 0x40), 1), success) mstore(0x69a0, mload(0x68c0)) mstore(0x69c0, mload(0x68e0)) mstore(0x69e0, mload(0x6940)) mstore(0x6a00, mload(0x6960)) success := and(eq(staticcall(gas(), 0x6, 0x69a0, 0x80, 0x69a0, 0x40), 1), success) -mstore(0x6a20, mload(0x2c0)) - mstore(0x6a40, mload(0x2e0)) -mstore(0x6a60, mload(0x4f40)) +mstore(0x6a20, mload(0x560)) + mstore(0x6a40, mload(0x580)) +mstore(0x6a60, mload(0x4fe0)) success := and(eq(staticcall(gas(), 0x7, 0x6a20, 0x60, 0x6a20, 0x40), 1), success) mstore(0x6a80, mload(0x69a0)) mstore(0x6aa0, mload(0x69c0)) mstore(0x6ac0, mload(0x6a20)) mstore(0x6ae0, mload(0x6a40)) success := and(eq(staticcall(gas(), 0x6, 0x6a80, 0x80, 0x6a80, 0x40), 1), success) -mstore(0x6b00, mload(0x300)) - mstore(0x6b20, mload(0x320)) -mstore(0x6b40, mload(0x50e0)) +mstore(0x6b00, mload(0x3c0)) + mstore(0x6b20, mload(0x3e0)) +mstore(0x6b40, mload(0x5000)) success := and(eq(staticcall(gas(), 0x7, 0x6b00, 0x60, 0x6b00, 0x40), 1), success) mstore(0x6b60, mload(0x6a80)) mstore(0x6b80, mload(0x6aa0)) mstore(0x6ba0, mload(0x6b00)) mstore(0x6bc0, mload(0x6b20)) success := and(eq(staticcall(gas(), 0x6, 0x6b60, 0x80, 0x6b60, 0x40), 1), success) -mstore(0x6be0, mload(0x340)) - mstore(0x6c00, mload(0x360)) +mstore(0x6be0, mload(0x300)) + mstore(0x6c00, mload(0x320)) mstore(0x6c20, mload(0x5100)) success := and(eq(staticcall(gas(), 0x7, 0x6be0, 0x60, 0x6be0, 0x40), 1), success) mstore(0x6c40, mload(0x6b60)) @@ -1431,51 +1441,69 @@ mstore(0x6c40, mload(0x6b60)) mstore(0x6c80, mload(0x6be0)) mstore(0x6ca0, mload(0x6c00)) success := and(eq(staticcall(gas(), 0x6, 0x6c40, 0x80, 0x6c40, 0x40), 1), success) -mstore(0x6cc0, mload(0x180)) - mstore(0x6ce0, mload(0x1a0)) -mstore(0x6d00, mload(0x5200)) +mstore(0x6cc0, mload(0x340)) + mstore(0x6ce0, mload(0x360)) +mstore(0x6d00, mload(0x52a0)) success := and(eq(staticcall(gas(), 0x7, 0x6cc0, 0x60, 0x6cc0, 0x40), 1), success) mstore(0x6d20, mload(0x6c40)) mstore(0x6d40, mload(0x6c60)) mstore(0x6d60, mload(0x6cc0)) mstore(0x6d80, mload(0x6ce0)) success := and(eq(staticcall(gas(), 0x6, 0x6d20, 0x80, 0x6d20, 0x40), 1), success) -mstore(0x6da0, mload(0xae0)) - mstore(0x6dc0, mload(0xb00)) -mstore(0x6de0, sub(f_q, mload(0x5240))) +mstore(0x6da0, mload(0x380)) + mstore(0x6dc0, mload(0x3a0)) +mstore(0x6de0, mload(0x52c0)) success := and(eq(staticcall(gas(), 0x7, 0x6da0, 0x60, 0x6da0, 0x40), 1), success) mstore(0x6e00, mload(0x6d20)) mstore(0x6e20, mload(0x6d40)) mstore(0x6e40, mload(0x6da0)) mstore(0x6e60, mload(0x6dc0)) success := and(eq(staticcall(gas(), 0x6, 0x6e00, 0x80, 0x6e00, 0x40), 1), success) -mstore(0x6e80, mload(0xb80)) - mstore(0x6ea0, mload(0xba0)) -mstore(0x6ec0, mload(0x5260)) +mstore(0x6e80, mload(0x1c0)) + mstore(0x6ea0, mload(0x1e0)) +mstore(0x6ec0, mload(0x53c0)) success := and(eq(staticcall(gas(), 0x7, 0x6e80, 0x60, 0x6e80, 0x40), 1), success) mstore(0x6ee0, mload(0x6e00)) mstore(0x6f00, mload(0x6e20)) mstore(0x6f20, mload(0x6e80)) mstore(0x6f40, mload(0x6ea0)) success := and(eq(staticcall(gas(), 0x6, 0x6ee0, 0x80, 0x6ee0, 0x40), 1), success) -mstore(0x6f60, mload(0x6ee0)) - mstore(0x6f80, mload(0x6f00)) -mstore(0x6fa0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) - mstore(0x6fc0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) - mstore(0x6fe0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) - mstore(0x7000, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) -mstore(0x7020, mload(0xb80)) - mstore(0x7040, mload(0xba0)) -mstore(0x7060, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) - mstore(0x7080, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) - mstore(0x70a0, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) - mstore(0x70c0, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) -success := and(eq(staticcall(gas(), 0x8, 0x6f60, 0x180, 0x6f60, 0x20), 1), success) -success := and(eq(mload(0x6f60), 1), success) +mstore(0x6f60, mload(0xb20)) + mstore(0x6f80, mload(0xb40)) +mstore(0x6fa0, sub(f_q, mload(0x5400))) +success := and(eq(staticcall(gas(), 0x7, 0x6f60, 0x60, 0x6f60, 0x40), 1), success) +mstore(0x6fc0, mload(0x6ee0)) + mstore(0x6fe0, mload(0x6f00)) +mstore(0x7000, mload(0x6f60)) + mstore(0x7020, mload(0x6f80)) +success := and(eq(staticcall(gas(), 0x6, 0x6fc0, 0x80, 0x6fc0, 0x40), 1), success) +mstore(0x7040, mload(0xbc0)) + mstore(0x7060, mload(0xbe0)) +mstore(0x7080, mload(0x5420)) +success := and(eq(staticcall(gas(), 0x7, 0x7040, 0x60, 0x7040, 0x40), 1), success) +mstore(0x70a0, mload(0x6fc0)) + mstore(0x70c0, mload(0x6fe0)) +mstore(0x70e0, mload(0x7040)) + mstore(0x7100, mload(0x7060)) +success := and(eq(staticcall(gas(), 0x6, 0x70a0, 0x80, 0x70a0, 0x40), 1), success) +mstore(0x7120, mload(0x70a0)) + mstore(0x7140, mload(0x70c0)) +mstore(0x7160, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0x7180, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0x71a0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0x71c0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) +mstore(0x71e0, mload(0xbc0)) + mstore(0x7200, mload(0xbe0)) +mstore(0x7220, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) + mstore(0x7240, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) + mstore(0x7260, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) + mstore(0x7280, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) +success := and(eq(staticcall(gas(), 0x8, 0x7120, 0x180, 0x7120, 0x20), 1), success) +success := and(eq(mload(0x7120), 1), success) if not(success) { revert(0, 0) } return(0, 0) } } - } + } \ No newline at end of file diff --git a/contracts/src/SolvencyVerifier.sol b/contracts/src/SolvencyVerifier.sol deleted file mode 100644 index d1e940a9..00000000 --- a/contracts/src/SolvencyVerifier.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - pragma solidity ^0.8.17; - - contract Verifier { - function verify( - uint256[] memory pubInputs, - bytes memory proof - ) public view returns (bool) { - bool success = true; - bytes32[846] memory transcript; - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x0), 308492134225063399814226381520525808113815168934209933683689315739401114858) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x80), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xa0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xc0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xe0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x100), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x120), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x140), keccak256(add(transcript, 0x0), 320)){ let hash := mload(add(transcript, 0x140)) mstore(add(transcript, 0x160), mod(hash, f_q)) mstore(add(transcript, 0x180), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1a0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1e0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x200), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x220), keccak256(add(transcript, 0x180), 160)){ let hash := mload(add(transcript, 0x220)) mstore(add(transcript, 0x240), mod(hash, f_q)) mstore(add(transcript, 0x260), hash) }mstore8(add(transcript, 0x280), 1)mstore(add(transcript, 0x280), keccak256(add(transcript, 0x260), 33)){ let hash := mload(add(transcript, 0x280)) mstore(add(transcript, 0x2a0), mod(hash, f_q)) mstore(add(transcript, 0x2c0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2e0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x300), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x320), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x340), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x360), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x380), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3a0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3c0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3e0), keccak256(add(transcript, 0x2c0), 288)){ let hash := mload(add(transcript, 0x3e0)) mstore(add(transcript, 0x400), mod(hash, f_q)) mstore(add(transcript, 0x420), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x440), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x460), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x480), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4c0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x500), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x520), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x540), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x560), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x580), keccak256(add(transcript, 0x420), 352)){ let hash := mload(add(transcript, 0x580)) mstore(add(transcript, 0x5a0), mod(hash, f_q)) mstore(add(transcript, 0x5c0), hash) }mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa00), keccak256(add(transcript, 0x5c0), 1088)){ let hash := mload(add(transcript, 0xa00)) mstore(add(transcript, 0xa20), mod(hash, f_q)) mstore(add(transcript, 0xa40), hash) }mstore8(add(transcript, 0xa60), 1)mstore(add(transcript, 0xa60), keccak256(add(transcript, 0xa40), 33)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) } { let x := mload(add(proof, 0x7c0)) mstore(add(transcript, 0xac0), x) let y := mload(add(proof, 0x7e0)) mstore(add(transcript, 0xae0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb00), keccak256(add(transcript, 0xaa0), 96)){ let hash := mload(add(transcript, 0xb00)) mstore(add(transcript, 0xb20), mod(hash, f_q)) mstore(add(transcript, 0xb40), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb60), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb80), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xba0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0xba0)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), addmod(mload(add(transcript, 0xcc0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), 21866867634659744680037180739646672280844703888306253060159436409049855557633, f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0xd40), addmod(mload(add(transcript, 0x5a0)), 11952173244228085703417150075019950819261217979144509790385672149647937438939, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd00)), 1680739780407307830605919050682431078078760076686599579086116998224280619988, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x5a0)), 20207503091431967391640486694574844010469604323729434764612087188351527875629, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd00)), 14158528901797138466244491986759313854666262535363044392173788062030301470987, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5a0)), 7729713970042136756001913758497961233882101865052989951524416124545507024630, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd00)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5a0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd00)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5a0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd00)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd00)), 1, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd00)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd00)), 6252951856119339508807713076978770803512896272623217303779254502899773638908, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5a0)), 15635291015719935713438692668278504285035468127792817039918949683676034856709, f_q)){ let prod := mload(add(transcript, 0xd40)) prod := mulmod(mload(add(transcript, 0xd80)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xce0)), prod, f_q) mstore(add(transcript, 0x1060), prod) }mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), 32)mstore(add(transcript, 0x1100), mload(add(transcript, 0x1060)))mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1140), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x10a0), 0xc0, add(transcript, 0x1080), 0x20), 1), success){ let inv := mload(add(transcript, 0x1080)) let v v := mload(add(transcript, 0xce0)) mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xd80)) mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd40)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd40), inv) }mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x60)), f_q), result, f_q)mstore(add(transcript, 0x1280), result) }mstore(add(transcript, 0x12a0), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1340), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x1360)), f_q))mstore(add(transcript, 0x13a0), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13e0), addmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), addmod(mload(add(transcript, 0x13e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1420)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1300)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x13a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x14a0), addmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x14a0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x14c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x14e0)), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1500)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x1300)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1580), addmod(mload(add(transcript, 0x1520)), mload(add(transcript, 0x1560)), f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), mulmod(mload(add(transcript, 0x660)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x1340)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), addmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x1640)), f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x620)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x640)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16e0), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x16c0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1680)), sub(f_q, mload(add(transcript, 0x16e0))), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1740), addmod(mload(add(transcript, 0x15a0)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x660)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x1340)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x17c0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x17a0)), f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1800), mulmod(mload(add(transcript, 0x620)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x640)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x17e0)), sub(f_q, mload(add(transcript, 0x1840))), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x18a0), addmod(mload(add(transcript, 0x1760)), mload(add(transcript, 0x1880)), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(1, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1920), addmod(2, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(3, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x19a0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x19e0)), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x680)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x1a40)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a80), addmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a60)), f_q))mstore(add(transcript, 0x1aa0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1ac0)), f_q))mstore(add(transcript, 0x1b00), addmod(4, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1b60), addmod(1, sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x1b60)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1ba0), addmod(mload(add(transcript, 0x1aa0)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(2, mload(add(transcript, 0x660)), f_q))mstore(add(transcript, 0x1c00), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c60), addmod(mload(add(transcript, 0x1c20)), sub(f_q, mload(add(transcript, 0x1c40))), f_q))mstore(add(transcript, 0x1c80), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), sub(f_q, mload(add(transcript, 0x1c80))), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x1ca0)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1ce0), addmod(mload(add(transcript, 0x1bc0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1d80), addmod(mload(add(transcript, 0x1d60)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1dc0), addmod(mload(add(transcript, 0x1d00)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x1e60)), 5192296858534827628530496329220096, f_q))mstore(add(transcript, 0x1ea0), addmod(mload(add(transcript, 0x1e80)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1ea0)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x8c0))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1f00)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x1fc0), addmod(mload(add(transcript, 0x1fa0)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x1fe0), mulmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x1fe0)), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2000)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x920)), sub(f_q, mload(add(transcript, 0x900))), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x2040)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2020)), mload(add(transcript, 0x2060)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x1160))), f_q))mstore(add(transcript, 0x20e0), addmod(mload(add(transcript, 0x1180)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20e0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x2100)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2140), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x20c0)), sub(f_q, mload(add(transcript, 0x2140))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2200), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x21e0)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x2200)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x2220)), mload(add(transcript, 0x21c0)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2260)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x22c0), mulmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x22e0), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x22e0)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x2300)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2360), mulmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x2380), mulmod(1, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x23a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x23a0)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2400), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2420), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2420)), f_q))mstore(add(transcript, 0x2460), addmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x2460)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x24a0), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x24c0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x24a0)), f_q))mstore(add(transcript, 0x24e0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2520), mulmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x2540), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2560), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2560)), f_q))mstore(add(transcript, 0x25a0), addmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x25a0)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25e0), mulmod(mload(add(transcript, 0x25c0)), mload(add(transcript, 0x8c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x2360)), sub(f_q, mload(add(transcript, 0x25e0))), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2640), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x2680)), f_q))mstore(add(transcript, 0x26c0), addmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x26e0), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2700), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x2700)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2740), mulmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2780), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x27a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x27a0)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2800), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x28a0), mulmod(mload(add(transcript, 0x2880)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x2760)), sub(f_q, mload(add(transcript, 0x28a0))), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2900), addmod(mload(add(transcript, 0x2660)), mload(add(transcript, 0x28e0)), f_q))mstore(add(transcript, 0x2920), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2900)), f_q))mstore(add(transcript, 0x2940), addmod(1, sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2960), mulmod(mload(add(transcript, 0x2940)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2920)), mload(add(transcript, 0x2960)), f_q))mstore(add(transcript, 0x29a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x29c0)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2a00), mulmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2a20), addmod(mload(add(transcript, 0x29a0)), mload(add(transcript, 0x2a00)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2a20)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ae0), mulmod(256, mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x2b00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x2ae0))), f_q))mstore(add(transcript, 0x2b20), mulmod(mload(add(transcript, 0x2b00)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x2b60)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2ac0)), sub(f_q, mload(add(transcript, 0x2ba0))), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x2bc0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x2a40)), mload(add(transcript, 0x2be0)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c00)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2c80), addmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c80)), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x2cc0)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x2d80)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2dc0), mulmod(1, mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2de0), mulmod(1, mload(add(transcript, 0x2d40)), f_q))mstore(add(transcript, 0x2e00), mulmod(1, mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2e20), mulmod(1, mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x5a0)), 1, f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2e80))), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2ec0))), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x5a0)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f00))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f40))), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19470333053884630052643688193991482022807116448657043890197497819686199857828, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 2417909817954645169602717551265793065741247951758990453500706366889608637789, f_q), f_q), result, f_q)mstore(add(transcript, 0x2f80), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 13686227242150003628673578706486473027501243666075718775893288845164412632930, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 10079503758141076467065204586507257535549232608832327988764044976944819876346, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fa0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 18715936898160381416714524359517348601997944075114713669820885373469568354766, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 15375775075249615866494035504844970190233299190010037655541891534730124992278, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fc0), result) }mstore(add(transcript, 0x2fe0), mulmod(1, mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178117, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q), result, f_q)mstore(add(transcript, 0x3040), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 13127608231681926238307118629157549705911918406946061530612285695988519678593, f_q), f_q), result, f_q)mstore(add(transcript, 0x3060), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 16140595808673403009154643164823336476463527776677864878778453135559733237044, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 5747647063165872213091762580433938612084836623738169464919751051016075258573, f_q), f_q), result, f_q)mstore(add(transcript, 0x3080), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 17015964487361230672162623735654618573844832338054897787312333529290879253714, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 3176732791729641355588945816447819802711920387939493967460175841862547409845, f_q), f_q), result, f_q)mstore(add(transcript, 0x30a0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19187508498431587163140984396833674282302409422288044257471288693049179355069, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 17472297497993506786357772047295541913219081564856233764575529621311665103799, f_q), f_q), result, f_q)mstore(add(transcript, 0x30c0), result) }mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2f20)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679711, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q), result, f_q)mstore(add(transcript, 0x3100), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 664623189640884330400307346618971907426870604454565164570654825418724962734, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x3160), result) }{ let prod := mload(add(transcript, 0x2f80)) prod := mulmod(mload(add(transcript, 0x2fa0)), prod, f_q) mstore(add(transcript, 0x3180), prod) prod := mulmod(mload(add(transcript, 0x2fc0)), prod, f_q) mstore(add(transcript, 0x31a0), prod) prod := mulmod(mload(add(transcript, 0x3040)), prod, f_q) mstore(add(transcript, 0x31c0), prod) prod := mulmod(mload(add(transcript, 0x3060)), prod, f_q) mstore(add(transcript, 0x31e0), prod) prod := mulmod(mload(add(transcript, 0x3000)), prod, f_q) mstore(add(transcript, 0x3200), prod) prod := mulmod(mload(add(transcript, 0x3080)), prod, f_q) mstore(add(transcript, 0x3220), prod) prod := mulmod(mload(add(transcript, 0x30a0)), prod, f_q) mstore(add(transcript, 0x3240), prod) prod := mulmod(mload(add(transcript, 0x30c0)), prod, f_q) mstore(add(transcript, 0x3260), prod) prod := mulmod(mload(add(transcript, 0x30e0)), prod, f_q) mstore(add(transcript, 0x3280), prod) prod := mulmod(mload(add(transcript, 0x3100)), prod, f_q) mstore(add(transcript, 0x32a0), prod) prod := mulmod(mload(add(transcript, 0x3120)), prod, f_q) mstore(add(transcript, 0x32c0), prod) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x32e0), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3300), prod) prod := mulmod(mload(add(transcript, 0x2fe0)), prod, f_q) mstore(add(transcript, 0x3320), prod) }mstore(add(transcript, 0x3360), 32)mstore(add(transcript, 0x3380), 32)mstore(add(transcript, 0x33a0), 32)mstore(add(transcript, 0x33c0), mload(add(transcript, 0x3320)))mstore(add(transcript, 0x33e0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3400), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3360), 0xc0, add(transcript, 0x3340), 0x20), 1), success){ let inv := mload(add(transcript, 0x3340)) let v v := mload(add(transcript, 0x2fe0)) mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x3300)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x32e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x32c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3120)) mstore(add(transcript, 0x3120), mulmod(mload(add(transcript, 0x32a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3100)) mstore(add(transcript, 0x3100), mulmod(mload(add(transcript, 0x3280)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30e0)) mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3260)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30c0)) mstore(add(transcript, 0x30c0), mulmod(mload(add(transcript, 0x3240)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30a0)) mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x3220)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3080)) mstore(add(transcript, 0x3080), mulmod(mload(add(transcript, 0x3200)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3000)) mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x31e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3060)) mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x31c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3040)) mstore(add(transcript, 0x3040), mulmod(mload(add(transcript, 0x31a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fc0)) mstore(add(transcript, 0x2fc0), mulmod(mload(add(transcript, 0x3180)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fa0)) mstore(add(transcript, 0x2fa0), mulmod(mload(add(transcript, 0x2f80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x2f80), inv) }{ let result := mload(add(transcript, 0x2f80))result := addmod(mload(add(transcript, 0x2fa0)), result, f_q)result := addmod(mload(add(transcript, 0x2fc0)), result, f_q)mstore(add(transcript, 0x3420), result) }mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3000)), f_q)){ let result := mload(add(transcript, 0x3040))result := addmod(mload(add(transcript, 0x3060)), result, f_q)mstore(add(transcript, 0x3460), result) }mstore(add(transcript, 0x3480), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x30e0)), f_q)){ let result := mload(add(transcript, 0x3080))result := addmod(mload(add(transcript, 0x30a0)), result, f_q)result := addmod(mload(add(transcript, 0x30c0)), result, f_q)mstore(add(transcript, 0x34a0), result) }mstore(add(transcript, 0x34c0), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3140)), f_q)){ let result := mload(add(transcript, 0x3100))result := addmod(mload(add(transcript, 0x3120)), result, f_q)mstore(add(transcript, 0x34e0), result) }mstore(add(transcript, 0x3500), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x2fe0)), f_q)){ let result := mload(add(transcript, 0x3160))mstore(add(transcript, 0x3520), result) }{ let prod := mload(add(transcript, 0x3420)) prod := mulmod(mload(add(transcript, 0x3460)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x34a0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x34e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x3520)), prod, f_q) mstore(add(transcript, 0x35a0), prod) }mstore(add(transcript, 0x35e0), 32)mstore(add(transcript, 0x3600), 32)mstore(add(transcript, 0x3620), 32)mstore(add(transcript, 0x3640), mload(add(transcript, 0x35a0)))mstore(add(transcript, 0x3660), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3680), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x35e0), 0xc0, add(transcript, 0x35c0), 0x20), 1), success){ let inv := mload(add(transcript, 0x35c0)) let v v := mload(add(transcript, 0x3520)) mstore(add(transcript, 0x3520), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34e0)) mstore(add(transcript, 0x34e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34a0)) mstore(add(transcript, 0x34a0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3460)) mstore(add(transcript, 0x3460), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3420), inv) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x3440)), mload(add(transcript, 0x3460)), f_q))mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3480)), mload(add(transcript, 0x34a0)), f_q))mstore(add(transcript, 0x36e0), mulmod(mload(add(transcript, 0x34c0)), mload(add(transcript, 0x34e0)), f_q))mstore(add(transcript, 0x3700), mulmod(mload(add(transcript, 0x3500)), mload(add(transcript, 0x3520)), f_q))mstore(add(transcript, 0x3720), mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3740), mulmod(mload(add(transcript, 0x3720)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3760), mulmod(mload(add(transcript, 0x3740)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3780), mulmod(mload(add(transcript, 0x3760)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3780)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x37c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3820), mulmod(mload(add(transcript, 0x3800)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x3820)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3840)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3860)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x3880)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0x38a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa80)), f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x39a0), result) }mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x39e0), mulmod(sub(f_q, mload(add(transcript, 0x39c0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x3a00), result) }mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x3a40), mulmod(sub(f_q, mload(add(transcript, 0x3a20))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a60), mulmod(1, mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a80), addmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), 1, f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3a60)), 1, f_q))mstore(add(transcript, 0x3ae0), mulmod(1, mload(add(transcript, 0x3440)), f_q)){ let result := mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b00), result) }mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3b40), mulmod(sub(f_q, mload(add(transcript, 0x3b20))), 1, f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3ae0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b80), result) }mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3bc0), mulmod(sub(f_q, mload(add(transcript, 0x3ba0))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3c00), addmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0x3bc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d40), addmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x3d60), mulmod(1, mload(add(transcript, 0x3480)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x3080)), f_q)result := addmod(mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x30a0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x30c0)), f_q), result, f_q)mstore(add(transcript, 0x3d80), result) }mstore(add(transcript, 0x3da0), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x3dc0), mulmod(sub(f_q, mload(add(transcript, 0x3da0))), 1, f_q))mstore(add(transcript, 0x3de0), mulmod(mload(add(transcript, 0x3d60)), 1, f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3dc0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e20), mulmod(mload(add(transcript, 0x3de0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e40), addmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0x3e00)), f_q))mstore(add(transcript, 0x3e60), mulmod(1, mload(add(transcript, 0x34c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x3100)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x3120)), f_q), result, f_q)mstore(add(transcript, 0x3e80), result) }mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3e80)), mload(add(transcript, 0x36e0)), f_q))mstore(add(transcript, 0x3ec0), mulmod(sub(f_q, mload(add(transcript, 0x3ea0))), 1, f_q))mstore(add(transcript, 0x3ee0), mulmod(mload(add(transcript, 0x3e60)), 1, f_q))mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f20), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f40), addmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3f00)), f_q))mstore(add(transcript, 0x3f60), mulmod(1, mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), 1, f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3f60)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4000), result) }mstore(add(transcript, 0x4020), mulmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4040), mulmod(sub(f_q, mload(add(transcript, 0x4020))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4060), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4080), addmod(mload(add(transcript, 0x3fc0)), mload(add(transcript, 0x4040)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x40a0), result) }mstore(add(transcript, 0x40c0), mulmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x40e0), mulmod(sub(f_q, mload(add(transcript, 0x40c0))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4100), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4120), addmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0x40e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4140), result) }mstore(add(transcript, 0x4160), mulmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4180), mulmod(sub(f_q, mload(add(transcript, 0x4160))), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41c0), addmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0x4180)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x41e0), result) }mstore(add(transcript, 0x4200), mulmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4220), mulmod(sub(f_q, mload(add(transcript, 0x4200))), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4240), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4260), addmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0x4220)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4280), result) }mstore(add(transcript, 0x42a0), mulmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x42c0), mulmod(sub(f_q, mload(add(transcript, 0x42a0))), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x42e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x4300), addmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0x42c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4320), result) }mstore(add(transcript, 0x4340), mulmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4360), mulmod(sub(f_q, mload(add(transcript, 0x4340))), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4380), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x43a0), addmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0x4360)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x43c0), result) }mstore(add(transcript, 0x43e0), mulmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4400), mulmod(sub(f_q, mload(add(transcript, 0x43e0))), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4420), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4440), addmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0x4400)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4460), result) }mstore(add(transcript, 0x4480), mulmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x44a0), mulmod(sub(f_q, mload(add(transcript, 0x4480))), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44c0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44e0), addmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0x44a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4500), result) }mstore(add(transcript, 0x4520), mulmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4540), mulmod(sub(f_q, mload(add(transcript, 0x4520))), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4560), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4580), addmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0x4540)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x45a0), result) }mstore(add(transcript, 0x45c0), mulmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x45e0), mulmod(sub(f_q, mload(add(transcript, 0x45c0))), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4600), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4620), addmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0x45e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4640), result) }mstore(add(transcript, 0x4660), mulmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4680), mulmod(sub(f_q, mload(add(transcript, 0x4660))), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46c0), addmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0x4680)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x46e0), result) }mstore(add(transcript, 0x4700), mulmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4720), mulmod(sub(f_q, mload(add(transcript, 0x4700))), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4740), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4760), addmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0x4720)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4780), result) }mstore(add(transcript, 0x47a0), mulmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x47c0), mulmod(sub(f_q, mload(add(transcript, 0x47a0))), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x47e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4800), addmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0x47c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4820), result) }mstore(add(transcript, 0x4840), mulmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4860), mulmod(sub(f_q, mload(add(transcript, 0x4840))), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x4880), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x48a0), addmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0x4860)), f_q))mstore(add(transcript, 0x48c0), mulmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2e20)), mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4940), result) }mstore(add(transcript, 0x4960), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4980), mulmod(sub(f_q, mload(add(transcript, 0x4960))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a40), addmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0x4980)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4a60), result) }mstore(add(transcript, 0x4a80), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4aa0), mulmod(sub(f_q, mload(add(transcript, 0x4a80))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ae0), addmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0x4aa0)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4060)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x4100)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x41a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x4240)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x42e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4380)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4420)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x44c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4560)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4600)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x46a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4740)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x47e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4880)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x49a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4ac0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4dc0), addmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0x4b00)), f_q))mstore(add(transcript, 0x4de0), mulmod(1, mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x4e00), mulmod(1, mload(add(transcript, 0xb20)), f_q))mstore(add(transcript, 0x4e20), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x4e40), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x4e60), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4e20), 0x60, add(transcript, 0x4e20), 0x40), 1), success)mstore(add(transcript, 0x4e80), mload(add(transcript, 0x4e20))) mstore(add(transcript, 0x4ea0), mload(add(transcript, 0x4e40)))mstore(add(transcript, 0x4ec0), mload(add(transcript, 0x80))) mstore(add(transcript, 0x4ee0), mload(add(transcript, 0xa0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4e80), 0x80, add(transcript, 0x4e80), 0x40), 1), success)mstore(add(transcript, 0x4f00), mload(add(transcript, 0xc0))) mstore(add(transcript, 0x4f20), mload(add(transcript, 0xe0)))mstore(add(transcript, 0x4f40), mload(add(transcript, 0x3ac0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4f00), 0x60, add(transcript, 0x4f00), 0x40), 1), success)mstore(add(transcript, 0x4f60), mload(add(transcript, 0x4e80))) mstore(add(transcript, 0x4f80), mload(add(transcript, 0x4ea0)))mstore(add(transcript, 0x4fa0), mload(add(transcript, 0x4f00))) mstore(add(transcript, 0x4fc0), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4f60), 0x80, add(transcript, 0x4f60), 0x40), 1), success)mstore(add(transcript, 0x4fe0), mload(add(transcript, 0x100))) mstore(add(transcript, 0x5000), mload(add(transcript, 0x120)))mstore(add(transcript, 0x5020), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4fe0), 0x60, add(transcript, 0x4fe0), 0x40), 1), success)mstore(add(transcript, 0x5040), mload(add(transcript, 0x4f60))) mstore(add(transcript, 0x5060), mload(add(transcript, 0x4f80)))mstore(add(transcript, 0x5080), mload(add(transcript, 0x4fe0))) mstore(add(transcript, 0x50a0), mload(add(transcript, 0x5000)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5040), 0x80, add(transcript, 0x5040), 0x40), 1), success)mstore(add(transcript, 0x50c0), mload(add(transcript, 0x320))) mstore(add(transcript, 0x50e0), mload(add(transcript, 0x340)))mstore(add(transcript, 0x5100), mload(add(transcript, 0x3d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x50c0), 0x60, add(transcript, 0x50c0), 0x40), 1), success)mstore(add(transcript, 0x5120), mload(add(transcript, 0x5040))) mstore(add(transcript, 0x5140), mload(add(transcript, 0x5060)))mstore(add(transcript, 0x5160), mload(add(transcript, 0x50c0))) mstore(add(transcript, 0x5180), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5120), 0x80, add(transcript, 0x5120), 0x40), 1), success)mstore(add(transcript, 0x51a0), mload(add(transcript, 0x360))) mstore(add(transcript, 0x51c0), mload(add(transcript, 0x380)))mstore(add(transcript, 0x51e0), mload(add(transcript, 0x3d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x51a0), 0x60, add(transcript, 0x51a0), 0x40), 1), success)mstore(add(transcript, 0x5200), mload(add(transcript, 0x5120))) mstore(add(transcript, 0x5220), mload(add(transcript, 0x5140)))mstore(add(transcript, 0x5240), mload(add(transcript, 0x51a0))) mstore(add(transcript, 0x5260), mload(add(transcript, 0x51c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5200), 0x80, add(transcript, 0x5200), 0x40), 1), success)mstore(add(transcript, 0x5280), mload(add(transcript, 0x2e0))) mstore(add(transcript, 0x52a0), mload(add(transcript, 0x300)))mstore(add(transcript, 0x52c0), mload(add(transcript, 0x3e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5200))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x5220)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x52a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0x1a0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0x1c0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0x1e0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x200)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), 0x0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a669) mstore(add(transcript, 0x5540), 0x019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e)mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f) mstore(add(transcript, 0x5620), 0x18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b8) mstore(add(transcript, 0x5700), 0x05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d8) mstore(add(transcript, 0x57e0), 0x03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f2402) mstore(add(transcript, 0x58c0), 0x13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f6)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba5) mstore(add(transcript, 0x59a0), 0x03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf) mstore(add(transcript, 0x5a80), 0x28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3) mstore(add(transcript, 0x5b60), 0x0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e) mstore(add(transcript, 0x5c40), 0x09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58) mstore(add(transcript, 0x5d20), 0x0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9) mstore(add(transcript, 0x5e00), 0x13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x5ee0), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103) mstore(add(transcript, 0x5fc0), 0x23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af7) mstore(add(transcript, 0x60a0), 0x060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b730)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), mload(add(transcript, 0x440))) mstore(add(transcript, 0x6180), mload(add(transcript, 0x460)))mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), mload(add(transcript, 0x480))) mstore(add(transcript, 0x6260), mload(add(transcript, 0x4a0)))mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), mload(add(transcript, 0x4c0))) mstore(add(transcript, 0x6340), mload(add(transcript, 0x4e0)))mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), mload(add(transcript, 0x500))) mstore(add(transcript, 0x6420), mload(add(transcript, 0x520)))mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x540))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x560)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x3a0))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x3c0)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0xac0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0xae0)))mstore(add(transcript, 0x66e0), sub(f_q, mload(add(transcript, 0x4de0))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x68a0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x68c0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x68e0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x6900), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x6920), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x6940), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x6960), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x6980), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x69a0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x69c0), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6860), 0x180, add(transcript, 0x6860), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6860)), 1), success)} return success; } } diff --git a/contracts/src/SolvencyVerifier.yul b/contracts/src/SolvencyVerifier.yul deleted file mode 100644 index d72d7d0e..00000000 --- a/contracts/src/SolvencyVerifier.yul +++ /dev/null @@ -1,1418 +0,0 @@ - - object "plonk_verifier" { - code { - function allocate(size) -> ptr { - ptr := mload(0x40) - if eq(ptr, 0) { ptr := 0x60 } - mstore(0x40, add(ptr, size)) - } - let size := datasize("Runtime") - let offset := allocate(size) - datacopy(offset, dataoffset("Runtime"), size) - return(offset, size) - } - object "Runtime" { - code { - let success:bool := true - let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 - let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 - function validate_ec_point(x, y) -> valid:bool { - { - let x_lt_p:bool := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let y_lt_p:bool := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - valid := and(x_lt_p, y_lt_p) - } - { - let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let is_affine:bool := eq(x_cube_plus_3, y_square) - valid := and(valid, is_affine) - } - } - mstore(0x20, mod(calldataload(0x0), f_q)) -mstore(0x40, mod(calldataload(0x20), f_q)) -mstore(0x60, mod(calldataload(0x40), f_q)) -mstore(0x0, 308492134225063399814226381520525808113815168934209933683689315739401114858) - - { - let x := calldataload(0x60) - mstore(0x80, x) - let y := calldataload(0x80) - mstore(0xa0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xa0) - mstore(0xc0, x) - let y := calldataload(0xc0) - mstore(0xe0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xe0) - mstore(0x100, x) - let y := calldataload(0x100) - mstore(0x120, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0x140, keccak256(0x0, 320)) -{ - let hash := mload(0x140) - mstore(0x160, mod(hash, f_q)) - mstore(0x180, hash) - } - - { - let x := calldataload(0x120) - mstore(0x1a0, x) - let y := calldataload(0x140) - mstore(0x1c0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x160) - mstore(0x1e0, x) - let y := calldataload(0x180) - mstore(0x200, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0x220, keccak256(0x180, 160)) -{ - let hash := mload(0x220) - mstore(0x240, mod(hash, f_q)) - mstore(0x260, hash) - } -mstore8(640, 1) -mstore(0x280, keccak256(0x260, 33)) -{ - let hash := mload(0x280) - mstore(0x2a0, mod(hash, f_q)) - mstore(0x2c0, hash) - } - - { - let x := calldataload(0x1a0) - mstore(0x2e0, x) - let y := calldataload(0x1c0) - mstore(0x300, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x1e0) - mstore(0x320, x) - let y := calldataload(0x200) - mstore(0x340, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x220) - mstore(0x360, x) - let y := calldataload(0x240) - mstore(0x380, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x260) - mstore(0x3a0, x) - let y := calldataload(0x280) - mstore(0x3c0, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0x3e0, keccak256(0x2c0, 288)) -{ - let hash := mload(0x3e0) - mstore(0x400, mod(hash, f_q)) - mstore(0x420, hash) - } - - { - let x := calldataload(0x2a0) - mstore(0x440, x) - let y := calldataload(0x2c0) - mstore(0x460, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x2e0) - mstore(0x480, x) - let y := calldataload(0x300) - mstore(0x4a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x320) - mstore(0x4c0, x) - let y := calldataload(0x340) - mstore(0x4e0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x360) - mstore(0x500, x) - let y := calldataload(0x380) - mstore(0x520, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x3a0) - mstore(0x540, x) - let y := calldataload(0x3c0) - mstore(0x560, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0x580, keccak256(0x420, 352)) -{ - let hash := mload(0x580) - mstore(0x5a0, mod(hash, f_q)) - mstore(0x5c0, hash) - } -mstore(0x5e0, mod(calldataload(0x3e0), f_q)) -mstore(0x600, mod(calldataload(0x400), f_q)) -mstore(0x620, mod(calldataload(0x420), f_q)) -mstore(0x640, mod(calldataload(0x440), f_q)) -mstore(0x660, mod(calldataload(0x460), f_q)) -mstore(0x680, mod(calldataload(0x480), f_q)) -mstore(0x6a0, mod(calldataload(0x4a0), f_q)) -mstore(0x6c0, mod(calldataload(0x4c0), f_q)) -mstore(0x6e0, mod(calldataload(0x4e0), f_q)) -mstore(0x700, mod(calldataload(0x500), f_q)) -mstore(0x720, mod(calldataload(0x520), f_q)) -mstore(0x740, mod(calldataload(0x540), f_q)) -mstore(0x760, mod(calldataload(0x560), f_q)) -mstore(0x780, mod(calldataload(0x580), f_q)) -mstore(0x7a0, mod(calldataload(0x5a0), f_q)) -mstore(0x7c0, mod(calldataload(0x5c0), f_q)) -mstore(0x7e0, mod(calldataload(0x5e0), f_q)) -mstore(0x800, mod(calldataload(0x600), f_q)) -mstore(0x820, mod(calldataload(0x620), f_q)) -mstore(0x840, mod(calldataload(0x640), f_q)) -mstore(0x860, mod(calldataload(0x660), f_q)) -mstore(0x880, mod(calldataload(0x680), f_q)) -mstore(0x8a0, mod(calldataload(0x6a0), f_q)) -mstore(0x8c0, mod(calldataload(0x6c0), f_q)) -mstore(0x8e0, mod(calldataload(0x6e0), f_q)) -mstore(0x900, mod(calldataload(0x700), f_q)) -mstore(0x920, mod(calldataload(0x720), f_q)) -mstore(0x940, mod(calldataload(0x740), f_q)) -mstore(0x960, mod(calldataload(0x760), f_q)) -mstore(0x980, mod(calldataload(0x780), f_q)) -mstore(0x9a0, mod(calldataload(0x7a0), f_q)) -mstore(0x9c0, mod(calldataload(0x7c0), f_q)) -mstore(0x9e0, mod(calldataload(0x7e0), f_q)) -mstore(0xa00, keccak256(0x5c0, 1088)) -{ - let hash := mload(0xa00) - mstore(0xa20, mod(hash, f_q)) - mstore(0xa40, hash) - } -mstore8(2656, 1) -mstore(0xa60, keccak256(0xa40, 33)) -{ - let hash := mload(0xa60) - mstore(0xa80, mod(hash, f_q)) - mstore(0xaa0, hash) - } - - { - let x := calldataload(0x800) - mstore(0xac0, x) - let y := calldataload(0x820) - mstore(0xae0, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0xb00, keccak256(0xaa0, 96)) -{ - let hash := mload(0xb00) - mstore(0xb20, mod(hash, f_q)) - mstore(0xb40, hash) - } - - { - let x := calldataload(0x840) - mstore(0xb60, x) - let y := calldataload(0x860) - mstore(0xb80, y) - success := and(validate_ec_point(x, y), success) - } -mstore(0xba0, mulmod(mload(0x5a0), mload(0x5a0), f_q)) -mstore(0xbc0, mulmod(mload(0xba0), mload(0xba0), f_q)) -mstore(0xbe0, mulmod(mload(0xbc0), mload(0xbc0), f_q)) -mstore(0xc00, mulmod(mload(0xbe0), mload(0xbe0), f_q)) -mstore(0xc20, mulmod(mload(0xc00), mload(0xc00), f_q)) -mstore(0xc40, mulmod(mload(0xc20), mload(0xc20), f_q)) -mstore(0xc60, mulmod(mload(0xc40), mload(0xc40), f_q)) -mstore(0xc80, mulmod(mload(0xc60), mload(0xc60), f_q)) -mstore(0xca0, mulmod(mload(0xc80), mload(0xc80), f_q)) -mstore(0xcc0, mulmod(mload(0xca0), mload(0xca0), f_q)) -mstore(0xce0, addmod(mload(0xcc0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) -mstore(0xd00, mulmod(mload(0xce0), 21866867634659744680037180739646672280844703888306253060159436409049855557633, f_q)) -mstore(0xd20, mulmod(mload(0xd00), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q)) -mstore(0xd40, addmod(mload(0x5a0), 11952173244228085703417150075019950819261217979144509790385672149647937438939, f_q)) -mstore(0xd60, mulmod(mload(0xd00), 1680739780407307830605919050682431078078760076686599579086116998224280619988, f_q)) -mstore(0xd80, addmod(mload(0x5a0), 20207503091431967391640486694574844010469604323729434764612087188351527875629, f_q)) -mstore(0xda0, mulmod(mload(0xd00), 14158528901797138466244491986759313854666262535363044392173788062030301470987, f_q)) -mstore(0xdc0, addmod(mload(0x5a0), 7729713970042136756001913758497961233882101865052989951524416124545507024630, f_q)) -mstore(0xde0, mulmod(mload(0xd00), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) -mstore(0xe00, addmod(mload(0x5a0), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q)) -mstore(0xe20, mulmod(mload(0xd00), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q)) -mstore(0xe40, addmod(mload(0x5a0), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q)) -mstore(0xe60, mulmod(mload(0xd00), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q)) -mstore(0xe80, addmod(mload(0x5a0), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q)) -mstore(0xea0, mulmod(mload(0xd00), 1, f_q)) -mstore(0xec0, addmod(mload(0x5a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) -mstore(0xee0, mulmod(mload(0xd00), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q)) -mstore(0xf00, addmod(mload(0x5a0), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q)) -mstore(0xf20, mulmod(mload(0xd00), 6252951856119339508807713076978770803512896272623217303779254502899773638908, f_q)) -mstore(0xf40, addmod(mload(0x5a0), 15635291015719935713438692668278504285035468127792817039918949683676034856709, f_q)) -{ - let prod := mload(0xd40) - - prod := mulmod(mload(0xd80), prod, f_q) - mstore(0xf60, prod) - - prod := mulmod(mload(0xdc0), prod, f_q) - mstore(0xf80, prod) - - prod := mulmod(mload(0xe00), prod, f_q) - mstore(0xfa0, prod) - - prod := mulmod(mload(0xe40), prod, f_q) - mstore(0xfc0, prod) - - prod := mulmod(mload(0xe80), prod, f_q) - mstore(0xfe0, prod) - - prod := mulmod(mload(0xec0), prod, f_q) - mstore(0x1000, prod) - - prod := mulmod(mload(0xf00), prod, f_q) - mstore(0x1020, prod) - - prod := mulmod(mload(0xf40), prod, f_q) - mstore(0x1040, prod) - - prod := mulmod(mload(0xce0), prod, f_q) - mstore(0x1060, prod) - - } -mstore(0x10a0, 32) -mstore(0x10c0, 32) -mstore(0x10e0, 32) -mstore(0x1100, mload(0x1060)) -mstore(0x1120, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x1140, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x10a0, 0xc0, 0x1080, 0x20), 1), success) -{ - - let inv := mload(0x1080) - let v - - v := mload(0xce0) - mstore(3296, mulmod(mload(0x1040), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xf40) - mstore(3904, mulmod(mload(0x1020), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xf00) - mstore(3840, mulmod(mload(0x1000), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xec0) - mstore(3776, mulmod(mload(0xfe0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xe80) - mstore(3712, mulmod(mload(0xfc0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xe40) - mstore(3648, mulmod(mload(0xfa0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xe00) - mstore(3584, mulmod(mload(0xf80), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xdc0) - mstore(3520, mulmod(mload(0xf60), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0xd80) - mstore(3456, mulmod(mload(0xd40), inv, f_q)) - inv := mulmod(v, inv, f_q) - mstore(0xd40, inv) - - } -mstore(0x1160, mulmod(mload(0xd20), mload(0xd40), f_q)) -mstore(0x1180, mulmod(mload(0xd60), mload(0xd80), f_q)) -mstore(0x11a0, mulmod(mload(0xda0), mload(0xdc0), f_q)) -mstore(0x11c0, mulmod(mload(0xde0), mload(0xe00), f_q)) -mstore(0x11e0, mulmod(mload(0xe20), mload(0xe40), f_q)) -mstore(0x1200, mulmod(mload(0xe60), mload(0xe80), f_q)) -mstore(0x1220, mulmod(mload(0xea0), mload(0xec0), f_q)) -mstore(0x1240, mulmod(mload(0xee0), mload(0xf00), f_q)) -mstore(0x1260, mulmod(mload(0xf20), mload(0xf40), f_q)) -{ - let result := mulmod(mload(0x1220), mload(0x20), f_q) -result := addmod(mulmod(mload(0x1240), mload(0x40), f_q), result, f_q) -result := addmod(mulmod(mload(0x1260), mload(0x60), f_q), result, f_q) -mstore(4736, result) - } -mstore(0x12a0, addmod(mload(0x5e0), mload(0x720), f_q)) -mstore(0x12c0, mulmod(mload(0x12a0), mload(0x12a0), f_q)) -mstore(0x12e0, mulmod(mload(0x12c0), mload(0x12c0), f_q)) -mstore(0x1300, mulmod(mload(0x12a0), mload(0x12e0), f_q)) -mstore(0x1320, mulmod(mload(0x1300), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) -mstore(0x1340, addmod(mload(0x600), mload(0x740), f_q)) -mstore(0x1360, mulmod(mload(0x1340), mload(0x1340), f_q)) -mstore(0x1380, mulmod(mload(0x1360), mload(0x1360), f_q)) -mstore(0x13a0, mulmod(mload(0x1340), mload(0x1380), f_q)) -mstore(0x13c0, mulmod(mload(0x13a0), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) -mstore(0x13e0, addmod(mload(0x1320), mload(0x13c0), f_q)) -mstore(0x1400, addmod(mload(0x13e0), sub(f_q, mload(0x620)), f_q)) -mstore(0x1420, mulmod(mload(0x1400), mload(0x7a0), f_q)) -mstore(0x1440, mulmod(mload(0x400), mload(0x1420), f_q)) -mstore(0x1460, mulmod(mload(0x1300), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) -mstore(0x1480, mulmod(mload(0x13a0), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) -mstore(0x14a0, addmod(mload(0x1460), mload(0x1480), f_q)) -mstore(0x14c0, addmod(mload(0x14a0), sub(f_q, mload(0x640)), f_q)) -mstore(0x14e0, mulmod(mload(0x14c0), mload(0x7a0), f_q)) -mstore(0x1500, addmod(mload(0x1440), mload(0x14e0), f_q)) -mstore(0x1520, mulmod(mload(0x400), mload(0x1500), f_q)) -mstore(0x1540, addmod(mload(0x1300), sub(f_q, mload(0x660)), f_q)) -mstore(0x1560, mulmod(mload(0x1540), mload(0x7c0), f_q)) -mstore(0x1580, addmod(mload(0x1520), mload(0x1560), f_q)) -mstore(0x15a0, mulmod(mload(0x400), mload(0x1580), f_q)) -mstore(0x15c0, mulmod(mload(0x660), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) -mstore(0x15e0, mulmod(mload(0x1340), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) -mstore(0x1600, addmod(mload(0x15c0), mload(0x15e0), f_q)) -mstore(0x1620, addmod(mload(0x1600), mload(0x6e0), f_q)) -mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q)) -mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q)) -mstore(0x1680, mulmod(mload(0x1620), mload(0x1660), f_q)) -mstore(0x16a0, mulmod(mload(0x620), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q)) -mstore(0x16c0, mulmod(mload(0x640), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q)) -mstore(0x16e0, addmod(mload(0x16a0), mload(0x16c0), f_q)) -mstore(0x1700, addmod(mload(0x1680), sub(f_q, mload(0x16e0)), f_q)) -mstore(0x1720, mulmod(mload(0x1700), mload(0x7c0), f_q)) -mstore(0x1740, addmod(mload(0x15a0), mload(0x1720), f_q)) -mstore(0x1760, mulmod(mload(0x400), mload(0x1740), f_q)) -mstore(0x1780, mulmod(mload(0x660), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) -mstore(0x17a0, mulmod(mload(0x1340), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) -mstore(0x17c0, addmod(mload(0x1780), mload(0x17a0), f_q)) -mstore(0x17e0, addmod(mload(0x17c0), mload(0x700), f_q)) -mstore(0x1800, mulmod(mload(0x620), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q)) -mstore(0x1820, mulmod(mload(0x640), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q)) -mstore(0x1840, addmod(mload(0x1800), mload(0x1820), f_q)) -mstore(0x1860, addmod(mload(0x17e0), sub(f_q, mload(0x1840)), f_q)) -mstore(0x1880, mulmod(mload(0x1860), mload(0x7c0), f_q)) -mstore(0x18a0, addmod(mload(0x1760), mload(0x1880), f_q)) -mstore(0x18c0, mulmod(mload(0x400), mload(0x18a0), f_q)) -mstore(0x18e0, addmod(1, sub(f_q, mload(0x780)), f_q)) -mstore(0x1900, mulmod(mload(0x18e0), mload(0x780), f_q)) -mstore(0x1920, addmod(2, sub(f_q, mload(0x780)), f_q)) -mstore(0x1940, mulmod(mload(0x1920), mload(0x1900), f_q)) -mstore(0x1960, addmod(3, sub(f_q, mload(0x780)), f_q)) -mstore(0x1980, mulmod(mload(0x1960), mload(0x1940), f_q)) -mstore(0x19a0, addmod(mload(0x6a0), mload(0x5e0), f_q)) -mstore(0x19c0, addmod(mload(0x19a0), sub(f_q, mload(0x620)), f_q)) -mstore(0x19e0, mulmod(mload(0x19c0), mload(0x1980), f_q)) -mstore(0x1a00, addmod(mload(0x18c0), mload(0x19e0), f_q)) -mstore(0x1a20, mulmod(mload(0x400), mload(0x1a00), f_q)) -mstore(0x1a40, addmod(mload(0x680), sub(f_q, mload(0x640)), f_q)) -mstore(0x1a60, mulmod(mload(0x1a40), mload(0x1980), f_q)) -mstore(0x1a80, addmod(mload(0x1a20), mload(0x1a60), f_q)) -mstore(0x1aa0, mulmod(mload(0x400), mload(0x1a80), f_q)) -mstore(0x1ac0, mulmod(mload(0x1920), mload(0x780), f_q)) -mstore(0x1ae0, mulmod(mload(0x1960), mload(0x1ac0), f_q)) -mstore(0x1b00, addmod(4, sub(f_q, mload(0x780)), f_q)) -mstore(0x1b20, mulmod(mload(0x1b00), mload(0x1ae0), f_q)) -mstore(0x1b40, mulmod(mload(0x660), mload(0x1b20), f_q)) -mstore(0x1b60, addmod(1, sub(f_q, mload(0x660)), f_q)) -mstore(0x1b80, mulmod(mload(0x1b60), mload(0x1b40), f_q)) -mstore(0x1ba0, addmod(mload(0x1aa0), mload(0x1b80), f_q)) -mstore(0x1bc0, mulmod(mload(0x400), mload(0x1ba0), f_q)) -mstore(0x1be0, mulmod(2, mload(0x660), f_q)) -mstore(0x1c00, addmod(mload(0x600), sub(f_q, mload(0x5e0)), f_q)) -mstore(0x1c20, mulmod(mload(0x1c00), mload(0x1be0), f_q)) -mstore(0x1c40, addmod(mload(0x620), sub(f_q, mload(0x5e0)), f_q)) -mstore(0x1c60, addmod(mload(0x1c20), sub(f_q, mload(0x1c40)), f_q)) -mstore(0x1c80, addmod(mload(0x600), sub(f_q, mload(0x640)), f_q)) -mstore(0x1ca0, addmod(mload(0x1c60), sub(f_q, mload(0x1c80)), f_q)) -mstore(0x1cc0, mulmod(mload(0x1ca0), mload(0x1b20), f_q)) -mstore(0x1ce0, addmod(mload(0x1bc0), mload(0x1cc0), f_q)) -mstore(0x1d00, mulmod(mload(0x400), mload(0x1ce0), f_q)) -mstore(0x1d20, mulmod(mload(0x1960), mload(0x1900), f_q)) -mstore(0x1d40, mulmod(mload(0x1b00), mload(0x1d20), f_q)) -mstore(0x1d60, addmod(mload(0x5e0), mload(0x600), f_q)) -mstore(0x1d80, addmod(mload(0x1d60), sub(f_q, mload(0x660)), f_q)) -mstore(0x1da0, mulmod(mload(0x1d80), mload(0x1d40), f_q)) -mstore(0x1dc0, addmod(mload(0x1d00), mload(0x1da0), f_q)) -mstore(0x1de0, mulmod(mload(0x400), mload(0x1dc0), f_q)) -mstore(0x1e00, addmod(mload(0x1de0), mload(0x1da0), f_q)) -mstore(0x1e20, mulmod(mload(0x400), mload(0x1e00), f_q)) -mstore(0x1e40, mulmod(mload(0x1b00), mload(0x1940), f_q)) -mstore(0x1e60, addmod(mload(0x5e0), sub(f_q, mload(0x600)), f_q)) -mstore(0x1e80, addmod(mload(0x1e60), 5192296858534827628530496329220096, f_q)) -mstore(0x1ea0, addmod(mload(0x1e80), sub(f_q, mload(0x660)), f_q)) -mstore(0x1ec0, mulmod(mload(0x1ea0), mload(0x1e40), f_q)) -mstore(0x1ee0, addmod(mload(0x1e20), mload(0x1ec0), f_q)) -mstore(0x1f00, mulmod(mload(0x400), mload(0x1ee0), f_q)) -mstore(0x1f20, addmod(1, sub(f_q, mload(0x8c0)), f_q)) -mstore(0x1f40, mulmod(mload(0x1f20), mload(0x1220), f_q)) -mstore(0x1f60, addmod(mload(0x1f00), mload(0x1f40), f_q)) -mstore(0x1f80, mulmod(mload(0x400), mload(0x1f60), f_q)) -mstore(0x1fa0, mulmod(mload(0x920), mload(0x920), f_q)) -mstore(0x1fc0, addmod(mload(0x1fa0), sub(f_q, mload(0x920)), f_q)) -mstore(0x1fe0, mulmod(mload(0x1fc0), mload(0x1160), f_q)) -mstore(0x2000, addmod(mload(0x1f80), mload(0x1fe0), f_q)) -mstore(0x2020, mulmod(mload(0x400), mload(0x2000), f_q)) -mstore(0x2040, addmod(mload(0x920), sub(f_q, mload(0x900)), f_q)) -mstore(0x2060, mulmod(mload(0x2040), mload(0x1220), f_q)) -mstore(0x2080, addmod(mload(0x2020), mload(0x2060), f_q)) -mstore(0x20a0, mulmod(mload(0x400), mload(0x2080), f_q)) -mstore(0x20c0, addmod(1, sub(f_q, mload(0x1160)), f_q)) -mstore(0x20e0, addmod(mload(0x1180), mload(0x11a0), f_q)) -mstore(0x2100, addmod(mload(0x20e0), mload(0x11c0), f_q)) -mstore(0x2120, addmod(mload(0x2100), mload(0x11e0), f_q)) -mstore(0x2140, addmod(mload(0x2120), mload(0x1200), f_q)) -mstore(0x2160, addmod(mload(0x20c0), sub(f_q, mload(0x2140)), f_q)) -mstore(0x2180, mulmod(mload(0x800), mload(0x240), f_q)) -mstore(0x21a0, addmod(mload(0x6e0), mload(0x2180), f_q)) -mstore(0x21c0, addmod(mload(0x21a0), mload(0x2a0), f_q)) -mstore(0x21e0, mulmod(mload(0x820), mload(0x240), f_q)) -mstore(0x2200, addmod(mload(0x5e0), mload(0x21e0), f_q)) -mstore(0x2220, addmod(mload(0x2200), mload(0x2a0), f_q)) -mstore(0x2240, mulmod(mload(0x2220), mload(0x21c0), f_q)) -mstore(0x2260, mulmod(mload(0x840), mload(0x240), f_q)) -mstore(0x2280, addmod(mload(0x600), mload(0x2260), f_q)) -mstore(0x22a0, addmod(mload(0x2280), mload(0x2a0), f_q)) -mstore(0x22c0, mulmod(mload(0x22a0), mload(0x2240), f_q)) -mstore(0x22e0, mulmod(mload(0x860), mload(0x240), f_q)) -mstore(0x2300, addmod(mload(0x700), mload(0x22e0), f_q)) -mstore(0x2320, addmod(mload(0x2300), mload(0x2a0), f_q)) -mstore(0x2340, mulmod(mload(0x2320), mload(0x22c0), f_q)) -mstore(0x2360, mulmod(mload(0x2340), mload(0x8e0), f_q)) -mstore(0x2380, mulmod(1, mload(0x240), f_q)) -mstore(0x23a0, mulmod(mload(0x5a0), mload(0x2380), f_q)) -mstore(0x23c0, addmod(mload(0x6e0), mload(0x23a0), f_q)) -mstore(0x23e0, addmod(mload(0x23c0), mload(0x2a0), f_q)) -mstore(0x2400, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x240), f_q)) -mstore(0x2420, mulmod(mload(0x5a0), mload(0x2400), f_q)) -mstore(0x2440, addmod(mload(0x5e0), mload(0x2420), f_q)) -mstore(0x2460, addmod(mload(0x2440), mload(0x2a0), f_q)) -mstore(0x2480, mulmod(mload(0x2460), mload(0x23e0), f_q)) -mstore(0x24a0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x240), f_q)) -mstore(0x24c0, mulmod(mload(0x5a0), mload(0x24a0), f_q)) -mstore(0x24e0, addmod(mload(0x600), mload(0x24c0), f_q)) -mstore(0x2500, addmod(mload(0x24e0), mload(0x2a0), f_q)) -mstore(0x2520, mulmod(mload(0x2500), mload(0x2480), f_q)) -mstore(0x2540, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x240), f_q)) -mstore(0x2560, mulmod(mload(0x5a0), mload(0x2540), f_q)) -mstore(0x2580, addmod(mload(0x700), mload(0x2560), f_q)) -mstore(0x25a0, addmod(mload(0x2580), mload(0x2a0), f_q)) -mstore(0x25c0, mulmod(mload(0x25a0), mload(0x2520), f_q)) -mstore(0x25e0, mulmod(mload(0x25c0), mload(0x8c0), f_q)) -mstore(0x2600, addmod(mload(0x2360), sub(f_q, mload(0x25e0)), f_q)) -mstore(0x2620, mulmod(mload(0x2600), mload(0x2160), f_q)) -mstore(0x2640, addmod(mload(0x20a0), mload(0x2620), f_q)) -mstore(0x2660, mulmod(mload(0x400), mload(0x2640), f_q)) -mstore(0x2680, mulmod(mload(0x880), mload(0x240), f_q)) -mstore(0x26a0, addmod(mload(0x660), mload(0x2680), f_q)) -mstore(0x26c0, addmod(mload(0x26a0), mload(0x2a0), f_q)) -mstore(0x26e0, mulmod(mload(0x8a0), mload(0x240), f_q)) -mstore(0x2700, addmod(mload(0x1280), mload(0x26e0), f_q)) -mstore(0x2720, addmod(mload(0x2700), mload(0x2a0), f_q)) -mstore(0x2740, mulmod(mload(0x2720), mload(0x26c0), f_q)) -mstore(0x2760, mulmod(mload(0x2740), mload(0x940), f_q)) -mstore(0x2780, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x240), f_q)) -mstore(0x27a0, mulmod(mload(0x5a0), mload(0x2780), f_q)) -mstore(0x27c0, addmod(mload(0x660), mload(0x27a0), f_q)) -mstore(0x27e0, addmod(mload(0x27c0), mload(0x2a0), f_q)) -mstore(0x2800, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x240), f_q)) -mstore(0x2820, mulmod(mload(0x5a0), mload(0x2800), f_q)) -mstore(0x2840, addmod(mload(0x1280), mload(0x2820), f_q)) -mstore(0x2860, addmod(mload(0x2840), mload(0x2a0), f_q)) -mstore(0x2880, mulmod(mload(0x2860), mload(0x27e0), f_q)) -mstore(0x28a0, mulmod(mload(0x2880), mload(0x920), f_q)) -mstore(0x28c0, addmod(mload(0x2760), sub(f_q, mload(0x28a0)), f_q)) -mstore(0x28e0, mulmod(mload(0x28c0), mload(0x2160), f_q)) -mstore(0x2900, addmod(mload(0x2660), mload(0x28e0), f_q)) -mstore(0x2920, mulmod(mload(0x400), mload(0x2900), f_q)) -mstore(0x2940, addmod(1, sub(f_q, mload(0x960)), f_q)) -mstore(0x2960, mulmod(mload(0x2940), mload(0x1220), f_q)) -mstore(0x2980, addmod(mload(0x2920), mload(0x2960), f_q)) -mstore(0x29a0, mulmod(mload(0x400), mload(0x2980), f_q)) -mstore(0x29c0, mulmod(mload(0x960), mload(0x960), f_q)) -mstore(0x29e0, addmod(mload(0x29c0), sub(f_q, mload(0x960)), f_q)) -mstore(0x2a00, mulmod(mload(0x29e0), mload(0x1160), f_q)) -mstore(0x2a20, addmod(mload(0x29a0), mload(0x2a00), f_q)) -mstore(0x2a40, mulmod(mload(0x400), mload(0x2a20), f_q)) -mstore(0x2a60, addmod(mload(0x9a0), mload(0x240), f_q)) -mstore(0x2a80, mulmod(mload(0x2a60), mload(0x980), f_q)) -mstore(0x2aa0, addmod(mload(0x9e0), mload(0x2a0), f_q)) -mstore(0x2ac0, mulmod(mload(0x2aa0), mload(0x2a80), f_q)) -mstore(0x2ae0, mulmod(256, mload(0x6c0), f_q)) -mstore(0x2b00, addmod(mload(0x660), sub(f_q, mload(0x2ae0)), f_q)) -mstore(0x2b20, mulmod(mload(0x2b00), mload(0x760), f_q)) -mstore(0x2b40, addmod(mload(0x2b20), mload(0x240), f_q)) -mstore(0x2b60, mulmod(mload(0x2b40), mload(0x960), f_q)) -mstore(0x2b80, addmod(mload(0x720), mload(0x2a0), f_q)) -mstore(0x2ba0, mulmod(mload(0x2b80), mload(0x2b60), f_q)) -mstore(0x2bc0, addmod(mload(0x2ac0), sub(f_q, mload(0x2ba0)), f_q)) -mstore(0x2be0, mulmod(mload(0x2bc0), mload(0x2160), f_q)) -mstore(0x2c00, addmod(mload(0x2a40), mload(0x2be0), f_q)) -mstore(0x2c20, mulmod(mload(0x400), mload(0x2c00), f_q)) -mstore(0x2c40, addmod(mload(0x9a0), sub(f_q, mload(0x9e0)), f_q)) -mstore(0x2c60, mulmod(mload(0x2c40), mload(0x1220), f_q)) -mstore(0x2c80, addmod(mload(0x2c20), mload(0x2c60), f_q)) -mstore(0x2ca0, mulmod(mload(0x400), mload(0x2c80), f_q)) -mstore(0x2cc0, mulmod(mload(0x2c40), mload(0x2160), f_q)) -mstore(0x2ce0, addmod(mload(0x9a0), sub(f_q, mload(0x9c0)), f_q)) -mstore(0x2d00, mulmod(mload(0x2ce0), mload(0x2cc0), f_q)) -mstore(0x2d20, addmod(mload(0x2ca0), mload(0x2d00), f_q)) -mstore(0x2d40, mulmod(mload(0xcc0), mload(0xcc0), f_q)) -mstore(0x2d60, mulmod(mload(0x2d40), mload(0xcc0), f_q)) -mstore(0x2d80, mulmod(mload(0x2d60), mload(0xcc0), f_q)) -mstore(0x2da0, mulmod(mload(0x2d80), mload(0xcc0), f_q)) -mstore(0x2dc0, mulmod(1, mload(0xcc0), f_q)) -mstore(0x2de0, mulmod(1, mload(0x2d40), f_q)) -mstore(0x2e00, mulmod(1, mload(0x2d60), f_q)) -mstore(0x2e20, mulmod(1, mload(0x2d80), f_q)) -mstore(0x2e40, mulmod(mload(0x2d20), mload(0xce0), f_q)) -mstore(0x2e60, mulmod(mload(0xba0), mload(0x5a0), f_q)) -mstore(0x2e80, mulmod(mload(0x5a0), 1, f_q)) -mstore(0x2ea0, addmod(mload(0xb20), sub(f_q, mload(0x2e80)), f_q)) -mstore(0x2ec0, mulmod(mload(0x5a0), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q)) -mstore(0x2ee0, addmod(mload(0xb20), sub(f_q, mload(0x2ec0)), f_q)) -mstore(0x2f00, mulmod(mload(0x5a0), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q)) -mstore(0x2f20, addmod(mload(0xb20), sub(f_q, mload(0x2f00)), f_q)) -mstore(0x2f40, mulmod(mload(0x5a0), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q)) -mstore(0x2f60, addmod(mload(0xb20), sub(f_q, mload(0x2f40)), f_q)) -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 19470333053884630052643688193991482022807116448657043890197497819686199857828, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 2417909817954645169602717551265793065741247951758990453500706366889608637789, f_q), f_q), result, f_q) -mstore(12160, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 13686227242150003628673578706486473027501243666075718775893288845164412632930, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 10079503758141076467065204586507257535549232608832327988764044976944819876346, f_q), f_q), result, f_q) -mstore(12192, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 18715936898160381416714524359517348601997944075114713669820885373469568354766, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 15375775075249615866494035504844970190233299190010037655541891534730124992278, f_q), f_q), result, f_q) -mstore(12224, result) - } -mstore(0x2fe0, mulmod(1, mload(0x2ea0), f_q)) -mstore(0x3000, mulmod(mload(0x2fe0), mload(0x2f60), f_q)) -mstore(0x3020, mulmod(mload(0x3000), mload(0x2ee0), f_q)) -{ - let result := mulmod(mload(0xb20), mulmod(mload(0x5a0), 2507682784038009475131574039120954579123549720846755509306663987687515178117, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0x5a0), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q), result, f_q) -mstore(12352, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0x5a0), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0x5a0), 13127608231681926238307118629157549705911918406946061530612285695988519678593, f_q), f_q), result, f_q) -mstore(12384, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 16140595808673403009154643164823336476463527776677864878778453135559733237044, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 5747647063165872213091762580433938612084836623738169464919751051016075258573, f_q), f_q), result, f_q) -mstore(12416, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 17015964487361230672162623735654618573844832338054897787312333529290879253714, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 3176732791729641355588945816447819802711920387939493967460175841862547409845, f_q), f_q), result, f_q) -mstore(12448, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0xba0), 19187508498431587163140984396833674282302409422288044257471288693049179355069, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0xba0), 17472297497993506786357772047295541913219081564856233764575529621311665103799, f_q), f_q), result, f_q) -mstore(12480, result) - } -mstore(0x30e0, mulmod(mload(0x3000), mload(0x2f20), f_q)) -{ - let result := mulmod(mload(0xb20), mulmod(mload(0x5a0), 16962650269846620577512114154870527443683566727810288380890833831998684679711, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0x5a0), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q), result, f_q) -mstore(12544, result) - } -{ - let result := mulmod(mload(0xb20), mulmod(mload(0x5a0), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q) -result := addmod(mulmod(mload(0x5a0), mulmod(mload(0x5a0), 664623189640884330400307346618971907426870604454565164570654825418724962734, f_q), f_q), result, f_q) -mstore(12576, result) - } -mstore(0x3140, mulmod(mload(0x2fe0), mload(0x2ee0), f_q)) -{ - let result := mulmod(mload(0xb20), 1, f_q) -result := addmod(mulmod(mload(0x5a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q) -mstore(12640, result) - } -{ - let prod := mload(0x2f80) - - prod := mulmod(mload(0x2fa0), prod, f_q) - mstore(0x3180, prod) - - prod := mulmod(mload(0x2fc0), prod, f_q) - mstore(0x31a0, prod) - - prod := mulmod(mload(0x3040), prod, f_q) - mstore(0x31c0, prod) - - prod := mulmod(mload(0x3060), prod, f_q) - mstore(0x31e0, prod) - - prod := mulmod(mload(0x3000), prod, f_q) - mstore(0x3200, prod) - - prod := mulmod(mload(0x3080), prod, f_q) - mstore(0x3220, prod) - - prod := mulmod(mload(0x30a0), prod, f_q) - mstore(0x3240, prod) - - prod := mulmod(mload(0x30c0), prod, f_q) - mstore(0x3260, prod) - - prod := mulmod(mload(0x30e0), prod, f_q) - mstore(0x3280, prod) - - prod := mulmod(mload(0x3100), prod, f_q) - mstore(0x32a0, prod) - - prod := mulmod(mload(0x3120), prod, f_q) - mstore(0x32c0, prod) - - prod := mulmod(mload(0x3140), prod, f_q) - mstore(0x32e0, prod) - - prod := mulmod(mload(0x3160), prod, f_q) - mstore(0x3300, prod) - - prod := mulmod(mload(0x2fe0), prod, f_q) - mstore(0x3320, prod) - - } -mstore(0x3360, 32) -mstore(0x3380, 32) -mstore(0x33a0, 32) -mstore(0x33c0, mload(0x3320)) -mstore(0x33e0, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x3400, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x3360, 0xc0, 0x3340, 0x20), 1), success) -{ - - let inv := mload(0x3340) - let v - - v := mload(0x2fe0) - mstore(12256, mulmod(mload(0x3300), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3160) - mstore(12640, mulmod(mload(0x32e0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3140) - mstore(12608, mulmod(mload(0x32c0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3120) - mstore(12576, mulmod(mload(0x32a0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3100) - mstore(12544, mulmod(mload(0x3280), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x30e0) - mstore(12512, mulmod(mload(0x3260), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x30c0) - mstore(12480, mulmod(mload(0x3240), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x30a0) - mstore(12448, mulmod(mload(0x3220), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3080) - mstore(12416, mulmod(mload(0x3200), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3000) - mstore(12288, mulmod(mload(0x31e0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3060) - mstore(12384, mulmod(mload(0x31c0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3040) - mstore(12352, mulmod(mload(0x31a0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x2fc0) - mstore(12224, mulmod(mload(0x3180), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x2fa0) - mstore(12192, mulmod(mload(0x2f80), inv, f_q)) - inv := mulmod(v, inv, f_q) - mstore(0x2f80, inv) - - } -{ - let result := mload(0x2f80) -result := addmod(mload(0x2fa0), result, f_q) -result := addmod(mload(0x2fc0), result, f_q) -mstore(13344, result) - } -mstore(0x3440, mulmod(mload(0x3020), mload(0x3000), f_q)) -{ - let result := mload(0x3040) -result := addmod(mload(0x3060), result, f_q) -mstore(13408, result) - } -mstore(0x3480, mulmod(mload(0x3020), mload(0x30e0), f_q)) -{ - let result := mload(0x3080) -result := addmod(mload(0x30a0), result, f_q) -result := addmod(mload(0x30c0), result, f_q) -mstore(13472, result) - } -mstore(0x34c0, mulmod(mload(0x3020), mload(0x3140), f_q)) -{ - let result := mload(0x3100) -result := addmod(mload(0x3120), result, f_q) -mstore(13536, result) - } -mstore(0x3500, mulmod(mload(0x3020), mload(0x2fe0), f_q)) -{ - let result := mload(0x3160) -mstore(13600, result) - } -{ - let prod := mload(0x3420) - - prod := mulmod(mload(0x3460), prod, f_q) - mstore(0x3540, prod) - - prod := mulmod(mload(0x34a0), prod, f_q) - mstore(0x3560, prod) - - prod := mulmod(mload(0x34e0), prod, f_q) - mstore(0x3580, prod) - - prod := mulmod(mload(0x3520), prod, f_q) - mstore(0x35a0, prod) - - } -mstore(0x35e0, 32) -mstore(0x3600, 32) -mstore(0x3620, 32) -mstore(0x3640, mload(0x35a0)) -mstore(0x3660, 21888242871839275222246405745257275088548364400416034343698204186575808495615) -mstore(0x3680, 21888242871839275222246405745257275088548364400416034343698204186575808495617) -success := and(eq(staticcall(gas(), 0x5, 0x35e0, 0xc0, 0x35c0, 0x20), 1), success) -{ - - let inv := mload(0x35c0) - let v - - v := mload(0x3520) - mstore(13600, mulmod(mload(0x3580), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x34e0) - mstore(13536, mulmod(mload(0x3560), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x34a0) - mstore(13472, mulmod(mload(0x3540), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3460) - mstore(13408, mulmod(mload(0x3420), inv, f_q)) - inv := mulmod(v, inv, f_q) - mstore(0x3420, inv) - - } -mstore(0x36a0, mulmod(mload(0x3440), mload(0x3460), f_q)) -mstore(0x36c0, mulmod(mload(0x3480), mload(0x34a0), f_q)) -mstore(0x36e0, mulmod(mload(0x34c0), mload(0x34e0), f_q)) -mstore(0x3700, mulmod(mload(0x3500), mload(0x3520), f_q)) -mstore(0x3720, mulmod(mload(0xa20), mload(0xa20), f_q)) -mstore(0x3740, mulmod(mload(0x3720), mload(0xa20), f_q)) -mstore(0x3760, mulmod(mload(0x3740), mload(0xa20), f_q)) -mstore(0x3780, mulmod(mload(0x3760), mload(0xa20), f_q)) -mstore(0x37a0, mulmod(mload(0x3780), mload(0xa20), f_q)) -mstore(0x37c0, mulmod(mload(0x37a0), mload(0xa20), f_q)) -mstore(0x37e0, mulmod(mload(0x37c0), mload(0xa20), f_q)) -mstore(0x3800, mulmod(mload(0x37e0), mload(0xa20), f_q)) -mstore(0x3820, mulmod(mload(0x3800), mload(0xa20), f_q)) -mstore(0x3840, mulmod(mload(0x3820), mload(0xa20), f_q)) -mstore(0x3860, mulmod(mload(0x3840), mload(0xa20), f_q)) -mstore(0x3880, mulmod(mload(0x3860), mload(0xa20), f_q)) -mstore(0x38a0, mulmod(mload(0x3880), mload(0xa20), f_q)) -mstore(0x38c0, mulmod(mload(0x38a0), mload(0xa20), f_q)) -mstore(0x38e0, mulmod(mload(0x38c0), mload(0xa20), f_q)) -mstore(0x3900, mulmod(mload(0x38e0), mload(0xa20), f_q)) -mstore(0x3920, mulmod(mload(0xa80), mload(0xa80), f_q)) -mstore(0x3940, mulmod(mload(0x3920), mload(0xa80), f_q)) -mstore(0x3960, mulmod(mload(0x3940), mload(0xa80), f_q)) -mstore(0x3980, mulmod(mload(0x3960), mload(0xa80), f_q)) -{ - let result := mulmod(mload(0x5e0), mload(0x2f80), f_q) -result := addmod(mulmod(mload(0x620), mload(0x2fa0), f_q), result, f_q) -result := addmod(mulmod(mload(0x6a0), mload(0x2fc0), f_q), result, f_q) -mstore(14752, result) - } -mstore(0x39c0, mulmod(mload(0x39a0), mload(0x3420), f_q)) -mstore(0x39e0, mulmod(sub(f_q, mload(0x39c0)), 1, f_q)) -{ - let result := mulmod(mload(0x600), mload(0x2f80), f_q) -result := addmod(mulmod(mload(0x640), mload(0x2fa0), f_q), result, f_q) -result := addmod(mulmod(mload(0x680), mload(0x2fc0), f_q), result, f_q) -mstore(14848, result) - } -mstore(0x3a20, mulmod(mload(0x3a00), mload(0x3420), f_q)) -mstore(0x3a40, mulmod(sub(f_q, mload(0x3a20)), mload(0xa20), f_q)) -mstore(0x3a60, mulmod(1, mload(0xa20), f_q)) -mstore(0x3a80, addmod(mload(0x39e0), mload(0x3a40), f_q)) -mstore(0x3aa0, mulmod(mload(0x3a80), 1, f_q)) -mstore(0x3ac0, mulmod(mload(0x3a60), 1, f_q)) -mstore(0x3ae0, mulmod(1, mload(0x3440), f_q)) -{ - let result := mulmod(mload(0x660), mload(0x3040), f_q) -result := addmod(mulmod(mload(0x6c0), mload(0x3060), f_q), result, f_q) -mstore(15104, result) - } -mstore(0x3b20, mulmod(mload(0x3b00), mload(0x36a0), f_q)) -mstore(0x3b40, mulmod(sub(f_q, mload(0x3b20)), 1, f_q)) -mstore(0x3b60, mulmod(mload(0x3ae0), 1, f_q)) -{ - let result := mulmod(mload(0x920), mload(0x3040), f_q) -result := addmod(mulmod(mload(0x940), mload(0x3060), f_q), result, f_q) -mstore(15232, result) - } -mstore(0x3ba0, mulmod(mload(0x3b80), mload(0x36a0), f_q)) -mstore(0x3bc0, mulmod(sub(f_q, mload(0x3ba0)), mload(0xa20), f_q)) -mstore(0x3be0, mulmod(mload(0x3ae0), mload(0xa20), f_q)) -mstore(0x3c00, addmod(mload(0x3b40), mload(0x3bc0), f_q)) -{ - let result := mulmod(mload(0x960), mload(0x3040), f_q) -result := addmod(mulmod(mload(0x980), mload(0x3060), f_q), result, f_q) -mstore(15392, result) - } -mstore(0x3c40, mulmod(mload(0x3c20), mload(0x36a0), f_q)) -mstore(0x3c60, mulmod(sub(f_q, mload(0x3c40)), mload(0x3720), f_q)) -mstore(0x3c80, mulmod(mload(0x3ae0), mload(0x3720), f_q)) -mstore(0x3ca0, addmod(mload(0x3c00), mload(0x3c60), f_q)) -mstore(0x3cc0, mulmod(mload(0x3ca0), mload(0xa80), f_q)) -mstore(0x3ce0, mulmod(mload(0x3b60), mload(0xa80), f_q)) -mstore(0x3d00, mulmod(mload(0x3be0), mload(0xa80), f_q)) -mstore(0x3d20, mulmod(mload(0x3c80), mload(0xa80), f_q)) -mstore(0x3d40, addmod(mload(0x3aa0), mload(0x3cc0), f_q)) -mstore(0x3d60, mulmod(1, mload(0x3480), f_q)) -{ - let result := mulmod(mload(0x8c0), mload(0x3080), f_q) -result := addmod(mulmod(mload(0x8e0), mload(0x30a0), f_q), result, f_q) -result := addmod(mulmod(mload(0x900), mload(0x30c0), f_q), result, f_q) -mstore(15744, result) - } -mstore(0x3da0, mulmod(mload(0x3d80), mload(0x36c0), f_q)) -mstore(0x3dc0, mulmod(sub(f_q, mload(0x3da0)), 1, f_q)) -mstore(0x3de0, mulmod(mload(0x3d60), 1, f_q)) -mstore(0x3e00, mulmod(mload(0x3dc0), mload(0x3920), f_q)) -mstore(0x3e20, mulmod(mload(0x3de0), mload(0x3920), f_q)) -mstore(0x3e40, addmod(mload(0x3d40), mload(0x3e00), f_q)) -mstore(0x3e60, mulmod(1, mload(0x34c0), f_q)) -{ - let result := mulmod(mload(0x9a0), mload(0x3100), f_q) -result := addmod(mulmod(mload(0x9c0), mload(0x3120), f_q), result, f_q) -mstore(16000, result) - } -mstore(0x3ea0, mulmod(mload(0x3e80), mload(0x36e0), f_q)) -mstore(0x3ec0, mulmod(sub(f_q, mload(0x3ea0)), 1, f_q)) -mstore(0x3ee0, mulmod(mload(0x3e60), 1, f_q)) -mstore(0x3f00, mulmod(mload(0x3ec0), mload(0x3940), f_q)) -mstore(0x3f20, mulmod(mload(0x3ee0), mload(0x3940), f_q)) -mstore(0x3f40, addmod(mload(0x3e40), mload(0x3f00), f_q)) -mstore(0x3f60, mulmod(1, mload(0x3500), f_q)) -{ - let result := mulmod(mload(0x9e0), mload(0x3160), f_q) -mstore(16256, result) - } -mstore(0x3fa0, mulmod(mload(0x3f80), mload(0x3700), f_q)) -mstore(0x3fc0, mulmod(sub(f_q, mload(0x3fa0)), 1, f_q)) -mstore(0x3fe0, mulmod(mload(0x3f60), 1, f_q)) -{ - let result := mulmod(mload(0x6e0), mload(0x3160), f_q) -mstore(16384, result) - } -mstore(0x4020, mulmod(mload(0x4000), mload(0x3700), f_q)) -mstore(0x4040, mulmod(sub(f_q, mload(0x4020)), mload(0xa20), f_q)) -mstore(0x4060, mulmod(mload(0x3f60), mload(0xa20), f_q)) -mstore(0x4080, addmod(mload(0x3fc0), mload(0x4040), f_q)) -{ - let result := mulmod(mload(0x700), mload(0x3160), f_q) -mstore(16544, result) - } -mstore(0x40c0, mulmod(mload(0x40a0), mload(0x3700), f_q)) -mstore(0x40e0, mulmod(sub(f_q, mload(0x40c0)), mload(0x3720), f_q)) -mstore(0x4100, mulmod(mload(0x3f60), mload(0x3720), f_q)) -mstore(0x4120, addmod(mload(0x4080), mload(0x40e0), f_q)) -{ - let result := mulmod(mload(0x720), mload(0x3160), f_q) -mstore(16704, result) - } -mstore(0x4160, mulmod(mload(0x4140), mload(0x3700), f_q)) -mstore(0x4180, mulmod(sub(f_q, mload(0x4160)), mload(0x3740), f_q)) -mstore(0x41a0, mulmod(mload(0x3f60), mload(0x3740), f_q)) -mstore(0x41c0, addmod(mload(0x4120), mload(0x4180), f_q)) -{ - let result := mulmod(mload(0x740), mload(0x3160), f_q) -mstore(16864, result) - } -mstore(0x4200, mulmod(mload(0x41e0), mload(0x3700), f_q)) -mstore(0x4220, mulmod(sub(f_q, mload(0x4200)), mload(0x3760), f_q)) -mstore(0x4240, mulmod(mload(0x3f60), mload(0x3760), f_q)) -mstore(0x4260, addmod(mload(0x41c0), mload(0x4220), f_q)) -{ - let result := mulmod(mload(0x760), mload(0x3160), f_q) -mstore(17024, result) - } -mstore(0x42a0, mulmod(mload(0x4280), mload(0x3700), f_q)) -mstore(0x42c0, mulmod(sub(f_q, mload(0x42a0)), mload(0x3780), f_q)) -mstore(0x42e0, mulmod(mload(0x3f60), mload(0x3780), f_q)) -mstore(0x4300, addmod(mload(0x4260), mload(0x42c0), f_q)) -{ - let result := mulmod(mload(0x780), mload(0x3160), f_q) -mstore(17184, result) - } -mstore(0x4340, mulmod(mload(0x4320), mload(0x3700), f_q)) -mstore(0x4360, mulmod(sub(f_q, mload(0x4340)), mload(0x37a0), f_q)) -mstore(0x4380, mulmod(mload(0x3f60), mload(0x37a0), f_q)) -mstore(0x43a0, addmod(mload(0x4300), mload(0x4360), f_q)) -{ - let result := mulmod(mload(0x7a0), mload(0x3160), f_q) -mstore(17344, result) - } -mstore(0x43e0, mulmod(mload(0x43c0), mload(0x3700), f_q)) -mstore(0x4400, mulmod(sub(f_q, mload(0x43e0)), mload(0x37c0), f_q)) -mstore(0x4420, mulmod(mload(0x3f60), mload(0x37c0), f_q)) -mstore(0x4440, addmod(mload(0x43a0), mload(0x4400), f_q)) -{ - let result := mulmod(mload(0x7c0), mload(0x3160), f_q) -mstore(17504, result) - } -mstore(0x4480, mulmod(mload(0x4460), mload(0x3700), f_q)) -mstore(0x44a0, mulmod(sub(f_q, mload(0x4480)), mload(0x37e0), f_q)) -mstore(0x44c0, mulmod(mload(0x3f60), mload(0x37e0), f_q)) -mstore(0x44e0, addmod(mload(0x4440), mload(0x44a0), f_q)) -{ - let result := mulmod(mload(0x800), mload(0x3160), f_q) -mstore(17664, result) - } -mstore(0x4520, mulmod(mload(0x4500), mload(0x3700), f_q)) -mstore(0x4540, mulmod(sub(f_q, mload(0x4520)), mload(0x3800), f_q)) -mstore(0x4560, mulmod(mload(0x3f60), mload(0x3800), f_q)) -mstore(0x4580, addmod(mload(0x44e0), mload(0x4540), f_q)) -{ - let result := mulmod(mload(0x820), mload(0x3160), f_q) -mstore(17824, result) - } -mstore(0x45c0, mulmod(mload(0x45a0), mload(0x3700), f_q)) -mstore(0x45e0, mulmod(sub(f_q, mload(0x45c0)), mload(0x3820), f_q)) -mstore(0x4600, mulmod(mload(0x3f60), mload(0x3820), f_q)) -mstore(0x4620, addmod(mload(0x4580), mload(0x45e0), f_q)) -{ - let result := mulmod(mload(0x840), mload(0x3160), f_q) -mstore(17984, result) - } -mstore(0x4660, mulmod(mload(0x4640), mload(0x3700), f_q)) -mstore(0x4680, mulmod(sub(f_q, mload(0x4660)), mload(0x3840), f_q)) -mstore(0x46a0, mulmod(mload(0x3f60), mload(0x3840), f_q)) -mstore(0x46c0, addmod(mload(0x4620), mload(0x4680), f_q)) -{ - let result := mulmod(mload(0x860), mload(0x3160), f_q) -mstore(18144, result) - } -mstore(0x4700, mulmod(mload(0x46e0), mload(0x3700), f_q)) -mstore(0x4720, mulmod(sub(f_q, mload(0x4700)), mload(0x3860), f_q)) -mstore(0x4740, mulmod(mload(0x3f60), mload(0x3860), f_q)) -mstore(0x4760, addmod(mload(0x46c0), mload(0x4720), f_q)) -{ - let result := mulmod(mload(0x880), mload(0x3160), f_q) -mstore(18304, result) - } -mstore(0x47a0, mulmod(mload(0x4780), mload(0x3700), f_q)) -mstore(0x47c0, mulmod(sub(f_q, mload(0x47a0)), mload(0x3880), f_q)) -mstore(0x47e0, mulmod(mload(0x3f60), mload(0x3880), f_q)) -mstore(0x4800, addmod(mload(0x4760), mload(0x47c0), f_q)) -{ - let result := mulmod(mload(0x8a0), mload(0x3160), f_q) -mstore(18464, result) - } -mstore(0x4840, mulmod(mload(0x4820), mload(0x3700), f_q)) -mstore(0x4860, mulmod(sub(f_q, mload(0x4840)), mload(0x38a0), f_q)) -mstore(0x4880, mulmod(mload(0x3f60), mload(0x38a0), f_q)) -mstore(0x48a0, addmod(mload(0x4800), mload(0x4860), f_q)) -mstore(0x48c0, mulmod(mload(0x2dc0), mload(0x3500), f_q)) -mstore(0x48e0, mulmod(mload(0x2de0), mload(0x3500), f_q)) -mstore(0x4900, mulmod(mload(0x2e00), mload(0x3500), f_q)) -mstore(0x4920, mulmod(mload(0x2e20), mload(0x3500), f_q)) -{ - let result := mulmod(mload(0x2e40), mload(0x3160), f_q) -mstore(18752, result) - } -mstore(0x4960, mulmod(mload(0x4940), mload(0x3700), f_q)) -mstore(0x4980, mulmod(sub(f_q, mload(0x4960)), mload(0x38c0), f_q)) -mstore(0x49a0, mulmod(mload(0x3f60), mload(0x38c0), f_q)) -mstore(0x49c0, mulmod(mload(0x48c0), mload(0x38c0), f_q)) -mstore(0x49e0, mulmod(mload(0x48e0), mload(0x38c0), f_q)) -mstore(0x4a00, mulmod(mload(0x4900), mload(0x38c0), f_q)) -mstore(0x4a20, mulmod(mload(0x4920), mload(0x38c0), f_q)) -mstore(0x4a40, addmod(mload(0x48a0), mload(0x4980), f_q)) -{ - let result := mulmod(mload(0x7e0), mload(0x3160), f_q) -mstore(19040, result) - } -mstore(0x4a80, mulmod(mload(0x4a60), mload(0x3700), f_q)) -mstore(0x4aa0, mulmod(sub(f_q, mload(0x4a80)), mload(0x38e0), f_q)) -mstore(0x4ac0, mulmod(mload(0x3f60), mload(0x38e0), f_q)) -mstore(0x4ae0, addmod(mload(0x4a40), mload(0x4aa0), f_q)) -mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x3960), f_q)) -mstore(0x4b20, mulmod(mload(0x3fe0), mload(0x3960), f_q)) -mstore(0x4b40, mulmod(mload(0x4060), mload(0x3960), f_q)) -mstore(0x4b60, mulmod(mload(0x4100), mload(0x3960), f_q)) -mstore(0x4b80, mulmod(mload(0x41a0), mload(0x3960), f_q)) -mstore(0x4ba0, mulmod(mload(0x4240), mload(0x3960), f_q)) -mstore(0x4bc0, mulmod(mload(0x42e0), mload(0x3960), f_q)) -mstore(0x4be0, mulmod(mload(0x4380), mload(0x3960), f_q)) -mstore(0x4c00, mulmod(mload(0x4420), mload(0x3960), f_q)) -mstore(0x4c20, mulmod(mload(0x44c0), mload(0x3960), f_q)) -mstore(0x4c40, mulmod(mload(0x4560), mload(0x3960), f_q)) -mstore(0x4c60, mulmod(mload(0x4600), mload(0x3960), f_q)) -mstore(0x4c80, mulmod(mload(0x46a0), mload(0x3960), f_q)) -mstore(0x4ca0, mulmod(mload(0x4740), mload(0x3960), f_q)) -mstore(0x4cc0, mulmod(mload(0x47e0), mload(0x3960), f_q)) -mstore(0x4ce0, mulmod(mload(0x4880), mload(0x3960), f_q)) -mstore(0x4d00, mulmod(mload(0x49a0), mload(0x3960), f_q)) -mstore(0x4d20, mulmod(mload(0x49c0), mload(0x3960), f_q)) -mstore(0x4d40, mulmod(mload(0x49e0), mload(0x3960), f_q)) -mstore(0x4d60, mulmod(mload(0x4a00), mload(0x3960), f_q)) -mstore(0x4d80, mulmod(mload(0x4a20), mload(0x3960), f_q)) -mstore(0x4da0, mulmod(mload(0x4ac0), mload(0x3960), f_q)) -mstore(0x4dc0, addmod(mload(0x3f40), mload(0x4b00), f_q)) -mstore(0x4de0, mulmod(1, mload(0x3020), f_q)) -mstore(0x4e00, mulmod(1, mload(0xb20), f_q)) -mstore(0x4e20, 0x0000000000000000000000000000000000000000000000000000000000000001) - mstore(0x4e40, 0x0000000000000000000000000000000000000000000000000000000000000002) -mstore(0x4e60, mload(0x4dc0)) -success := and(eq(staticcall(gas(), 0x7, 0x4e20, 0x60, 0x4e20, 0x40), 1), success) -mstore(0x4e80, mload(0x4e20)) - mstore(0x4ea0, mload(0x4e40)) -mstore(0x4ec0, mload(0x80)) - mstore(0x4ee0, mload(0xa0)) -success := and(eq(staticcall(gas(), 0x6, 0x4e80, 0x80, 0x4e80, 0x40), 1), success) -mstore(0x4f00, mload(0xc0)) - mstore(0x4f20, mload(0xe0)) -mstore(0x4f40, mload(0x3ac0)) -success := and(eq(staticcall(gas(), 0x7, 0x4f00, 0x60, 0x4f00, 0x40), 1), success) -mstore(0x4f60, mload(0x4e80)) - mstore(0x4f80, mload(0x4ea0)) -mstore(0x4fa0, mload(0x4f00)) - mstore(0x4fc0, mload(0x4f20)) -success := and(eq(staticcall(gas(), 0x6, 0x4f60, 0x80, 0x4f60, 0x40), 1), success) -mstore(0x4fe0, mload(0x100)) - mstore(0x5000, mload(0x120)) -mstore(0x5020, mload(0x3ce0)) -success := and(eq(staticcall(gas(), 0x7, 0x4fe0, 0x60, 0x4fe0, 0x40), 1), success) -mstore(0x5040, mload(0x4f60)) - mstore(0x5060, mload(0x4f80)) -mstore(0x5080, mload(0x4fe0)) - mstore(0x50a0, mload(0x5000)) -success := and(eq(staticcall(gas(), 0x6, 0x5040, 0x80, 0x5040, 0x40), 1), success) -mstore(0x50c0, mload(0x320)) - mstore(0x50e0, mload(0x340)) -mstore(0x5100, mload(0x3d00)) -success := and(eq(staticcall(gas(), 0x7, 0x50c0, 0x60, 0x50c0, 0x40), 1), success) -mstore(0x5120, mload(0x5040)) - mstore(0x5140, mload(0x5060)) -mstore(0x5160, mload(0x50c0)) - mstore(0x5180, mload(0x50e0)) -success := and(eq(staticcall(gas(), 0x6, 0x5120, 0x80, 0x5120, 0x40), 1), success) -mstore(0x51a0, mload(0x360)) - mstore(0x51c0, mload(0x380)) -mstore(0x51e0, mload(0x3d20)) -success := and(eq(staticcall(gas(), 0x7, 0x51a0, 0x60, 0x51a0, 0x40), 1), success) -mstore(0x5200, mload(0x5120)) - mstore(0x5220, mload(0x5140)) -mstore(0x5240, mload(0x51a0)) - mstore(0x5260, mload(0x51c0)) -success := and(eq(staticcall(gas(), 0x6, 0x5200, 0x80, 0x5200, 0x40), 1), success) -mstore(0x5280, mload(0x2e0)) - mstore(0x52a0, mload(0x300)) -mstore(0x52c0, mload(0x3e20)) -success := and(eq(staticcall(gas(), 0x7, 0x5280, 0x60, 0x5280, 0x40), 1), success) -mstore(0x52e0, mload(0x5200)) - mstore(0x5300, mload(0x5220)) -mstore(0x5320, mload(0x5280)) - mstore(0x5340, mload(0x52a0)) -success := and(eq(staticcall(gas(), 0x6, 0x52e0, 0x80, 0x52e0, 0x40), 1), success) -mstore(0x5360, mload(0x1a0)) - mstore(0x5380, mload(0x1c0)) -mstore(0x53a0, mload(0x3f20)) -success := and(eq(staticcall(gas(), 0x7, 0x5360, 0x60, 0x5360, 0x40), 1), success) -mstore(0x53c0, mload(0x52e0)) - mstore(0x53e0, mload(0x5300)) -mstore(0x5400, mload(0x5360)) - mstore(0x5420, mload(0x5380)) -success := and(eq(staticcall(gas(), 0x6, 0x53c0, 0x80, 0x53c0, 0x40), 1), success) -mstore(0x5440, mload(0x1e0)) - mstore(0x5460, mload(0x200)) -mstore(0x5480, mload(0x4b20)) -success := and(eq(staticcall(gas(), 0x7, 0x5440, 0x60, 0x5440, 0x40), 1), success) -mstore(0x54a0, mload(0x53c0)) - mstore(0x54c0, mload(0x53e0)) -mstore(0x54e0, mload(0x5440)) - mstore(0x5500, mload(0x5460)) -success := and(eq(staticcall(gas(), 0x6, 0x54a0, 0x80, 0x54a0, 0x40), 1), success) -mstore(0x5520, 0x0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a669) - mstore(0x5540, 0x019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e) -mstore(0x5560, mload(0x4b40)) -success := and(eq(staticcall(gas(), 0x7, 0x5520, 0x60, 0x5520, 0x40), 1), success) -mstore(0x5580, mload(0x54a0)) - mstore(0x55a0, mload(0x54c0)) -mstore(0x55c0, mload(0x5520)) - mstore(0x55e0, mload(0x5540)) -success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) -mstore(0x5600, 0x1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f) - mstore(0x5620, 0x18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194) -mstore(0x5640, mload(0x4b60)) -success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) -mstore(0x5660, mload(0x5580)) - mstore(0x5680, mload(0x55a0)) -mstore(0x56a0, mload(0x5600)) - mstore(0x56c0, mload(0x5620)) -success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) -mstore(0x56e0, 0x076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b8) - mstore(0x5700, 0x05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039) -mstore(0x5720, mload(0x4b80)) -success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) -mstore(0x5740, mload(0x5660)) - mstore(0x5760, mload(0x5680)) -mstore(0x5780, mload(0x56e0)) - mstore(0x57a0, mload(0x5700)) -success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) -mstore(0x57c0, 0x0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d8) - mstore(0x57e0, 0x03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef) -mstore(0x5800, mload(0x4ba0)) -success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) -mstore(0x5820, mload(0x5740)) - mstore(0x5840, mload(0x5760)) -mstore(0x5860, mload(0x57c0)) - mstore(0x5880, mload(0x57e0)) -success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) -mstore(0x58a0, 0x2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f2402) - mstore(0x58c0, 0x13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f6) -mstore(0x58e0, mload(0x4bc0)) -success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) -mstore(0x5900, mload(0x5820)) - mstore(0x5920, mload(0x5840)) -mstore(0x5940, mload(0x58a0)) - mstore(0x5960, mload(0x58c0)) -success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) -mstore(0x5980, 0x0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba5) - mstore(0x59a0, 0x03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db) -mstore(0x59c0, mload(0x4be0)) -success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) -mstore(0x59e0, mload(0x5900)) - mstore(0x5a00, mload(0x5920)) -mstore(0x5a20, mload(0x5980)) - mstore(0x5a40, mload(0x59a0)) -success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) -mstore(0x5a60, 0x23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf) - mstore(0x5a80, 0x28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854) -mstore(0x5aa0, mload(0x4c00)) -success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) -mstore(0x5ac0, mload(0x59e0)) - mstore(0x5ae0, mload(0x5a00)) -mstore(0x5b00, mload(0x5a60)) - mstore(0x5b20, mload(0x5a80)) -success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) -mstore(0x5b40, 0x17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3) - mstore(0x5b60, 0x0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd) -mstore(0x5b80, mload(0x4c20)) -success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) -mstore(0x5ba0, mload(0x5ac0)) - mstore(0x5bc0, mload(0x5ae0)) -mstore(0x5be0, mload(0x5b40)) - mstore(0x5c00, mload(0x5b60)) -success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) -mstore(0x5c20, 0x2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e) - mstore(0x5c40, 0x09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1) -mstore(0x5c60, mload(0x4c40)) -success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) -mstore(0x5c80, mload(0x5ba0)) - mstore(0x5ca0, mload(0x5bc0)) -mstore(0x5cc0, mload(0x5c20)) - mstore(0x5ce0, mload(0x5c40)) -success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) -mstore(0x5d00, 0x2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58) - mstore(0x5d20, 0x0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85) -mstore(0x5d40, mload(0x4c60)) -success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) -mstore(0x5d60, mload(0x5c80)) - mstore(0x5d80, mload(0x5ca0)) -mstore(0x5da0, mload(0x5d00)) - mstore(0x5dc0, mload(0x5d20)) -success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) -mstore(0x5de0, 0x09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9) - mstore(0x5e00, 0x13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7) -mstore(0x5e20, mload(0x4c80)) -success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) -mstore(0x5e40, mload(0x5d60)) - mstore(0x5e60, mload(0x5d80)) -mstore(0x5e80, mload(0x5de0)) - mstore(0x5ea0, mload(0x5e00)) -success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) -mstore(0x5ec0, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) - mstore(0x5ee0, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) -mstore(0x5f00, mload(0x4ca0)) -success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) -mstore(0x5f20, mload(0x5e40)) - mstore(0x5f40, mload(0x5e60)) -mstore(0x5f60, mload(0x5ec0)) - mstore(0x5f80, mload(0x5ee0)) -success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) -mstore(0x5fa0, 0x02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103) - mstore(0x5fc0, 0x23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba) -mstore(0x5fe0, mload(0x4cc0)) -success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) -mstore(0x6000, mload(0x5f20)) - mstore(0x6020, mload(0x5f40)) -mstore(0x6040, mload(0x5fa0)) - mstore(0x6060, mload(0x5fc0)) -success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) -mstore(0x6080, 0x2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af7) - mstore(0x60a0, 0x060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b730) -mstore(0x60c0, mload(0x4ce0)) -success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) -mstore(0x60e0, mload(0x6000)) - mstore(0x6100, mload(0x6020)) -mstore(0x6120, mload(0x6080)) - mstore(0x6140, mload(0x60a0)) -success := and(eq(staticcall(gas(), 0x6, 0x60e0, 0x80, 0x60e0, 0x40), 1), success) -mstore(0x6160, mload(0x440)) - mstore(0x6180, mload(0x460)) -mstore(0x61a0, mload(0x4d00)) -success := and(eq(staticcall(gas(), 0x7, 0x6160, 0x60, 0x6160, 0x40), 1), success) -mstore(0x61c0, mload(0x60e0)) - mstore(0x61e0, mload(0x6100)) -mstore(0x6200, mload(0x6160)) - mstore(0x6220, mload(0x6180)) -success := and(eq(staticcall(gas(), 0x6, 0x61c0, 0x80, 0x61c0, 0x40), 1), success) -mstore(0x6240, mload(0x480)) - mstore(0x6260, mload(0x4a0)) -mstore(0x6280, mload(0x4d20)) -success := and(eq(staticcall(gas(), 0x7, 0x6240, 0x60, 0x6240, 0x40), 1), success) -mstore(0x62a0, mload(0x61c0)) - mstore(0x62c0, mload(0x61e0)) -mstore(0x62e0, mload(0x6240)) - mstore(0x6300, mload(0x6260)) -success := and(eq(staticcall(gas(), 0x6, 0x62a0, 0x80, 0x62a0, 0x40), 1), success) -mstore(0x6320, mload(0x4c0)) - mstore(0x6340, mload(0x4e0)) -mstore(0x6360, mload(0x4d40)) -success := and(eq(staticcall(gas(), 0x7, 0x6320, 0x60, 0x6320, 0x40), 1), success) -mstore(0x6380, mload(0x62a0)) - mstore(0x63a0, mload(0x62c0)) -mstore(0x63c0, mload(0x6320)) - mstore(0x63e0, mload(0x6340)) -success := and(eq(staticcall(gas(), 0x6, 0x6380, 0x80, 0x6380, 0x40), 1), success) -mstore(0x6400, mload(0x500)) - mstore(0x6420, mload(0x520)) -mstore(0x6440, mload(0x4d60)) -success := and(eq(staticcall(gas(), 0x7, 0x6400, 0x60, 0x6400, 0x40), 1), success) -mstore(0x6460, mload(0x6380)) - mstore(0x6480, mload(0x63a0)) -mstore(0x64a0, mload(0x6400)) - mstore(0x64c0, mload(0x6420)) -success := and(eq(staticcall(gas(), 0x6, 0x6460, 0x80, 0x6460, 0x40), 1), success) -mstore(0x64e0, mload(0x540)) - mstore(0x6500, mload(0x560)) -mstore(0x6520, mload(0x4d80)) -success := and(eq(staticcall(gas(), 0x7, 0x64e0, 0x60, 0x64e0, 0x40), 1), success) -mstore(0x6540, mload(0x6460)) - mstore(0x6560, mload(0x6480)) -mstore(0x6580, mload(0x64e0)) - mstore(0x65a0, mload(0x6500)) -success := and(eq(staticcall(gas(), 0x6, 0x6540, 0x80, 0x6540, 0x40), 1), success) -mstore(0x65c0, mload(0x3a0)) - mstore(0x65e0, mload(0x3c0)) -mstore(0x6600, mload(0x4da0)) -success := and(eq(staticcall(gas(), 0x7, 0x65c0, 0x60, 0x65c0, 0x40), 1), success) -mstore(0x6620, mload(0x6540)) - mstore(0x6640, mload(0x6560)) -mstore(0x6660, mload(0x65c0)) - mstore(0x6680, mload(0x65e0)) -success := and(eq(staticcall(gas(), 0x6, 0x6620, 0x80, 0x6620, 0x40), 1), success) -mstore(0x66a0, mload(0xac0)) - mstore(0x66c0, mload(0xae0)) -mstore(0x66e0, sub(f_q, mload(0x4de0))) -success := and(eq(staticcall(gas(), 0x7, 0x66a0, 0x60, 0x66a0, 0x40), 1), success) -mstore(0x6700, mload(0x6620)) - mstore(0x6720, mload(0x6640)) -mstore(0x6740, mload(0x66a0)) - mstore(0x6760, mload(0x66c0)) -success := and(eq(staticcall(gas(), 0x6, 0x6700, 0x80, 0x6700, 0x40), 1), success) -mstore(0x6780, mload(0xb60)) - mstore(0x67a0, mload(0xb80)) -mstore(0x67c0, mload(0x4e00)) -success := and(eq(staticcall(gas(), 0x7, 0x6780, 0x60, 0x6780, 0x40), 1), success) -mstore(0x67e0, mload(0x6700)) - mstore(0x6800, mload(0x6720)) -mstore(0x6820, mload(0x6780)) - mstore(0x6840, mload(0x67a0)) -success := and(eq(staticcall(gas(), 0x6, 0x67e0, 0x80, 0x67e0, 0x40), 1), success) -mstore(0x6860, mload(0x67e0)) - mstore(0x6880, mload(0x6800)) -mstore(0x68a0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) - mstore(0x68c0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) - mstore(0x68e0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) - mstore(0x6900, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) -mstore(0x6920, mload(0xb60)) - mstore(0x6940, mload(0xb80)) -mstore(0x6960, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) - mstore(0x6980, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) - mstore(0x69a0, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) - mstore(0x69c0, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) -success := and(eq(staticcall(gas(), 0x8, 0x6860, 0x180, 0x6860, 0x20), 1), success) -success := and(eq(mload(0x6860), 1), success) - - if not(success) { revert(0, 0) } - return(0, 0) - - } - } - } diff --git a/contracts/src/Summa.sol b/contracts/src/Summa.sol index 82159afc..82d8ccbd 100644 --- a/contracts/src/Summa.sol +++ b/contracts/src/Summa.sol @@ -4,13 +4,22 @@ pragma solidity ^0.8.18; // Uncomment this line to use console.log //import "hardhat/console.sol"; -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IVerifier.sol"; contract Summa is Ownable { + /** + * @dev Struct representing the configuration of the Summa instance + * @param mstLevels The number of levels of the Merkle sum tree + * @param currenciesCount The number of cryptocurrencies supported by the Merkle sum tree + * @param balanceByteRange The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree + */ + struct SummaConfig { + uint16 mstLevels; + uint16 currenciesCount; + uint8 balanceByteRange; + } /** * @dev Struct representing an address ownership proof submitted by the CEX * @param cexAddress The address owned by the CEX (submitted as a string, as it can be a non-EVM address) @@ -26,58 +35,78 @@ contract Summa is Ownable { } /** - * @dev Struct representing an asset owned by the CEX - * @param assetName The name of the asset - * @param chain The name of the chain name where the asset lives (e.g., ETH, BTC) - * @param amount The total amount of the asset that the CEX holds on a given chain + * @dev Struct identifying a cryptocurrency traded on the CEX + * @param name The name of the cryptocurrency + * @param chain The name of the chain name where the cryptocurrency lives (e.g., ETH, BTC) */ - struct Asset { - string assetName; + struct Cryptocurrency { + string name; string chain; - uint256 amount; } - // Verifier contracts - IVerifier private immutable solvencyVerifier; + /** + * @dev Struct representing a commitment submitted by the CEX. + * @param mstRoot Merkle sum tree root of the CEX's liabilities + * @param rootBalances The total sums of the liabilities included in the tree + * @param blockchainNames The names of the blockchains where the CEX holds the cryptocurrencies included into the tree + * @param cryptocurrencyNames The names of the cryptocurrencies included into the tree + */ + struct Commitment { + uint256 mstRoot; + uint256[] rootBalances; + string[] cryptocurrencyNames; + string[] blockchainNames; + } + + // Summa configuration + SummaConfig public config; + + // User inclusion proof verifier IVerifier private immutable inclusionVerifier; - // All address ownership proofs submitted by the CEX + // List of all address ownership proofs submitted by the CEX AddressOwnershipProof[] public addressOwnershipProofs; + function getAddressOwnershipProof( + bytes32 addressHash + ) public view returns (AddressOwnershipProof memory) { + require( + _ownershipProofByAddress[addressHash] > 0, + "Address not verified" + ); + // -1 comes from the fact that 0 is reserved to distinguish the case when the proof has not yet been submitted + return + addressOwnershipProofs[_ownershipProofByAddress[addressHash] - 1]; + } + // Convenience mapping to check if an address has already been verified - /* - Boolean type is better than uint256 for this mapping, at least more than 2,100 gas is saved per call - */ - mapping(bytes32 => uint256) public ownershipProofByAddress; + mapping(bytes32 => uint256) private _ownershipProofByAddress; - // MST roots corresponding to successfully verified solvency proofs by timestamp - mapping(uint256 => uint256) public mstRoots; + // Solvency commitments by timestamp submitted by the CEX + mapping(uint256 => Commitment) public commitments; event AddressOwnershipProofSubmitted( AddressOwnershipProof[] addressOwnershipProofs ); - event SolvencyProofSubmitted( + event LiabilitiesCommitmentSubmitted( uint256 indexed timestamp, uint256 mstRoot, - Asset[] assets + uint256[] rootBalances, + Cryptocurrency[] cryptocurrencies ); - constructor(IVerifier _solvencyVerifier, IVerifier _inclusionVerifier) { - solvencyVerifier = _solvencyVerifier; + constructor( + IVerifier _inclusionVerifier, + uint16 mstLevels, + uint16 currenciesCount, + uint8 balanceByteRange + ) { inclusionVerifier = _inclusionVerifier; + config = SummaConfig(mstLevels, currenciesCount, balanceByteRange); } - /* - // While this duplicate method might elevate deployment costs, the trade-off is a reduction in usage and maintenance costs. - function submitProofOfAddressOwnership( - AddressOwnershipProof memory _addressOwnershipProof - ) public onlyOwner { - ... - } - */ - /** - * @dev Submit an optimistic proof of address ownership for a CEX. The proof is subject to an off-chain verification as it's not feasible to verify the signatures of non-EVM chains in an Ethereum smart contract. + * @dev Submit an optimistic proof of multiple address ownership for a CEX. The proof is subject to an off-chain verification as it's not feasible to verify the signatures of non-EVM chains in an Ethereum smart contract. * @param _addressOwnershipProofs The list of address ownership proofs */ function submitProofOfAddressOwnership( @@ -85,15 +114,14 @@ contract Summa is Ownable { ) public onlyOwner { for (uint i = 0; i < _addressOwnershipProofs.length; i++) { bytes32 addressHash = keccak256( - abi.encode(_addressOwnershipProofs[i].cexAddress) + abi.encodePacked(_addressOwnershipProofs[i].cexAddress) ); - uint256 index = ownershipProofByAddress[addressHash]; - require(index == 0, "Address already verified"); - /* - Is there any reason to assign value `i + 1` to `ownershipProofByAddress[addressHash]`? - */ - ownershipProofByAddress[addressHash] = i + 1; + uint256 proofIndex = _ownershipProofByAddress[addressHash]; + require(proofIndex == 0, "Address already verified"); + addressOwnershipProofs.push(_addressOwnershipProofs[i]); + _ownershipProofByAddress[addressHash] = addressOwnershipProofs + .length; require( bytes(_addressOwnershipProofs[i].cexAddress).length != 0 && bytes(_addressOwnershipProofs[i].chain).length != 0 && @@ -107,53 +135,54 @@ contract Summa is Ownable { } /** - * @dev Submit proof of solvency for a CEX + * @dev Submit commitment for a CEX * @param mstRoot Merkle sum tree root of the CEX's liabilities - * @param assets The list of assets owned by the CEX - * @param proof The ZK proof + * @param rootBalances The total sums of the liabilities included into the Merkle sum tree + * @param cryptocurrencies The cryptocurrencies included into the Merkle sum tree * @param timestamp The timestamp at which the CEX took the snapshot of its assets and liabilities */ - function submitProofOfSolvency( + function submitCommitment( uint256 mstRoot, - Asset[] memory assets, - bytes memory proof, + uint256[] memory rootBalances, + Cryptocurrency[] memory cryptocurrencies, uint256 timestamp ) public onlyOwner { + require(mstRoot != 0, "Invalid MST root"); require( - addressOwnershipProofs.length != 0, - "The CEX has not submitted any address ownership proofs" + rootBalances.length == cryptocurrencies.length, + "Root liabilities sums and liabilities number mismatch" + ); + string[] memory cryptocurrencyNames = new string[]( + cryptocurrencies.length ); - uint256[] memory inputs = new uint256[](assets.length + 1); - inputs[0] = mstRoot; - for (uint i = 0; i < assets.length; i++) { + string[] memory blockchainNames = new string[](cryptocurrencies.length); + for (uint i = 0; i < cryptocurrencies.length; i++) { require( - bytes(assets[i].chain).length != 0 && - bytes(assets[i].assetName).length != 0, - "Invalid asset" + bytes(cryptocurrencies[i].chain).length != 0 && + bytes(cryptocurrencies[i].name).length != 0, + "Invalid cryptocurrency" ); - inputs[i + 1] = assets[i].amount; + require( + rootBalances[i] != 0, + "All root sums should be greater than zero" + ); + cryptocurrencyNames[i] = cryptocurrencies[i].name; + blockchainNames[i] = cryptocurrencies[i].chain; } - require(verifySolvencyProof(proof, inputs), "Invalid ZK proof"); - - mstRoots[timestamp] = mstRoot; - - emit SolvencyProofSubmitted(timestamp, inputs[0], assets); - } - /* - It would be helpful to provide a description of the public inputs for the `verifySolvencyProof` and `verifyInclusionProof` methods. - */ + commitments[timestamp] = Commitment( + mstRoot, + rootBalances, + cryptocurrencyNames, + blockchainNames + ); - /** - * Verify the proof of CEX solvency - * @param proof ZK proof - * @param publicInputs proof inputs - */ - function verifySolvencyProof( - bytes memory proof, - uint256[] memory publicInputs - ) public view returns (bool) { - return solvencyVerifier.verify(publicInputs, proof); + emit LiabilitiesCommitmentSubmitted( + timestamp, + mstRoot, + rootBalances, + cryptocurrencies + ); } /** @@ -166,7 +195,16 @@ contract Summa is Ownable { uint256[] memory publicInputs, uint256 timestamp ) public view returns (bool) { - require(mstRoots[timestamp] == publicInputs[1], "Invalid MST root"); + require( + commitments[timestamp].mstRoot == publicInputs[1], + "Invalid MST root" + ); + for (uint i = 2; i < publicInputs.length; i++) { + require( + commitments[timestamp].rootBalances[i - 2] == publicInputs[i], + "Invalid root balance" + ); + } return inclusionVerifier.verify(publicInputs, proof); } } diff --git a/contracts/test/Summa.ts b/contracts/test/Summa.ts index 2ab793f1..e7e9aa12 100644 --- a/contracts/test/Summa.ts +++ b/contracts/test/Summa.ts @@ -9,27 +9,25 @@ import * as fs from "fs"; import * as path from "path"; describe("Summa Contract", () => { - function submitProofOfSolvency( + function submitCommitment( summa: Summa, mstRoot: BigNumber, - proof: string, - assets = [ + rootBalances: BigNumber[], + cryptocurrencies = [ { chain: "ETH", - assetName: "ETH", - amount: BigNumber.from(556863), + name: "ETH", }, { - chain: "ETH", - assetName: "USDT", - amount: BigNumber.from(556863), + chain: "BTC", + name: "BTC", }, ] ): any { - return summa.submitProofOfSolvency( + return summa.submitCommitment( mstRoot, - assets, - proof, + rootBalances, + cryptocurrencies, BigNumber.from(1693559255) ); } @@ -38,11 +36,13 @@ describe("Summa Contract", () => { summa: Summa, inclusionProof: string, leafHash: BigNumber, - mstRoot: BigNumber + mstRoot: BigNumber, + balance1: BigNumber, + balance2: BigNumber ): any { return summa.verifyInclusionProof( inclusionProof, - [leafHash, mstRoot], + [leafHash, mstRoot, balance1, balance2], 1693559255 ); } @@ -52,19 +52,16 @@ describe("Summa Contract", () => { const [owner, addr1, addr2, addr3]: SignerWithAddress[] = await ethers.getSigners(); - const solvencyVerifier = await ethers.deployContract( - "src/SolvencyVerifier.sol:Verifier" - ); - await solvencyVerifier.deployed(); - const inclusionVerifier = await ethers.deployContract( "src/InclusionVerifier.sol:Verifier" ); await inclusionVerifier.deployed(); const summa = await ethers.deployContract("Summa", [ - solvencyVerifier.address, inclusionVerifier.address, + 4, // The number of levels of the Merkle sum tree + 2, // The number of cryptocurrencies supported by the Merkle sum tree + 14, // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree ]); await summa.deployed(); @@ -112,14 +109,14 @@ describe("Summa Contract", () => { ownedAddresses = [ { chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account1.address]), + cexAddress: account1.address.toString(), signature: "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b", message: message, }, { chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account2.address]), + cexAddress: account2.address.toString(), signature: "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c", message: message, @@ -133,38 +130,44 @@ describe("Summa Contract", () => { .withArgs((ownedAddresses: any) => { return ( ownedAddresses[0].chain == "ETH" && - ownedAddresses[0].cexAddress == - defaultAbiCoder.encode(["address"], [account1.address]) && + ownedAddresses[0].cexAddress == account1.address && ownedAddresses[0].signature == "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b" && ownedAddresses[0].message == message && ownedAddresses[1].chain == "ETH" && - ownedAddresses[1].cexAddress == - defaultAbiCoder.encode(["address"], [account2.address]) && + ownedAddresses[1].cexAddress == account2.address && ownedAddresses[1].signature == "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" && ownedAddresses[1].message == message ); }); - let proofOfAddressOwnership0 = await summa.addressOwnershipProofs(0); - expect(proofOfAddressOwnership0.chain).to.be.equal("ETH"); - expect(proofOfAddressOwnership0.cexAddress).to.be.equal( - defaultAbiCoder.encode(["address"], [account1.address]) + const addr1Hash = ethers.utils.solidityKeccak256( + ["string"], + [account1.address] ); - expect(proofOfAddressOwnership0.signature).to.be.equal( - "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b" + let proofOfAddressOwnership1 = await summa.getAddressOwnershipProof( + addr1Hash ); - expect(proofOfAddressOwnership0.message).to.be.equal(message); - let proofOfAddressOwnership1 = await summa.addressOwnershipProofs(1); expect(proofOfAddressOwnership1.chain).to.be.equal("ETH"); - expect(proofOfAddressOwnership1.cexAddress).to.be.equal( - defaultAbiCoder.encode(["address"], [account2.address]) - ); + expect(proofOfAddressOwnership1.cexAddress).to.be.equal(account1.address); expect(proofOfAddressOwnership1.signature).to.be.equal( - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" + "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b" ); expect(proofOfAddressOwnership1.message).to.be.equal(message); + const addr2Hash = ethers.utils.solidityKeccak256( + ["string"], + [account2.address] + ); + let proofOfAddressOwnership2 = await summa.getAddressOwnershipProof( + addr2Hash + ); + expect(proofOfAddressOwnership2.chain).to.be.equal("ETH"); + expect(proofOfAddressOwnership2.cexAddress).to.be.equal(account2.address); + expect(proofOfAddressOwnership2.signature).to.be.equal( + "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" + ); + expect(proofOfAddressOwnership2.message).to.be.equal(message); }); it("should revert if the caller is not the owner", async () => { @@ -207,14 +210,24 @@ describe("Summa Contract", () => { summa.submitProofOfAddressOwnership(ownedAddresses) ).to.be.revertedWith("Invalid proof of address ownership"); }); + + it("should revert if requesting proof for unverified address", async () => { + const addr1Hash = ethers.utils.solidityKeccak256( + ["string"], + [account1.address] + ); + await expect( + summa.getAddressOwnershipProof(addr1Hash) + ).to.be.revertedWith("Address not verified"); + }); }); - describe("verify proof of solvency", () => { + describe("submit commitment", () => { let mstRoot: BigNumber; + let rootBalances: BigNumber[]; let summa: Summa; let account1: SignerWithAddress; let account2: SignerWithAddress; - let proof: string; //let ethAccount3; let ownedAddresses: Summa.AddressOwnershipProofStruct[]; const message = ethers.utils.defaultAbiCoder.encode( @@ -231,49 +244,46 @@ describe("Summa Contract", () => { ownedAddresses = [ { chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account1.address]), + cexAddress: account1.address.toString(), signature: "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b", message: message, }, { chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account2.address]), + cexAddress: account2.address.toString(), signature: "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c", message: message, }, ]; - const jsonData = fs.readFileSync( + const commitmentCalldataJson = fs.readFileSync( path.resolve( __dirname, - "../../zk_prover/examples/solvency_proof_solidity_calldata.json" + "../../zk_prover/examples/commitment_solidity_calldata.json" ), "utf-8" ); - const calldata: any = JSON.parse(jsonData); + const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - mstRoot = calldata.public_inputs[0]; - proof = calldata.proof; + mstRoot = commitmentCalldata.root_hash; + rootBalances = commitmentCalldata.root_balances; }); - it("should verify the proof of solvency for the given public input", async () => { + it("should submit commitment for the given public input", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); - await expect(submitProofOfSolvency(summa, mstRoot, proof)) - .to.emit(summa, "SolvencyProofSubmitted") + await expect(submitCommitment(summa, mstRoot, rootBalances)) + .to.emit(summa, "LiabilitiesCommitmentSubmitted") .withArgs( BigNumber.from(1693559255), mstRoot, - (assets: Summa.AssetStruct[]) => { + rootBalances, + (cryptocurrencies: [Summa.CryptocurrencyStruct]) => { return ( - assets[0].chain == "ETH" && - assets[0].assetName == "ETH" && - BigNumber.from(556863).eq(assets[0].amount as BigNumber) && - assets[1].chain == "ETH" && - assets[1].assetName == "USDT" && - BigNumber.from(556863).eq(assets[1].amount as BigNumber) + cryptocurrencies[0].chain == "ETH" && + cryptocurrencies[0].name == "ETH" ); } ); @@ -281,93 +291,87 @@ describe("Summa Contract", () => { it("should revert if the caller is not the owner", async () => { await expect( - summa.connect(account2).submitProofOfSolvency( + summa.connect(account2).submitCommitment( mstRoot, + [BigNumber.from(1000000000)], [ { chain: "ETH", - assetName: "ETH", - amount: BigNumber.from(556863), - }, - { - chain: "ETH", - assetName: "USDT", - amount: BigNumber.from(556863), + name: "ETH", }, ], - proof, BigNumber.from(1693559255) ) ).to.be.revertedWith("Ownable: caller is not the owner"); }); - it("should not verify the proof of solvency if the CEX hasn't proven the address ownership", async () => { - await expect( - submitProofOfSolvency(summa, mstRoot, proof) - ).to.be.revertedWith( - "The CEX has not submitted any address ownership proofs" - ); - }); - - it("should revert with invalid MST root", async () => { - mstRoot = BigNumber.from(0); + it("should revert with invalid root sum", async () => { + rootBalances = [BigNumber.from(0), BigNumber.from(0)]; await summa.submitProofOfAddressOwnership(ownedAddresses); await expect( - submitProofOfSolvency(summa, mstRoot, proof) - ).to.be.revertedWith("Invalid ZK proof"); + submitCommitment(summa, mstRoot, rootBalances) + ).to.be.revertedWith("All root sums should be greater than zero"); }); - it("should revert with invalid assets", async () => { + it("should revert with invalid cryptocurrencies", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); await expect( - submitProofOfSolvency(summa, mstRoot, proof, [ + submitCommitment(summa, mstRoot, rootBalances, [ + { + chain: "BTC", + name: "BTC", + }, { chain: "", - assetName: "ETH", - amount: BigNumber.from(556863), + name: "ETH", }, ]) - ).to.be.revertedWith("Invalid asset"); + ).to.be.revertedWith("Invalid cryptocurrency"); await expect( - submitProofOfSolvency(summa, mstRoot, proof, [ + submitCommitment(summa, mstRoot, rootBalances, [ { chain: "ETH", - assetName: "", - amount: BigNumber.from(556863), + name: "ETH", + }, + { + chain: "BTC", + name: "", }, ]) - ).to.be.revertedWith("Invalid asset"); + ).to.be.revertedWith("Invalid cryptocurrency"); }); - it("should revert with invalid proof", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - - proof = proof.replace("1", "2"); - + it("should not submit invalid root", async () => { await expect( - submitProofOfSolvency(summa, mstRoot, proof) - ).to.be.revertedWith("Invalid ZK proof"); - - proof = "0x000000"; + submitCommitment(summa, BigNumber.from(0), rootBalances) + ).to.be.revertedWith("Invalid MST root"); + }); + it("should revert if cryptocurrency and liability counts don't match", async () => { + rootBalances = [BigNumber.from(10000000)]; await expect( - submitProofOfSolvency(summa, mstRoot, proof) - ).to.be.revertedWithoutReason(); + submitCommitment(summa, mstRoot, rootBalances) + ).to.be.revertedWith( + "Root liabilities sums and liabilities number mismatch" + ); }); }); describe("verify proof of inclusion", () => { - let mstRoot: BigNumber; + let commitmentMstRoot: BigNumber; + let rootBalances: BigNumber[]; + let inclusionMstRoot: BigNumber; let leafHash: BigNumber; + let balance1: BigNumber; + let balance2: BigNumber; let summa: Summa; let account1: SignerWithAddress; let account2: SignerWithAddress; let inclusionProof: string; - let solvencyProof: string; let ownedAddresses: Summa.AddressOwnershipProofStruct[]; const message = ethers.utils.defaultAbiCoder.encode( ["string"], @@ -397,63 +401,110 @@ describe("Summa Contract", () => { }, ]; - const solvencyJson = fs.readFileSync( + const inclusionJson = fs.readFileSync( path.resolve( __dirname, - "../../zk_prover/examples/solvency_proof_solidity_calldata.json" + "../../zk_prover/examples/inclusion_proof_solidity_calldata.json" ), "utf-8" ); - const solvencyCalldata: any = JSON.parse(solvencyJson); + const inclusionCalldata: any = JSON.parse(inclusionJson); - mstRoot = solvencyCalldata.public_inputs[0]; - solvencyProof = solvencyCalldata.proof; + inclusionProof = inclusionCalldata.proof; + leafHash = inclusionCalldata.public_inputs[0]; + inclusionMstRoot = inclusionCalldata.public_inputs[1]; + balance1 = inclusionCalldata.public_inputs[2]; + balance2 = inclusionCalldata.public_inputs[3]; - const inclusionJson = fs.readFileSync( + const commitmentCalldataJson = fs.readFileSync( path.resolve( __dirname, - "../../zk_prover/examples/inclusion_proof_solidity_calldata.json" + "../../zk_prover/examples/commitment_solidity_calldata.json" ), "utf-8" ); - const inclusionCalldata: any = JSON.parse(inclusionJson); + const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - leafHash = inclusionCalldata.public_inputs[0]; - mstRoot = inclusionCalldata.public_inputs[1]; - inclusionProof = inclusionCalldata.proof; + commitmentMstRoot = commitmentCalldata.root_hash; + rootBalances = commitmentCalldata.root_balances; }); it("should verify the proof of inclusion for the given public input", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitProofOfSolvency(summa, mstRoot, solvencyProof); + await submitCommitment(summa, commitmentMstRoot, rootBalances); expect( - await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + await verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) ).to.be.equal(true); }); it("should not verify with invalid MST root", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitProofOfSolvency(summa, mstRoot, solvencyProof); - mstRoot = BigNumber.from(0); + await submitCommitment(summa, commitmentMstRoot, rootBalances); + inclusionMstRoot = BigNumber.from(0); await expect( - verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) ).to.be.revertedWith("Invalid MST root"); }); it("should not verify if the MST root lookup by timestamp returns an incorrect MST root", async () => { // The lookup will return a zero MST root as no MST root has been stored yet await expect( - verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) ).to.be.revertedWith("Invalid MST root"); }); + it("should not verify with invalid root balances", async () => { + balance1 = BigNumber.from(0); + + await summa.submitProofOfAddressOwnership(ownedAddresses); + await submitCommitment(summa, commitmentMstRoot, rootBalances); + await expect( + verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) + ).to.be.revertedWith("Invalid root balance"); + }); + it("should not verify with invalid leaf", async () => { leafHash = BigNumber.from(0); await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitProofOfSolvency(summa, mstRoot, solvencyProof); + await submitCommitment(summa, commitmentMstRoot, rootBalances); expect( - await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + await verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) ).to.be.equal(false); }); @@ -461,9 +512,16 @@ describe("Summa Contract", () => { inclusionProof = inclusionProof.replace("1", "2"); await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitProofOfSolvency(summa, mstRoot, solvencyProof); + await submitCommitment(summa, commitmentMstRoot, rootBalances); expect( - await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + await verifyInclusionProof( + summa, + inclusionProof, + leafHash, + inclusionMstRoot, + balance1, + balance2 + ) ).to.be.equal(false); }); }); diff --git a/csv/entry_13.csv b/csv/entry_13.csv new file mode 100644 index 00000000..3294526a --- /dev/null +++ b/csv/entry_13.csv @@ -0,0 +1,14 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 \ No newline at end of file diff --git a/csv/entry_16.csv b/csv/entry_16.csv new file mode 100644 index 00000000..c0d4ebc9 --- /dev/null +++ b/csv/entry_16.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 diff --git a/csv/entry_16_bigints.csv b/csv/entry_16_bigints.csv new file mode 100644 index 00000000..04e2e247 --- /dev/null +++ b/csv/entry_16_bigints.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,18446744073709551616,79731 +MBlfbBGI,67823,55683 +lAhWlEWZ,18651,22073 +nuZweYtO,22073,35479 +gbdSwiuY,34897,10032 +RZNneNuP,83296,2087 +YsscHXkp,31699,34897 +RkLzkDun,2087,67823 +HlQlnEYI,30605,31699 +RqkZOFYe,16881,16881 +NjCSRAfD,41163,14874 +pHniJMQY,14874,18651 +dOGIMzKR,10032,41163 +HfMDmNLp,55683,83296 +xPLKzCBl,79731,18446744073709551616 +AtwIxZHo,35479,30605 diff --git a/csv/entry_16_modified.csv b/csv/entry_16_modified.csv new file mode 100644 index 00000000..b5496bf2 --- /dev/null +++ b/csv/entry_16_modified.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2086,79732 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 diff --git a/csv/entry_16_overflow.csv b/csv/entry_16_overflow.csv new file mode 100644 index 00000000..124d1623 --- /dev/null +++ b/csv/entry_16_overflow.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,5192296858534827628530496329220096,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 diff --git a/csv/entry_16_switched_order.csv b/csv/entry_16_switched_order.csv new file mode 100644 index 00000000..a83d2b46 --- /dev/null +++ b/csv/entry_16_switched_order.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,79731 +MBlfbBGI,67823,22073 +lAhWlEWZ,18651,18651 +nuZweYtO,22073,35479 +gbdSwiuY,34897,83296 +RZNneNuP,83296,34897 +YsscHXkp,31699,55683 +RkLzkDun,2087,30605 +HlQlnEYI,30605,10032 +RqkZOFYe,16881,16881 +NjCSRAfD,41163,41163 +pHniJMQY,14874,31699 +dOGIMzKR,10032,11888 +HfMDmNLp,55683,14874 +AtwIxZHo,35479,67823 +xPLKzCBl,79731,2087 diff --git a/csv/entry_17.csv b/csv/entry_17.csv new file mode 100644 index 00000000..ea4bb7a3 --- /dev/null +++ b/csv/entry_17.csv @@ -0,0 +1,19 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 +HuIIxzHo,1,1 + diff --git a/backend/src/apis/csv/signatures.csv b/csv/signatures.csv similarity index 100% rename from backend/src/apis/csv/signatures.csv rename to csv/signatures.csv diff --git a/zk_prover/examples/states/entry_16_1.csv b/csv/states/entry_16_1.csv similarity index 100% rename from zk_prover/examples/states/entry_16_1.csv rename to csv/states/entry_16_1.csv diff --git a/zk_prover/examples/states/entry_16_2.csv b/csv/states/entry_16_2.csv similarity index 100% rename from zk_prover/examples/states/entry_16_2.csv rename to csv/states/entry_16_2.csv diff --git a/zk_prover/examples/states/entry_16_3.csv b/csv/states/entry_16_3.csv similarity index 100% rename from zk_prover/examples/states/entry_16_3.csv rename to csv/states/entry_16_3.csv diff --git a/zk_prover/examples/states/entry_16_4.csv b/csv/states/entry_16_4.csv similarity index 100% rename from zk_prover/examples/states/entry_16_4.csv rename to csv/states/entry_16_4.csv diff --git a/zk_prover/examples/states/entry_16_5.csv b/csv/states/entry_16_5.csv similarity index 100% rename from zk_prover/examples/states/entry_16_5.csv rename to csv/states/entry_16_5.csv diff --git a/zk_prover/README.md b/zk_prover/README.md index af77f651..f2324f8a 100644 --- a/zk_prover/README.md +++ b/zk_prover/README.md @@ -24,39 +24,45 @@ cargo doc --no-deps --open For testing purposes, it's not necessary to download the `ptau` file. The `generate_setup_artifacts` function can manage this by generating a new setup from a randomly generated value. This automated generation process is intended for testing and development convenience, and it should not be used in production. For real-world situations, you must provide the path of a specific `ptau` file to the `generate_setup_artifacts`. The circuit will use the randomness from the given file. You can find an example that initializes a `Snapshot` instance [here](https://github.com/summa-dev/summa-solvency/blob/11d4fce5d18f6175804aa792fc9fc5ac27bf5c00/backend/src/apis/snapshot.rs#L115-L116) in the backend. -## Build a Solvency Verifier Contract - -A `gen_solvency_verifier.rs` script is provided to generate a solidity contract that can be used to verify the proof of solvency via a smart contract. Note that the function to verify such proof is a view function, which means that it can be called without spending gas and that it does not modify the state of the contract +## Build an Inclusion Verifier Contract -The script can be run as follows: +A `gen_inclusion_verifier.rs` script is provided to generate a solidity contract that can be used to verify the proof of user inclusion into CEX liabilites. The script can be run as follows: ``` -cargo run --release --example gen_solvency_verifier +cargo run --release --example gen_inclusion_verifier ``` -The script will generate a new `SolvencyVerifier.sol` and `SolvencyVerifier.yul` contracts in `contracts/src`. +The script will generate a new `InclusionVerifier.sol` and `InclusionVerifier.yul` contracts in `contracts/src`. -Note that the generic parameters of the circuits `N_ASSETS` and `N_BYTES` are set to `2` and `14`. This means that the circuit is tuned to verify the proof of solvency for an exchange with 2 assets and a balances in a range of 14 bytes. These parameters can be changed in the script. +Note that the generic parameters of the circuits `LEVELS`, `N_CURRENCIES` and `N_BYTES` are set to `4`, `2` and `14`. This means that the circuit is tuned to verify the proof of inclusion for an exchange with a userbase of 4 levels (2^4 = 16 users), 2 currencies and a balances in a range of 14 bytes. These parameters can be changed in the script. -Furthermore, the verifier is generated based on a specified `ptau` file, `hermez-raw-11`, for the generic parameters (`N_ASSETS`, `N_BYTES`), using the `generate_setup_artifacts` function. If you try to use different generic parameters, you may have to choose a different `ptau` file for that. +The verifier are generated based on a trusted setup located at `backend/ptau/hermez-raw-11`. Note that setting different generic parameters may require a bigger trusted setup. More details on how to generate a trusted setup can be found [here](https://summa.gitbook.io/summa-book/backend/summa-solvency#3.-generate-verifier-contract). -On top of that the script will also generate a `solvency_proof_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` and `backend` to test the verifier. Again, in the example, the proof is generated based on the `src/merkle_sum_tree/csv/entry_16.csv` file. If you want to generate a proof for a different file, you can change the path in the script. +## Build a Commitment -## Build an Inclusion Verifier Contract +A `gen_commitment.rs` script is provided to generate a commitment out of a Merkle Sum Tree. In particular, the example takes a csv file located in "../csv/entry_16.csv", build a Merkle Sum Tree and extract a commitment out it. The commitment is made of the `root_hash` and the `root_balances`. -A `gen_inclusion_verifier.rs` script is provided to generate a solidity contract that can be used to verify the proof of user inclusion into CEX liabilites. The script can be run as follows: +The script will eventually generate a `commitment_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` to test the publishing of the commitment to the Summa Smart Contract. + +The script can be run as follows: ``` -cargo run --release --example gen_inclusion_verifier +cargo run --release --example gen_commitment ``` -The script will generate a new `InclusionVerifier.sol` and `InclusionVerifier.yul` contracts in `contracts/src`. +Note that the generic parameters of the Merkle Sum Tree `N_CURRENCIES` and `N_BYTES` are set to `2` and `14`. This means that this should go in pair with a Inclusion Verifier Circuit tuned to the same generic parameters. + +## Build an Inclusion Proof + +A `gen_inclusion_proof.rs` script is provided to a proof of inclusion that can verified by the Smart Contract. The script can be run as follows: -Note that the generic parameters of the circuits `LEVELS`, `N_ASSETS` and `N_BYTES` are set to `4`, `2` and `14`. This means that the circuit is tuned to verify the proof of inclusion for an exchange with a userbase of 4 levels (2^4 = 16 users), 2 assets and a balances in a range of 14 bytes. These parameters can be changed in the script. +``` +cargo run --release --example gen_inclusion_proof +``` -The verifier are generated based on an unsafe setup. For a production ready verifier, the setup should be generated by providing a `ptau` file generated after a trusted setup ceremony to `generate_setup_artifacts` function. +This generated proof is saved in `inclusion_proof_solidity_calldata.json`. The file contains some testing calldata to be used within `contracts` to test the verifier. -On top of that the script will also generate a `inclusion_proof_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` and `backend` to test the verifier. Again, in the example, the proof is generated based on the `src/merkle_sum_tree/csv/entry_16.csv` file for a specific `user_index`, which is set to 0 by default. If you want to generate a testing proof for a different file, you can change the path in the script. If you want to generate a proof for a different `user_index`, you can change the `user_index` in the script. +In the example, the proof is generated based on the `../csv/entry_16.csv` file for a specific `user_index`, which is set to 0 by default. The setup parameters are set to `LEVELS = 4`, `N_CURRENCIES = 2` and `N_BYTES = 14`. The ptau file is located at `backend/ptau/hermez-raw-11`. Note that these parameters should go in pair with the ones used to generate Inclusion Verifier Circuit and the Commtiment in order to generate a valid proof. ## Incremental Nova Verifier @@ -85,22 +91,17 @@ The benchmarking included the following areas: - Proving Key Gen for MstInclusion Circuit - ZK Proof Generation for MstInclusion Circuit - ZK Proof Verification for MstInclusion Circuit -- Verification Key Gen for Solvency Circuit -- Proving Key Gen for Solvency Circuit -- ZK Proof Generation for Solvency Circuit -- ZK Proof Verification for Solvency Circuit In order to run the benchmarking, we provide a set of dummy `username, balances` entries formatted in csv files. The csv files can be downloaded as follows -``` -cd benches -mkdir csv -cd csv -wget https://summa-solvency.s3.eu-central-1.amazonaws.com/csv_files.tar.bz2 -tar -xjf csv_files.tar.bz2 +```bash +mkdir -p benches/csv +cd benches/csv +wget https://summa-solvency.s3.eu-central-1.amazonaws.com/1_entry_2_20.zip +unzip 1_entry_2_20.zip ``` -The csv folder will contain two subfolder namely `one_asset` and `two_assets`. Each folders will contain files named as `one_asset_entry_2_17.csv` or `two_assets_entry_2_5.csv`. 2^17 or 2^5 is the number of entries in the file that will be used to feed the merkle sum tree and, eventually, the zk prover. These entries represent the number of users of the exchange. +The file naming convention, such as `1_entry_2_20.csv`, follows the pattern `[number of cryptocurrency]_entry_2_[power of 2]`. In this example, `1_entry` indicates a single currency, and the `2_20` part represents $2^{20}$ entries in the file. These entries, which are intended to populate the Merkle sum tree and feed the zk prover, correspond to the number of users on the exchange. To run the benches @@ -108,9 +109,9 @@ To run the benches You can set the following parameters to run the benches: -- `LEVELS` -> the number of entries in the merkle sum tree. By default it is set to 15, which means that the benches will run for 2^15 entries. +- `LEVELS` -> the number of entries in the merkle sum tree. By default it is set to 20, which means that the benches will run for 2^20 entries. - `SAMPLE_SIZE` -> the number of samples to run for each bench. By default it is set to 10, which is the minimum allowed by criterion.rs -- `N_ASSETS and PATH_NAME` -> the number of assets to be used in the benchmarking. By default it is set to 2. For now you can only switch it between 1 and 2 as these are the only csv folder available. More will be added soon. +- `N_CURRENCIES` -> the number of currencies to be used in the benchmarking. By default it is set to 1. Note that the `k` of the circuit may vary based on the LEVELS @@ -118,28 +119,20 @@ Furthermore the benchmarking function `verify_zk_proof_benchmark` will also prin ## Current Benches -Run on AWS EC2 instance `m7a.8xlarge` with 32 vcores and 128GB RAM +Run on AWS m7a.8xlarge with 32 vcores and 128GB RAM -Benches run after PR #80 (`add solidity verifier`). In order to achieve small proof size, to be cheap to verify on-chain. +2^20 entries (1048576) users, 1 currency -2^28 entries (268435456) users, one asset. Range is 14 bytes, considering SHIBA INU token supply (110 bits) as the upper bound. +| MST init | +| -------- | +| 24.272 s | -| MST init | -| -------- | -| 7143.9 s | +| MST init (sorted) | +| -------- | +| 25.480 s | For Merkle Sum Tree Proof of Inclusion circuit -| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | -| --------- | --------- | ---------------- | ------------------ | ------------------ | -| 88.92 ms | 135.96 ms | 369.31 ms | 3.65 ms | 1632 | - -For Proof of Solvency circuit - -| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | -| -------- | --------- | ---------------- | ------------------ | ------------------ | -| 32.86 ms | 31.76 ms | 139.60 ms | 4.09 ms | 1568 | - -Gas cost to verify proof of solvency - -395579 gas units (run `cargo run --release --example gen_solvency_verifier`) +| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | +| ------------------ | ------------------- | ------------------- | ------------------- | ------------------ | +| 87.78 ms | 123.86 ms | 380.86 ms | 3.7287 ms | 1632 | diff --git a/zk_prover/benches/full_solvency_flow.rs b/zk_prover/benches/full_solvency_flow.rs index 66164d70..bc467413 100644 --- a/zk_prover/benches/full_solvency_flow.rs +++ b/zk_prover/benches/full_solvency_flow.rs @@ -1,41 +1,31 @@ #![feature(generic_const_exprs)] use criterion::{criterion_group, criterion_main, Criterion}; -use halo2_proofs::{ - halo2curves::bn256::Fr as Fp, - plonk::{keygen_pk, keygen_vk}, -}; +use halo2_proofs::plonk::{keygen_pk, keygen_vk}; use snark_verifier_sdk::CircuitExt; use summa_solvency::{ circuits::merkle_sum_tree::MstInclusionCircuit, - circuits::{ - solvency::SolvencyCircuit, - utils::{full_prover, full_verifier, generate_setup_artifacts}, - }, - merkle_sum_tree::MerkleSumTree, + circuits::utils::{full_prover, full_verifier, generate_setup_artifacts}, + merkle_sum_tree::{MerkleSumTree, Tree}, }; const SAMPLE_SIZE: usize = 10; -const LEVELS: usize = 15; -const N_ASSETS: usize = 1; -const PATH_NAME: &str = "one_asset"; +const LEVELS: usize = 20; +const N_CURRENCIES: usize = 1; const N_BYTES: usize = 14; fn build_mstree(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); + let csv_file = format!("benches/csv/{}_entry_2_{}.csv", N_CURRENCIES, LEVELS); let bench_name = format!( - "build Merkle sum tree for 2 power of {} entries with {} assets", - LEVELS, N_ASSETS + "build Merkle sum tree for 2 power of {} entries with {} currencies", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { - MerkleSumTree::::new(&csv_file).unwrap(); + MerkleSumTree::::from_csv(&csv_file).unwrap(); }) }); } @@ -43,19 +33,16 @@ fn build_mstree(_c: &mut Criterion) { fn build_sorted_mstree(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); + let csv_file = format!("benches/csv/{}_entry_2_{}.csv", N_CURRENCIES, LEVELS); let bench_name = format!( - "build sorted Merkle sum tree for 2 power of {} entries with {} assets", - LEVELS, N_ASSETS + "build sorted Merkle sum tree for 2 power of {} entries with {} currencies", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { - MerkleSumTree::::new_sorted(&csv_file).unwrap(); + MerkleSumTree::::from_csv_sorted(&csv_file).unwrap(); }) }); } @@ -63,13 +50,13 @@ fn build_sorted_mstree(_c: &mut Criterion) { fn verification_key_gen_mst_inclusion_circuit(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let empty_circuit = MstInclusionCircuit::::init_empty(); + let empty_circuit = MstInclusionCircuit::::init_empty(); let (params, _, _) = generate_setup_artifacts(13, None, empty_circuit.clone()).unwrap(); let bench_name = format!( - "gen verification key for 2 power of {} entries with {} assets mst inclusion circuit", - LEVELS, N_ASSETS + "gen verification key for 2 power of {} entries with {} currencies mst inclusion circuit", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { @@ -81,13 +68,13 @@ fn verification_key_gen_mst_inclusion_circuit(_c: &mut Criterion) { fn proving_key_gen_mst_inclusion_circuit(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let empty_circuit = MstInclusionCircuit::::init_empty(); + let empty_circuit = MstInclusionCircuit::::init_empty(); let (params, _, vk) = generate_setup_artifacts(13, None, empty_circuit.clone()).unwrap(); let bench_name = format!( - "gen proving key for 2 power of {} entries with {} assets mst inclusion circuit", - LEVELS, N_ASSETS + "gen proving key for 2 power of {} entries with {} currencies mst inclusion circuit", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { @@ -99,155 +86,59 @@ fn proving_key_gen_mst_inclusion_circuit(_c: &mut Criterion) { fn generate_zk_proof_mst_inclusion_circuit(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let empty_circuit = MstInclusionCircuit::::init_empty(); + let empty_circuit = MstInclusionCircuit::::init_empty(); - let (params, pk, vk) = generate_setup_artifacts(13, None, empty_circuit).unwrap(); + let (params, pk, _) = generate_setup_artifacts(13, None, empty_circuit).unwrap(); - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); + let csv_file = format!("benches/csv/{}_entry_2_{}.csv", N_CURRENCIES, LEVELS); - let merkle_sum_tree = MerkleSumTree::::new(&csv_file).unwrap(); + let merkle_sum_tree = MerkleSumTree::::from_csv(&csv_file).unwrap(); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); - - let bench_name = format!( - "generate zk proof - tree of 2 power of {} entries with {} assets mst inclusion circuit", - LEVELS, N_ASSETS - ); - criterion.bench_function(&bench_name, |b| { - b.iter(|| { - full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); - }) - }); -} - -fn verify_zk_proof_mst_inclusion_circuit(_c: &mut Criterion) { - let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - - let empty_circuit = MstInclusionCircuit::::init_empty(); - - let (params, pk, vk) = generate_setup_artifacts(13, None, empty_circuit).unwrap(); - - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); - - let merkle_sum_tree = MerkleSumTree::::new(&csv_file).unwrap(); - - // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); - - let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); - - println!("proof size in bytes: {}", proof.len()); - - let bench_name = format!( - "verify zk proof - tree of 2 power of {} entries with {} assets mst inclusion circuit", - LEVELS, N_ASSETS - ); - criterion.bench_function(&bench_name, |b| { - b.iter(|| { - full_verifier(¶ms, &vk, proof.clone(), circuit.instances()); - }) - }); -} -fn verification_key_gen_solvency_circuit(_c: &mut Criterion) { - let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); + let user_index = 0; - let empty_circuit = SolvencyCircuit::::init_empty(); + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let (params, _, _) = generate_setup_artifacts(11, None, empty_circuit.clone()).unwrap(); + let circuit = MstInclusionCircuit::::init(merkle_proof); let bench_name = format!( - "gen verification key for 2 power of {} entries with {} assets solvency circuit", - LEVELS, N_ASSETS + "generate zk proof - tree of 2 power of {} entries with {} currencies mst inclusion circuit", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { - keygen_vk(¶ms, &empty_circuit).expect("vk generation should not fail"); - }) - }); -} - -fn proving_key_gen_solvency_circuit(_c: &mut Criterion) { - let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - - let empty_circuit = SolvencyCircuit::::init_empty(); - - let (params, _, vk) = generate_setup_artifacts(11, None, empty_circuit.clone()).unwrap(); - - let bench_name = format!( - "gen proving key for 2 power of {} entries with {} assets solvency circuit", - LEVELS, N_ASSETS - ); - criterion.bench_function(&bench_name, |b| { - b.iter(|| { - keygen_pk(¶ms, vk.clone(), &empty_circuit).expect("pk generation should not fail"); + full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); }) }); } -fn generate_zk_proof_solvency_circuit(_c: &mut Criterion) { +fn verify_zk_proof_mst_inclusion_circuit(_c: &mut Criterion) { let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); - let empty_circuit = SolvencyCircuit::::init_empty(); - - let (params, pk, vk) = generate_setup_artifacts(11, None, empty_circuit).unwrap(); + let empty_circuit = MstInclusionCircuit::::init_empty(); - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); + let (params, pk, vk) = generate_setup_artifacts(13, None, empty_circuit).unwrap(); - let merkle_sum_tree = MerkleSumTree::::new(&csv_file).unwrap(); + let csv_file = format!("benches/csv/{}_entry_2_{}.csv", N_CURRENCIES, LEVELS); - let asset_sums = merkle_sum_tree.root().balances.map(|x| x + Fp::from(1)); + let merkle_sum_tree = MerkleSumTree::::from_csv(&csv_file).unwrap(); // Only now we can instantiate the circuit with the actual inputs - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - let bench_name = format!( - "generate zk proof - tree of 2 power of {} entries with {} assets solvency circuit", - LEVELS, N_ASSETS - ); - criterion.bench_function(&bench_name, |b| { - b.iter(|| { - full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); - }) - }); -} -fn verify_zk_proof_solvency_circuit(_c: &mut Criterion) { - let mut criterion = Criterion::default().sample_size(SAMPLE_SIZE); + let user_index = 0; - let empty_circuit = SolvencyCircuit::::init_empty(); + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let (params, pk, vk) = generate_setup_artifacts(11, None, empty_circuit).unwrap(); - - let csv_file = format!( - "benches/csv/{}/{}_entry_2_{}.csv", - PATH_NAME, PATH_NAME, LEVELS - ); - - let merkle_sum_tree = MerkleSumTree::::new(&csv_file).unwrap(); - - let asset_sums = merkle_sum_tree.root().balances.map(|x| x + Fp::from(1)); - - // Only now we can instantiate the circuit with the actual inputs - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); + let circuit = MstInclusionCircuit::::init(merkle_proof); let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); println!("proof size in bytes: {}", proof.len()); let bench_name = format!( - "verify zk proof - tree of 2 power of {} entries with {} assets solvency circuit", - LEVELS, N_ASSETS + "verify zk proof - tree of 2 power of {} entries with {} currencies mst inclusion circuit", + LEVELS, N_CURRENCIES ); criterion.bench_function(&bench_name, |b| { b.iter(|| { @@ -264,9 +155,5 @@ criterion_group!( proving_key_gen_mst_inclusion_circuit, generate_zk_proof_mst_inclusion_circuit, verify_zk_proof_mst_inclusion_circuit, - verification_key_gen_solvency_circuit, - proving_key_gen_solvency_circuit, - generate_zk_proof_solvency_circuit, - verify_zk_proof_solvency_circuit ); criterion_main!(benches); diff --git a/zk_prover/examples/commitment_solidity_calldata.json b/zk_prover/examples/commitment_solidity_calldata.json new file mode 100644 index 00000000..90faf8a9 --- /dev/null +++ b/zk_prover/examples/commitment_solidity_calldata.json @@ -0,0 +1,7 @@ +{ + "root_hash": "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1", + "root_balances": [ + "0x87f3e", + "0x87f3e" + ] +} \ No newline at end of file diff --git a/zk_prover/examples/gen_commitment.rs b/zk_prover/examples/gen_commitment.rs new file mode 100644 index 00000000..c805de2a --- /dev/null +++ b/zk_prover/examples/gen_commitment.rs @@ -0,0 +1,41 @@ +#![feature(generic_const_exprs)] + +use serde_json::to_string_pretty; +use std::{fs::File, io::Write}; +use summa_solvency::{ + circuits::types::CommitmentSolidityCallData, + circuits::utils::field_element_to_solidity_calldata, + merkle_sum_tree::{MerkleSumTree, Tree}, +}; + +const N_CURRENCIES: usize = 2; +const N_BYTES: usize = 14; + +fn main() { + let merkle_sum_tree = + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let root = merkle_sum_tree.root(); + + // The commitment to be published on-chain is made of (root_hash, root_balances) + let root_hash_hex_string = field_element_to_solidity_calldata(root.hash); + let root_balances_hex_strings: Vec = root + .balances + .iter() + .map(|balance| field_element_to_solidity_calldata(*balance)) + .collect(); + + let commitment = CommitmentSolidityCallData { + root_hash: root_hash_hex_string, + root_balances: root_balances_hex_strings, + }; + + // Serialize to a JSON string + let serialized_data = to_string_pretty(&commitment).expect("Failed to serialize data"); + + // Save the serialized data to a JSON file + let mut file = File::create("./examples/commitment_solidity_calldata.json") + .expect("Unable to create file"); + file.write_all(serialized_data.as_bytes()) + .expect("Unable to write data to file"); +} diff --git a/zk_prover/examples/gen_inclusion_proof.rs b/zk_prover/examples/gen_inclusion_proof.rs new file mode 100644 index 00000000..4d93e723 --- /dev/null +++ b/zk_prover/examples/gen_inclusion_proof.rs @@ -0,0 +1,77 @@ +#![feature(generic_const_exprs)] + +use serde_json::to_string_pretty; +use snark_verifier_sdk::{ + evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}, + CircuitExt, +}; +use std::{fs::File, io::Write, path::Path}; +use summa_solvency::{ + circuits::{ + merkle_sum_tree::MstInclusionCircuit, + types::ProofSolidityCallData, + utils::{gen_proof_solidity_calldata, generate_setup_artifacts}, + }, + merkle_sum_tree::{MerkleSumTree, Tree}, +}; + +const LEVELS: usize = 4; +const N_CURRENCIES: usize = 2; +const N_BYTES: usize = 14; + +fn main() { + let merkle_sum_tree = + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + // In order to generate a proof for testing purpose we create the circuit using the init() method + // which takes as input the merkle sum tree and the index of the leaf we are generating the proof for. + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + // Generate the circuit with the actual inputs + let circuit = MstInclusionCircuit::::init(merkle_proof); + + // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). + let (params, pk, _) = + generate_setup_artifacts(11, Some("../backend/ptau/hermez-raw-11"), circuit.clone()) + .unwrap(); + + let instances = circuit.instances(); + + let num_instances = circuit.num_instance(); + + let yul_output_path = "../contracts/src/InclusionVerifier.yul"; + + let deployment_code = + gen_evm_verifier_shplonk::>( + ¶ms, + pk.get_vk(), + num_instances, + Some(Path::new(yul_output_path)), + ); + + let proof = gen_evm_proof_shplonk(¶ms, &pk, circuit.clone(), instances.clone()); + + let proof_solidity_calldata = gen_proof_solidity_calldata(¶ms, &pk, circuit.clone()); + + let proof_hex_string = format!("0x{}", hex::encode(&proof_solidity_calldata.clone().0 .0)); + + let data = ProofSolidityCallData { + proof: proof_hex_string, + public_inputs: proof_solidity_calldata.1, + }; + + // Serialize the data to a JSON string + let serialized_data = to_string_pretty(&data).expect("Failed to serialize data"); + + // Save the serialized data to a JSON file + let mut file = File::create("./examples/inclusion_proof_solidity_calldata.json") + .expect("Unable to create file"); + file.write_all(serialized_data.as_bytes()) + .expect("Unable to write data to file"); + + let gas_cost = evm_verify(deployment_code, instances, proof); + + print!("gas_cost: {:?}", gas_cost); +} diff --git a/zk_prover/examples/gen_inclusion_verifier.rs b/zk_prover/examples/gen_inclusion_verifier.rs index 9f439aba..1edbd46a 100644 --- a/zk_prover/examples/gen_inclusion_verifier.rs +++ b/zk_prover/examples/gen_inclusion_verifier.rs @@ -1,29 +1,25 @@ #![feature(generic_const_exprs)] -use serde_json::to_string_pretty; -use snark_verifier_sdk::{ - evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}, - CircuitExt, -}; -use std::{fs::File, io::Write, path::Path}; -use summa_solvency::{ - circuits::{ - merkle_sum_tree::MstInclusionCircuit, - types::ProofSolidityCallData, - utils::{ - gen_proof_solidity_calldata, generate_setup_artifacts, write_verifier_sol_from_yul, - }, - }, - merkle_sum_tree::MerkleSumTree, +use halo2_proofs::halo2curves::{bn256::Fr as Fp, ff::PrimeField}; +use num_bigint::BigInt; +use num_traits::Num; +use snark_verifier_sdk::{evm::gen_evm_verifier_shplonk, CircuitExt}; +use std::path::Path; +use summa_solvency::circuits::{ + merkle_sum_tree::MstInclusionCircuit, + utils::{generate_setup_artifacts, write_verifier_sol_from_yul}, }; const LEVELS: usize = 4; -const N_ASSETS: usize = 2; +const N_CURRENCIES: usize = 2; const N_BYTES: usize = 14; fn main() { + // Assert that there is no risk of overflow in the Merkle Root given the combination of `N_BYTES` and `LEVELS` + assert!(!is_there_risk_of_overflow(N_BYTES, LEVELS), "There is a risk of balance overflow in the Merkle Root, given the combination of `N_BYTES` and `LEVELS`"); + // In order to generate the verifier we create the circuit using the init_empty() method, which means that the circuit is not initialized with any data. - let circuit = MstInclusionCircuit::::init_empty(); + let circuit = MstInclusionCircuit::::init_empty(); // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). let (params, pk, _) = @@ -35,7 +31,7 @@ fn main() { let yul_output_path = "../contracts/src/InclusionVerifier.yul"; let sol_output_path = "../contracts/src/InclusionVerifier.sol"; - let deployment_code = gen_evm_verifier_shplonk::>( + gen_evm_verifier_shplonk::>( ¶ms, pk.get_vk(), num_instances, @@ -43,37 +39,23 @@ fn main() { ); write_verifier_sol_from_yul(yul_output_path, sol_output_path).unwrap(); +} - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv").unwrap(); - - // In order to generate a proof for testing purpose we create the circuit using the init() method - // which takes as input the merkle sum tree and the index of the leaf we are generating the proof for. - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); - - let instances = circuit.instances(); - - let proof = gen_evm_proof_shplonk(¶ms, &pk, circuit.clone(), instances.clone()); - - let proof_solidity_calldata = gen_proof_solidity_calldata(¶ms, &pk, circuit.clone()); - - let proof_hex_string = format!("0x{}", hex::encode(&proof_solidity_calldata.clone().0 .0)); - - let data = ProofSolidityCallData { - proof: proof_hex_string, - public_inputs: proof_solidity_calldata.1, - }; - - // Serialize the data to a JSON string - let serialized_data = to_string_pretty(&data).expect("Failed to serialize data"); +// Calculate the maximum value that the Merkle Root can have, given N_BYTES and LEVELS +fn calculate_max_root_balance(n_bytes: usize, n_levels: usize) -> BigInt { + // The max value that can be stored in a leaf node or a sibling node, according to the constraint set in the circuit + let max_leaf_value = BigInt::from(2).pow(n_bytes as u32 * 8) - 1; + max_leaf_value * (n_levels + 1) +} - // Save the serialized data to a JSON file - let mut file = File::create("./examples/inclusion_proof_solidity_calldata.json") - .expect("Unable to create file"); - file.write_all(serialized_data.as_bytes()) - .expect("Unable to write data to file"); +// Given a combination of `N_BYTES` and `LEVELS`, check if there is a risk of overflow in the Merkle Root +fn is_there_risk_of_overflow(n_bytes: usize, n_levels: usize) -> bool { + // Calculate the max root balance value + let max_root_balance = calculate_max_root_balance(n_bytes, n_levels); - let gas_cost = evm_verify(deployment_code, instances, proof); + // The modulus of the BN256 curve + let modulus = BigInt::from_str_radix(&Fp::MODULUS[2..], 16).unwrap(); - print!("gas_cost: {:?}", gas_cost); + // Check if the max balance value is greater than the prime + max_root_balance > modulus } diff --git a/zk_prover/examples/gen_solvency_verifier.rs b/zk_prover/examples/gen_solvency_verifier.rs deleted file mode 100644 index 2680fdd8..00000000 --- a/zk_prover/examples/gen_solvency_verifier.rs +++ /dev/null @@ -1,86 +0,0 @@ -#![feature(generic_const_exprs)] - -use halo2_proofs::halo2curves::bn256::Fr as Fp; -use serde_json::to_string_pretty; -use snark_verifier_sdk::{ - evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}, - CircuitExt, -}; -use std::{fs::File, io::Write, path::Path}; -use summa_solvency::{ - circuits::{ - solvency::SolvencyCircuit, - types::ProofSolidityCallData, - utils::{ - gen_proof_solidity_calldata, generate_setup_artifacts, write_verifier_sol_from_yul, - }, - }, - merkle_sum_tree::MerkleSumTree, -}; - -const N_ASSETS: usize = 2; -const N_BYTES: usize = 14; - -fn main() { - // In order to generate the verifier we create the circuit using the init_empty() method, which means that the circuit is not initialized with any data. - let circuit = SolvencyCircuit::::init_empty(); - - // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). - let (params, pk, _) = - generate_setup_artifacts(10, Some("../backend/ptau/hermez-raw-11"), circuit.clone()) - .unwrap(); - - let num_instances = circuit.num_instance(); - - let yul_output_path = "../contracts/src/SolvencyVerifier.yul"; - let sol_output_path = "../contracts/src/SolvencyVerifier.sol"; - - let deployment_code = gen_evm_verifier_shplonk::>( - ¶ms, - pk.get_vk(), - num_instances, - Some(Path::new(yul_output_path)), - ); - - write_verifier_sol_from_yul(yul_output_path, sol_output_path).unwrap(); - - // In order to generate a proof for testing purpose we create the circuit using the init() method, which take as input the merkle sum tree and the asset sums. - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv").unwrap(); - - let asset_sums = [Fp::from(556863u64), Fp::from(556863u64)]; - - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). - let (params, pk, _) = - generate_setup_artifacts(10, Some("../backend/ptau/hermez-raw-11"), circuit.clone()) - .unwrap(); - - let num_instances = circuit.num_instance(); - let instances = circuit.instances(); - - let proof = gen_evm_proof_shplonk(¶ms, &pk, circuit.clone(), instances.clone()); - - let proof_solidity_calldata = gen_proof_solidity_calldata(¶ms, &pk, circuit.clone()); - - let proof_hex_string = format!("0x{}", hex::encode(&proof_solidity_calldata.clone().0 .0)); - - let data = ProofSolidityCallData { - proof: proof_hex_string, - public_inputs: proof_solidity_calldata.1, - }; - - // Serialize the data to a JSON string - let serialized_data = to_string_pretty(&data).expect("Failed to serialize data"); - - // Save the serialized data to a JSON file - let mut file = File::create("./examples/solvency_proof_solidity_calldata.json") - .expect("Unable to create file"); - file.write_all(serialized_data.as_bytes()) - .expect("Unable to write data to file"); - - let gas_cost = evm_verify(deployment_code, instances, proof); - - print!("gas_cost: {:?}", gas_cost); -} diff --git a/zk_prover/examples/inclusion_proof_solidity_calldata.json b/zk_prover/examples/inclusion_proof_solidity_calldata.json index 7aad7233..5bc919e9 100644 --- a/zk_prover/examples/inclusion_proof_solidity_calldata.json +++ b/zk_prover/examples/inclusion_proof_solidity_calldata.json @@ -1,7 +1,9 @@ { - "proof": "0x20915f0d4ee13b0f773e691621c4928b83b08ae6e3aed158976eb2ef1781cfa109afb66750a062a7a8cbacaf1149308efe1b274fd61a768101c72dff47370b7e0447eafd8e01e3775851f6ce2aa6458b5193449ddc80ee0ae08f8213d98bd121135193e6fc64182ce38da867ed9eb9b163c10bffdd0639200b8097e98da05e140ddf7ebeb2e40ecbcca43014f3fafe4c7512a76e1c936f4e34a3c681ffe6da7003ff5fafde2132aae22440d510ce903a712dfe29a1f308311a5d0f95a6eacdd904d4197fbba0c2c589c35456629393cfa0740657645c854973e4cb902c33155e0d30a3f1cab21461def7045cf5c1514a390ddc4f89d082304fbb9bb72cd2aa1a242239b3e980df0348ec3a3360cbf3e72d83d6a85fe9431752cb689395c926f81eb1a04b332a5d9573f2cb7b988d0fe49687fa232ab2472f1aae47432335ac710c1d210547ff2f93a0a233d80fe3f4c2a683cc3273bf90676656f0d69ed1ccf721484460a99e140de309cbcee7f5ed9d0e84f021d214457349797275e40c7fc92c578c4bf2d1d6b9c9f5134261bf26c79a6437be946d72ac368add653fc007610c5be8be22dd3c99cdb24e024206619bd072cc068ea4828288f9d075b91720ff1a02871f0707d48d8217a6572ae8e4164012c9de818226ccd1be7db9f43eb6bc1312184bd7e125b9ab4ed04442fffb17052faf8fb35a4d2603520bf11cf228720dc9c4b63c83bfed43104528fab3dab4d9524881a9e6cf20a731dcf6f0def235258a98fc0bef2dfb9bfceb6f270009473f9cfa6739ac47e9d3eb5eb7444079d007add1686645f019607dd33e3e16041aaee1c8cf0692d867c1166347e2b090ec1928f9dc9d73dc3a3a596824d124ecae398f45a84b6cbbedfec416f94b788fd2211584dc44dffb9cdb5b24fbb36b8e06265f2e61d9c16abe43850b0e100be2702caee065ba5353038939d221fbda5824d5ec8e68b06f0198fda4829b40f588fb27dc7295709f4cad4f02b90096e57dc300af3cfc644c14aae7a6201e5c0d2a2e0b73428b9bd5f10c9be516c1f850a557f013cf27cc357ecf6b1a6e445f5d75e8167ff43a7e19acc59c240ed1d918f9d13347099ba8864b08a3ea1b06dab64a9a26f92c5035287181bfbb82dcf96132c4c28b4faf2779c3907424bac9529140fd2f73787050de67a9eb4ca2549aa42db52fa6558ff5ee441e43a708d0b7182d25026c6c54fb1b3a9cd7823d6861ea065a32b63e1fe11cda017cd9a969e20b7e9f1f9933de26c02f4e6645773d37be67573574de0e967553eba8dfa6f4728be0d6009e1dd03ea2010912a9b01d6641591229c43440869ad4561fef86c26ae463a1210680cf3f0af0c0328903b1b1af1e23109ecca9a8bca6b7fbbf091f4bf112a40802cfd52b8c4d1e02b09b56afac0d6aeb894fcafd3856d36542bc744a0661b52f6a13ac9ba1dcb552ca1b2205815b10d364237fb83db626c02d8b6670fff96d13f40532806e6c7e8f0e3656a0e75741cc6c37d450e198ccf276670029a4bc9c15650226898a98f4763a459c5aa18d28d67775ddb13ac9ae1dc62a08dd0f592c15b18565f0b46f61a3c92e3d80a938aa4fc70ea71c418c368ae73410cded87ac0079d60ac04155d44ebd9d53aa5967409bd81a23c6141b86f0b955298272d81828f5a90f08e6ecc22286dc97208ebb36876b81a26da23ba09dc529f8ebf7294d0d557e14755c1cc8af10977ff0ee5f5826d13eaee84cd0dc08a7a494f144b26529e2b4b41eeead5b7318d28faf23962493b4d06dc51a40ec03892727c1133bde0a2f6ba7bfa8f9d261fdf0aaf303cd6cc4c1a5483d45ef8451c19d209d7fb63e1ae22a2652fa3696b09d6834f2cab4cc0749bcb0a8f9210242b2485e6adb5aef23d9a545d08d2f0fe8a84120ca2c5ad5d998536ba9d86836949a28e246f22059206ba16b68a7510ea6ea801ff3af65490be25cb32c6e2e3e958de49cfb8501852f61fe1af50471376e10db200eb89accaa2a400a8235cf0cb3f7bc6d69d1c67e15bb88c4e2d8e5d4e25a8d890fbb95e6f7bf082ea795df8f29f54d0b9ccbecb72d7c76019c25584553ecd518face907a19d91131439bb63df871b53685d631931322d656297616a4ba7382b51d1cbe5fb15b56e1ba5c4ec093bfd8994f618f891ebfad8b93e48c57781ac7394372036010454d433fca08292b444da888cd469614029fece429cd043352ef39bf2bee9a15a6f878238ef4622a9d84d47e138dd81af3a39ebfdeccf85e3dfb61195fb062fb3dd2affb8efa0259a2fbf9a9541c7118a845fe2f4847840a84444b7f8dec8e6bb649e145b6d4815cae4d17563763950729f96fafd5fba5f24021188df77ab4b443497d8990e58d4855d8939738187b2bf0629c7150c0ac31aed7b10635615110713bdd1286a0f57e531e21b127a18e1866688a312d558158bd65237ecfb43b5256ccc65b3a9024f1fb59f2c3d71cea2232820ad7bceb6d70dae830ee378f36f7f338e4cd908eb6c1720395ad3d7faa300d12109f274bffb2684364a1f709b4da6c093ccdc5b2ce6e2fae39238b0b35035975b59a763024eaecb62aaeaf1857ee9551f8654bd98efc649dbd52ae0df0040c540283a6a8a121121e18b8d3ea1cec896f8a7d6b787d2eae3cfc6e2991d70cc456c8431a329b9bd4d2eef293172386075d8ff091e816373048940a10d93703c06b81f510b1df541089a83fdfeaff914b4c3cdae8a8d990daa4d941565ccc0222d574fc693b505a223d81580221208c156a02603632f2093b1f1d896d36a3049a3e85d60e7017e04ef5d78a0964d63b50cabdcd27de0a31aad462553d208a1da12050832f76381b6830d8796a06c8bef43ab4b6934704c8ab69d001bd02762a74e5e360a97682f5720c914b318353dc521fc0dd7404b362c389f8a333e3901198585a9ba11454f9076dee844fdac101c409d75314e5f728507661fb96818f0edf6564266421ca1e980fed4e747113712b1431107456eba6bdc998c62bcdd6", + "proof": "0x27a0389c488b4cd73df50563432f8b89f206f018a19488ab25c21e9b7e49023118e9222b5e6b6066fe192856822cb6d6d9ee11129f1ce80cfab7d3a11ec22a490616a05a90bb684f6b71b207fe80a14007932294e9b88b19c0c4b2d26f7b4f3c135d03d9db7373a4bbdfccefd739ec0d076ba4db3f4e56c5e4699d6a7f985aa216c85ff78772031957a82b23340bef55918da7a2a79ba4c3808daade0a37e94e27bfa945476b83f0707e249aebf3cf1a46630e44192821182f2b7c6b2cceeb2312bcc52c3aa4c6a146c24a8a618f35277b8593b5cabe673152a2c57c6ccc57941487964d791890887e692872ca406b8d9e3679af1d1ca7f06e1ef8df1afc2cab18dc5f1578a3c1e0755075c8adcbf27f84cb6e83200114ea6373b8425144209b21acd82423286ffab3a661e24ce0deaf837a21e0d60d834862384626b0a79078110e999f5be5012862976925e99a21e5e70fddb8d0797981e6fbde334b593141204ee1faeca5ab60c87ada401c8398f597303f3d203c6fe40647c4e86af87ffa1fe140323d709995ce696237b3d1a9d0b0f2a6623986fb9bd73e965b77bf61d1242f9a0410ce837e0d0f9bc460e72c5c00b9cf42f2398d2a7f5a484ad13304bc002a522b3564c4f4e318bb20445e6fd17b32ee65038ff0bd143ea7aa9b3eccdd023c6c3171644f2270bd5a1fb5b403dd82c1bbba6cee706a44d4c0dbf676e4272e5fb662b3527fcaa4e93dbf39a2ca6d67cb34b121a4736c55e2792bdca9ca9226bebf7bf8fa2397aaa67970cdb8771dce8a32bec5945762e10df4a420e0ab94253785c19daceeaf8dfbdd67f16fae4aebf61a3ca136f5a02da7d22b6aa98c82064b756142f5eff6ec8cce7abe4365cf604720d5117343dcc3b3e725a5dfd5f92f8f464cac42b044a838ced0bb4ac6684871b146cf83fe19be4de2f333cac261100e7097d550c20d277bc1268d0202748e5228f53b48e591ca8467c0e9ef79fb2fcc88c26a7b7e77f0933777208cb6d5b61129f957b301ab9c0c53f32b8f3ae923b5bb54e14a60c31a712878538f0fc2b469dc839bf141485510eba3b2b4bc4c1d6a2e997cf7e88d41b10b20a5eac91440af9ddabcdd9080aeff6209304f804f2f949b48df7b651a71b6718d766ec75fb6804275e38c2babe2f462b8c8a081ec0178735ca0a7535769a9c0b897f6b8950daa2f874a79f7f750e66637eb23720b1717fe28c1500e746af296913a24ec757317ac6c7e116cc8e375b5d83b1acd1130485c298ff97780af993fa168af22d3b78fea364c88455b45c74f3feca3d3ff1286f2cc47cddcd53a659452a89fe2c3327a1570c951aecf79fefd864a4c1236031c0baf5b9296310e2ce67e015893c862be776ac3d062acf8197d19a872ed600a1227f2673b53d00af2a62bb62464140decf7acd8731d02f5ffbe0f764787d212a13a824b387f43db60aae835915c792ffe1df8e0f55cef8995be2105a1a238066ab16f09388e8632ca3413ca64bdc1f237a7166c2d4c49ee1d58a47a524a830a59f6428490b7004042f2bd45db1f1386f0928a4220a25b146dee083fa2d8ac040bab224980b0b04469172b55c63e756d80577e329df286d789f0ad062edcfa0d7530a9f867664e232c2479de285b6e9fca0a4e31421c6b5f36d0c33b0c28c909e7a6b2bcff35768eaa655658718ea40cc00d0da3328b69a600e19de579f6ae1e861a9b1f5f8c19d2fda694a82b99142a13d3ca201d1840cf57c24946a0e7461f3075917b3a63fa9297982cf5a7dd7510ad4de39d19f9613283bb5ee0a14156156eb77e59d39651a4e1405bdb8ab18ce0d2a60ebae62dbb74cc34523d1b07e7077611771f5b671e4278a2cca424ff0a573d0ea2165743d5d046205a7bfcd0d30ebe92205a348a7dccabe01d007d3aa76c9f87a16c4a020c580cc83a86fb90f428ad69b27b86b84d9e9e46797917d8049c99317eb4816b8c98467659d1eaa7922aa6c8756402422a99e3a133ad93e8ae16eb63e158932f7f56af43bca7c0458a1e0444dd989c86710e61b7081b9408d5ee0f770930930c47c3a5a8d56efe0e2606ef8e356f231615ce84be9a20c6c1012aad5fed4b5d9b4842e69e158a0187ff12ca825e4673ba41f316f2571f432990a3ec5f4ce870a89ead676eb42ef28f3614c1a396e19010cbd9fab6bdae5d7979597f4ce5970ad670c7764596d97674801ab93aafe3ce40b5326fb0828bec959509afbef5360759930528ea031aab4a0d187a672dcb8aabae366ef2beac81e3e50b8889eb723e578cae538091105143591c4fff0ffa2249df547d1e2383f30c6533db3f8f53cbb2b2c26cf49d1e6fb8eb17a49313c644522f5feb6bfc47e86ce56e95690ff3fdeb53d5d5cf21ea2ae8ca21658f93f7578f6dd157634d0de47d4ba3d359d2c21a9bbeac0e098a46289a6f15ac10406f5ad2792dc713680706c8e49a78162a344d6d26b4ec9407717d5af41fcaaa2745167587c19065297e457a2b2b698cd3bb094117cd4b911c4ef6bb581798b0a7052ebd9371f0783534aae77564f788a3c4418af7338bb861c32de8ca1990592ddf447ed8474f4354c3907fcb23df5c0ac295017aa11e154d6b745b6b0e74ed70fe3e89a773805cc9e61c2ac5c45863a94287dff7b8abaf1f3e4d53a302950cb4d19fa0ad57dfcc0c44542646f8e4d43895c6eb34a7ae5f6a5d756be92768544c25a4f70bbe2a9099771bb760c26d1df57a6e88ecb31190545fa3b355167389e575bfce42968df57b325c0705b7577c04b5ab86baa02d044dbe4b2ba00e22275dc34fa4f803828ac26546f532e21f0ffa914a7a935119f7b357978f9417ffbb75f43dfe11184b7578298982f4f253e328e537e270425f2c6bf19eb3ce2050498b02a27b14228a9a5f3d4cc9c5a9c5e091b00dd5e60a5ca204cb922b7c230fbb16da7a6f8f88603081bd2914f59211d7da836aa5def01c20e92ce3ccee12cd38296961933f47b13c3cd9d75af536986ebba0cff0ff96c8d176ed386b83", "public_inputs": [ "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", - "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5" + "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1", + "0x87f3e", + "0x87f3e" ] -} +} \ No newline at end of file diff --git a/zk_prover/examples/nova_incremental_verifier.rs b/zk_prover/examples/nova_incremental_verifier.rs index 7ab36e43..a93e183e 100644 --- a/zk_prover/examples/nova_incremental_verifier.rs +++ b/zk_prover/examples/nova_incremental_verifier.rs @@ -13,9 +13,9 @@ use nova_scotia::{ use nova_snark::{provider, CompressedSNARK, PublicParams}; use num_bigint::BigUint; use serde_json::json; -use summa_solvency::merkle_sum_tree::big_intify_username; +use summa_solvency::merkle_sum_tree::utils::big_intify_username; -const N_ASSETS: usize = 2; +const N_CURRENCIES: usize = 2; /// In this scenario the Exchange is generating an incremental inclusion proof for a user after 3 rounds. /// It means that starting from this proof, the user can verify their correct inclusion in the Liabilities Tree for each round up to round 3 in a single proof. @@ -26,18 +26,15 @@ fn run_test(circuit_filepath: String, witness_gen_filepath: String) { let liabilities_state_0 = Fr::from_str("0").unwrap(); // Merkle Proof represents the inclusion proof for the user 0 for each state - let merkle_proof_1 = - build_merkle_proof("examples/states/entry_16_1.csv".to_string(), 0).unwrap(); + let merkle_proof_1 = build_merkle_proof("../csv/states/entry_16_1.csv".to_string(), 0).unwrap(); let liabilities_state_1 = build_liabilities_state_cur(liabilities_state_0, merkle_proof_1.root.hash); - let merkle_proof_2 = - build_merkle_proof("examples/states/entry_16_2.csv".to_string(), 0).unwrap(); + let merkle_proof_2 = build_merkle_proof("../csv/states/entry_16_2.csv".to_string(), 0).unwrap(); let liabilities_state_2 = build_liabilities_state_cur(liabilities_state_1, merkle_proof_2.root.hash); - let merkle_proof_3 = - build_merkle_proof("examples/states/entry_16_3.csv".to_string(), 0).unwrap(); + let merkle_proof_3 = build_merkle_proof("../csv/states/entry_16_3.csv".to_string(), 0).unwrap(); let liabilities_state_3 = build_liabilities_state_cur(liabilities_state_2, merkle_proof_3.root.hash); @@ -235,29 +232,33 @@ fn main() { run_test(circuit_filepath.clone(), witness_gen_filepath); } -use num_traits::{FromPrimitive, Num}; +use num_traits::Num; use poseidon_rs::{Fr, Poseidon}; // Note that we cannot reuse the MerkleSumTree implementation from zk_prover because it is not compatible with circom's Poseidon Hasher #[derive(Clone, Debug)] -struct Node { +struct Node { hash: Fr, - balance: [Fr; N_ASSETS], + balance: [Fr; N_CURRENCIES], } #[derive(Clone, Debug)] -struct MerkleProof { +struct MerkleProof { username: String, user_balances: Vec, path_element_hashes: Vec, path_element_balances: Vec>, path_indices: Vec, - root: Node, + root: Node, } -impl Node { +impl Node { /// Constructs a new Node given left and right child hashes. - fn new(left: &Node, right: &Node, hasher: &Poseidon) -> Node { + fn new( + left: &Node, + right: &Node, + hasher: &Poseidon, + ) -> Node { let mut input = vec![left.hash]; input.extend(left.balance); input.push(right.hash); @@ -265,8 +266,8 @@ impl Node { let mut balance = vec![]; - // iterate over N_ASSETS - for i in 0..N_ASSETS { + // iterate over N_CURRENCIES + for i in 0..N_CURRENCIES { let mut sum = Fr::from_str("0").unwrap(); sum.add_assign(&left.balance[i]); sum.add_assign(&right.balance[i]); @@ -282,7 +283,10 @@ impl Node { } /// Generates a Merkle proof of inclusion for a leaf at a given index -fn build_merkle_proof(csv_filepath: String, user_index: usize) -> Option> { +fn build_merkle_proof( + csv_filepath: String, + user_index: usize, +) -> Option> { let file = File::open(csv_filepath).expect("Unable to open file"); let reader = BufReader::new(file); @@ -310,7 +314,7 @@ fn build_merkle_proof(csv_filepath: String, user_index: usize) -> Option { - /// Denotes the lhs value. - lhs_col: Column, - /// Denotes the rhs value. - rhs_col: Column, - /// Denotes the diff value. - diff_col: Column, - /// Denotes the selector used to enforce the LT constraint between lhs and rhs. - check_lt_selector: Selector, - /// Configuration for the RangeCheck chip. - range_check_config: RangeCheckConfig, -} - -/// Constrains that 'lhs' is less than 'rhs'. -/// -/// Assumes that `lhs` and `rhs` are known to have <= N_BYTES bytes. -/// -/// Note: This may fail silently if `lhs` or `rhs` have more than N_BYTES -/// -/// Patterned after [Axiom `check_less_than`](https://axiom-crypto.github.io/halo2-lib/src/halo2_base/gates/range.rs.html#213-219) -/// -/// It performs the following constraint: -/// * `diff = lhs - rhs + 2**(N_BYTES*8)`. When check_lt_selector is 1, this constraint is enforced. -/// * `diff ∈ N_BYTES range for diff cell - -#[derive(Clone, Copy, Debug)] -pub struct CheckLtChip { - config: CheckLtConfig, -} - -impl CheckLtChip { - /// Configures the CheckLtChip. - pub fn configure( - meta: &mut ConstraintSystem, - lhs_col: Column, - rhs_col: Column, - diff_col: Column, - range: Column, - check_lt_selector: Selector, - toggle_lookup_check: Selector, - ) -> CheckLtConfig { - meta.create_gate("lt gate", |meta| { - let lhs_expr = meta.query_advice(lhs_col, Rotation::cur()); - let rhs_expr = meta.query_advice(rhs_col, Rotation::cur()); - let diff_expr = meta.query_advice(diff_col, Rotation::cur()); - let check_lt_selector: Expression = meta.query_selector(check_lt_selector); - - let range_fp = pow_of_two(N_BYTES * 8); - - let range_expr = Expression::Constant(range_fp); - - vec![check_lt_selector * (lhs_expr - rhs_expr + range_expr - diff_expr)] - }); - - let range_check_config = - RangeCheckChip::configure(meta, diff_col, range, toggle_lookup_check); - - CheckLtConfig { - lhs_col, - rhs_col, - diff_col, - check_lt_selector, - range_check_config, - } - } - - /// Constructs a CheckLtChip given a config. - pub fn construct(config: CheckLtConfig) -> CheckLtChip { - CheckLtChip { config } - } - - /// Assign `lhs`, `rhs` and `diff` to the region. - pub fn assign( - &self, - mut layouter: impl Layouter, - lhs_cell: &AssignedCell, - rhs_cell: &AssignedCell, - ) -> Result<(), Error> { - let diff_cell = layouter.assign_region( - || "assign lhs, rhs and diff to the region", - |mut region| { - // enable check_lt_selector at offset 0 - self.config.check_lt_selector.enable(&mut region, 0)?; - - // copy `lhs_cell` to `lhs_col` column at offset 0 - lhs_cell.copy_advice(|| "copy lhs", &mut region, self.config.lhs_col, 0)?; - - // copy `rhs_cell` to `rhs_col` column at offset 0 - rhs_cell.copy_advice(|| "copy rhs", &mut region, self.config.rhs_col, 0)?; - - // Compute diff_val starting from lhs_cell and rhs_cell - let diff_val = lhs_cell.value().zip(rhs_cell.value()).map(|(lhs, rhs)| { - let mut diff = lhs - rhs; - let range = pow_of_two(N_BYTES * 8); - diff += range; - diff - }); - - let diff_cell = region.assign_advice( - || "assign diff to the region", - self.config.diff_col, - 0, - || diff_val, - )?; - - Ok(diff_cell) - }, - )?; - - // Instantiate the range check chip. - let range_check_chip = RangeCheckChip::construct(self.config.range_check_config); - - // load the lookup table for range check - range_check_chip.load(&mut layouter)?; - - // assign diff_cell to the range check chip to perform range check - range_check_chip.assign(layouter, &diff_cell)?; - - Ok(()) - } -} diff --git a/zk_prover/src/chips/less_than_check/mod.rs b/zk_prover/src/chips/less_than_check/mod.rs deleted file mode 100644 index 7434b5b3..00000000 --- a/zk_prover/src/chips/less_than_check/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod lt_check; -mod tests; diff --git a/zk_prover/src/chips/less_than_check/tests.rs b/zk_prover/src/chips/less_than_check/tests.rs deleted file mode 100644 index 56e8673d..00000000 --- a/zk_prover/src/chips/less_than_check/tests.rs +++ /dev/null @@ -1,231 +0,0 @@ -use crate::chips::less_than_check::lt_check::{CheckLtChip, CheckLtConfig}; -use halo2_proofs::{ - circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value}, - halo2curves::bn256::Fr as Fp, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error}, -}; - -#[derive(Debug, Clone)] -pub struct TestConfig { - pub check_lt_config: CheckLtConfig, - pub advice_cols: [Column; 3], -} - -impl TestConfig { - /// Generic method to assign witness value to a cell in the witness table to advice column `column_index`. `object_to_assign` is label to identify the object being assigned. It is useful for debugging. - pub fn assign_value( - &self, - mut layouter: impl Layouter, - value: Fp, - column_index: usize, - object_to_assign: &'static str, - ) -> Result, Error> { - layouter.assign_region( - || format!("assign {}", object_to_assign), - |mut region| { - region.assign_advice( - || "value", - self.advice_cols[column_index], - 0, - || Value::known(value), - ) - }, - ) - } -} - -// The test circuit takes two inputs lhs and rhs. -// Leverages CheckLtChip to enforce that lhs < rhs. -#[derive(Default, Clone, Debug)] -struct TestCircuit { - pub lhs: Fp, - pub rhs: Fp, -} - -impl Circuit for TestCircuit { - type Config = TestConfig; - type FloorPlanner = SimpleFloorPlanner; - - fn without_witnesses(&self) -> Self { - Self::default() - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - let advice_cols = [ - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - ]; - - meta.enable_equality(advice_cols[0]); - meta.enable_equality(advice_cols[1]); - meta.enable_equality(advice_cols[2]); - - let range = meta.fixed_column(); - meta.enable_constant(range); - - let check_lt_enable = meta.selector(); - let toggle_lookup_check = meta.complex_selector(); - - let check_lt_config = CheckLtChip::::configure( - meta, - advice_cols[0], - advice_cols[1], - advice_cols[2], - range, - check_lt_enable, - toggle_lookup_check, - ); - - { - TestConfig { - advice_cols, - check_lt_config, - } - } - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), Error> { - // Initiate the check lt chip - let check_lt_chip = CheckLtChip::construct(config.check_lt_config); - - // Assign lhs, rhs witnesses to advice columns - let lhs_cell = - config.assign_value(layouter.namespace(|| "assign lhs"), self.lhs, 0, "lhs")?; - - let rhs_cell = - config.assign_value(layouter.namespace(|| "assign rhs"), self.rhs, 1, "rhs")?; - - // Assign lhs and rhs - check_lt_chip.assign( - layouter.namespace(|| "assign lhs and rhs"), - &lhs_cell, - &rhs_cell, - )?; - - Ok(()) - } -} - -#[cfg(test)] -mod testing { - use super::TestCircuit; - use halo2_proofs::{ - dev::{FailureLocation, MockProver, VerifyFailure}, - halo2curves::bn256::Fr as Fp, - plonk::Any, - }; - - // lhs = 1 - // rhs = 200 - // N_BYTES = 2 - #[test] - fn valid_check_lt() { - let k = 9; - - let lhs = Fp::from(1); - let rhs = Fp::from(200); - - let circuit = TestCircuit::<2> { lhs, rhs }; - let prover = MockProver::run(k, &circuit, vec![]).unwrap(); - prover.assert_satisfied(); - } - - // lhs = 1 - // rhs = 200 - // N_BYTES = 10 - #[test] - fn valid_check_lt_2() { - let k = 9; - - let lhs = Fp::from(1); - let rhs = Fp::from(200); - - let circuit = TestCircuit::<10> { lhs, rhs }; - let prover = MockProver::run(k, &circuit, vec![]).unwrap(); - prover.assert_satisfied(); - } - - // lhs = 200 - // rhs = 1 - // lhs - rhs + range = 200 - 1 + 2^16 = 199 + 2^16 which is out of range. - #[test] - fn invalid_check_lt() { - let k = 9; - - let lhs = Fp::from(200); - let rhs = Fp::from(1); - - let circuit = TestCircuit::<2> { lhs, rhs }; - let invalid_prover = MockProver::run(k, &circuit, vec![]).unwrap(); - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (4, "assign value to perform range check").into(), - offset: 2 - } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 0).into(), - location: FailureLocation::OutsideRegion { row: 256 } - }, - ]) - ); - } - - // lhs = 200 - // rhs = 200 - // lhs - rhs + range = 200 - 200 + 2^16 = 2^16 which is out of range. - #[test] - fn invalid_check_lt_2() { - let k = 9; - - let lhs = Fp::from(200); - let rhs = Fp::from(200); - - let circuit = TestCircuit::<2> { lhs, rhs }; - let invalid_prover = MockProver::run(k, &circuit, vec![]).unwrap(); - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (4, "assign value to perform range check").into(), - offset: 2 - } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 0).into(), - location: FailureLocation::OutsideRegion { row: 256 } - }, - ]) - ); - } - - #[cfg(feature = "dev-graph")] - #[test] - fn print_check_lt() { - use plotters::prelude::*; - - let root = - BitMapBackend::new("prints/lt-check-layout.png", (1024, 3096)).into_drawing_area(); - root.fill(&WHITE).unwrap(); - let root = root.titled("Lt Check Layout", ("sans-serif", 60)).unwrap(); - - let circuit = TestCircuit::<2> { - lhs: Fp::from(1), - rhs: Fp::from(200), - }; - halo2_proofs::dev::CircuitLayout::default() - .render(9, &circuit, &root) - .unwrap(); - } -} diff --git a/zk_prover/src/chips/merkle_sum_tree.rs b/zk_prover/src/chips/merkle_sum_tree.rs index b5cd463c..cfbb0a54 100644 --- a/zk_prover/src/chips/merkle_sum_tree.rs +++ b/zk_prover/src/chips/merkle_sum_tree.rs @@ -1,4 +1,4 @@ -use halo2_proofs::circuit::{AssignedCell, Layouter, Value}; +use halo2_proofs::circuit::{AssignedCell, Layouter}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use halo2_proofs::plonk::{Advice, Column, ConstraintSystem, Error, Expression, Selector}; use halo2_proofs::poly::Rotation; @@ -20,15 +20,17 @@ pub struct MerkleSumTreeConfig { /// Chip that performs various constraints related to a Merkle Sum Tree data structure such as: /// /// * `s * swap_bit * (1 - swap_bit) = 0` (if `bool_and_swap_selector` is toggled). It basically enforces that swap_bit is either a 0 or 1. -/// * `s * (swap_bit * 2 * (elelment_r_cur - elelment_l_cur) - (elelment_l_next - elelment_l_cur) - (elelment_r_cur - elelment_r_next)) = 0`. Enforces that if the swap_bit is equal to 1, the values will be swapped on the next row (if `bool_and_swap_selector` is toggled). -/// If the swap_bit is equal to 0, the values will remain the same on the next row (if `bool_and_swap_selector` is toggled). +/// * `s * (element_r_cur - element_l_cur) * swap_bit + element_l_cur - element_l_next = 0` (if `bool_and_swap_selector` is toggled). +/// * `s * (element_l_cur - element_r_cur) * swap_bit + element_r_cur - element_r_next = 0` (if `bool_and_swap_selector` is toggled). +/// These 2 constraints enforce that if the swap_bit is equal to 1, the values will be swapped on the next row. If the swap_bit is equal to 0, the values will not be swapped on the next row. /// * `s * (left_balance + right_balance - computed_sum)`. It constraints the computed sum to be equal to the sum of the left and right balances (if `sum_selector` is toggled). + #[derive(Debug, Clone)] -pub struct MerkleSumTreeChip { +pub struct MerkleSumTreeChip { config: MerkleSumTreeConfig, } -impl MerkleSumTreeChip { +impl MerkleSumTreeChip { pub fn construct(config: MerkleSumTreeConfig) -> Self { Self { config } } @@ -59,18 +61,22 @@ impl MerkleSumTreeChip { let element_l_next = meta.query_advice(col_a, Rotation::next()); let element_r_next = meta.query_advice(col_b, Rotation::next()); - let swap_constraint = s - * ((swap_bit - * Expression::Constant(Fp::from(2)) - * (element_r_cur.clone() - element_l_cur.clone()) - - (element_l_next - element_l_cur)) - - (element_r_cur - element_r_next)); + // element_l_next = (element_r_cur - element_l_cur)*s + element_l_cur + let swap_constraint_1 = s.clone() + * ((element_r_cur.clone() - element_l_cur.clone()) * swap_bit.clone() + + element_l_cur.clone() + - element_l_next); + + // element_r_next = (element_l_cur - element_r_cur)*s + element_r_cur + let swap_constraint_2 = s + * ((element_l_cur - element_r_cur.clone()) * swap_bit + element_r_cur + - element_r_next); - vec![swap_constraint] + vec![swap_constraint_1, swap_constraint_2] }); meta.create_gate("sum constraint", |meta| { - (0..N_ASSETS) + (0..N_CURRENCIES) .map(|_| { let left_balance = meta.query_advice(col_a, Rotation::cur()); let right_balance = meta.query_advice(col_b, Rotation::cur()); @@ -88,20 +94,22 @@ impl MerkleSumTreeChip { } } - /// Assign the hashes for node in a region following this layout on 3 advice columns: + /// Swap the values of two cells in a region following this layout on 3 advice columns: /// /// | a | b | c | /// | ------------ | ------------- | ---------- | - /// | `current_hash` | `element_hash` | `swap_bit` | - /// | `current_hash` | `element_hash` | - | + /// | `current_hash` | `sibling_hash` | `1` | + /// | `sibling_hash` | `current_hash` | - | /// /// At row 0 bool_and_swap_selector is enabled - pub fn assign_nodes_hashes_per_level( + /// If swap_bit is 0, the values will remain the same on the next row + /// If swap_bit is 1, the values will be swapped on the next row + pub fn swap_hashes_per_level( &self, mut layouter: impl Layouter, current_hash: &AssignedCell, - element_hash: Fp, - swap_bit_assigned: AssignedCell, + sibling_hash: &AssignedCell, + swap_bit_assigned: &AssignedCell, ) -> Result<(AssignedCell, AssignedCell), Error> { layouter.assign_region( || "assign nodes hashes per merkle tree level", @@ -118,11 +126,11 @@ impl MerkleSumTreeChip { )?; // assign the element hash to the column self.config.advice[1] at offset 0 - let r1 = region.assign_advice( - || "element hash", + let r1 = sibling_hash.copy_advice( + || "copy element hash from assigned value", + &mut region, self.config.advice[1], 0, - || Value::known(element_hash), )?; // assign the swap_bit to the column self.config.advice[2] at offset 0 @@ -167,31 +175,26 @@ impl MerkleSumTreeChip { ) } - /// Assign the nodes balance for a single asset in a region following this layout on 3 advice columns: + /// Assign the nodes balance for a single currency in a region following this layout on 3 advice columns: /// /// | a | b | c | /// | ------------ | ------------- | ---------- | - /// | `current_balance` | `element_balance` | `swap_bit` | + /// | `current_balance` | `element_balance` | `0` | /// | `current_balance` | `element_balance` | `sum` | /// /// At row 0 bool_and_swap_selector is enabled. /// At row 1 sum_selector is enabled - pub fn assign_nodes_balance_per_asset( + /// If swap_bit is 0, the values will remain the same on the next row + /// If swap_bit is 1, the values will be swapped on the next row + pub fn swap_balances_per_level( &self, mut layouter: impl Layouter, current_balance: &AssignedCell, - element_balance: Fp, - swap_bit_assigned: AssignedCell, - ) -> Result< - ( - AssignedCell, - AssignedCell, - AssignedCell, - ), - Error, - > { + element_balance: &AssignedCell, + swap_bit_assigned: &AssignedCell, + ) -> Result, Error> { layouter.assign_region( - || "assign nodes balances per asset", + || "assign nodes balances per currency", |mut region| { // enable the bool_and_swap_selector at row 0 self.config.bool_and_swap_selector.enable(&mut region, 0)?; @@ -205,11 +208,11 @@ impl MerkleSumTreeChip { )?; // assign the element_balance to the column self.config.advice[1] at offset 0 - let r1 = region.assign_advice( + let r1 = element_balance.copy_advice( || "element balance", + &mut region, self.config.advice[1], 0, - || Value::known(element_balance), )?; // assign the swap_bit to the column self.config.advice[2] at offset 0 @@ -235,14 +238,14 @@ impl MerkleSumTreeChip { }); // Perform the assignment according to the swap at offset 1 - let left_balance_asset = region.assign_advice( + let _left_currency_balance = region.assign_advice( || "assign left balance after swap", self.config.advice[0], 1, || l1_val, )?; - let right_balance_asset = region.assign_advice( + let _right_currency_balance = region.assign_advice( || "assign right balance after swap", self.config.advice[1], 1, @@ -257,7 +260,7 @@ impl MerkleSumTreeChip { let sum_cell = region.assign_advice(|| "sum of balances", self.config.advice[2], 1, || sum)?; - Ok((left_balance_asset, right_balance_asset, sum_cell)) + Ok(sum_cell) }, ) } diff --git a/zk_prover/src/chips/mod.rs b/zk_prover/src/chips/mod.rs index 58bf8673..97a1ea8f 100644 --- a/zk_prover/src/chips/mod.rs +++ b/zk_prover/src/chips/mod.rs @@ -1,4 +1,3 @@ -pub mod less_than_check; pub mod merkle_sum_tree; pub mod poseidon; pub mod range; diff --git a/zk_prover/src/chips/poseidon/poseidon_params.rs b/zk_prover/src/chips/poseidon/poseidon_params.rs index 61331ef9..045f1692 100644 --- a/zk_prover/src/chips/poseidon/poseidon_params.rs +++ b/zk_prover/src/chips/poseidon/poseidon_params.rs @@ -1,13 +1,10 @@ -//! Parameters for Poseidon Hasher based on a specific Rate and Curve. -//! -//! This file was generated by running `generate_params.py`. -//! - Number of round constants: 128 -//! - Round constants for GF(p): -//! +//! This file was generated by running generate_params.py +//! Number of round constants: 128 +//! Round constants for GF(p): //! Parameters for using rate 1 Poseidon with the BN256 field. -//! Patterned after [halo2_gadgets::poseidon::primitives] +//! Patterned after [halo2_gadgets::poseidon::primitives::fp] //! The parameters can be reproduced by running the following Sage script from -//! [this repository](https://github.com/daira/pasta-hadeshash) +//! [this repository](https://github.com/daira/pasta-hadeshash): //! //! ```text //! $ sage generate_parameters_grain.sage 1 0 254 2 8 56 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 --rust @@ -16,7 +13,7 @@ //! where 1 means 'prime field', 0 means 'non-negative sbox', 254 is the bitsize //! of the field, 2 is the Poseidon width (rate + 1), 8 is the number of full //! rounds, 56 is the number of partial rounds. -//! More info here => +//! More info here => https://hackmd.io/@letargicus/SJOvx48Nn use halo2_proofs::halo2curves::bn256::Fr as Fp; pub(crate) const ROUND_CONSTANTS: [[Fp; 2]; 64] = [ [ diff --git a/zk_prover/src/chips/range/range_check.rs b/zk_prover/src/chips/range/range_check.rs index 2d8bb7b7..d1421770 100644 --- a/zk_prover/src/chips/range/range_check.rs +++ b/zk_prover/src/chips/range/range_check.rs @@ -17,18 +17,16 @@ use super::utils::decompose_fp_to_bytes; /// # Fields /// /// * `z`: Advice column for the value to be checked and its running sum. -/// * `range`: Fixed column for the lookup table. It contains the values from 0 to 2^8 - 1. /// * `lookup_enable_selector`: Selector to enable the lookup check. /// /// Patterned after [halo2_gadgets](https://github.com/privacy-scaling-explorations/halo2/blob/main/halo2_gadgets/src/utilities/decompose_running_sum.rs) #[derive(Debug, Copy, Clone)] pub struct RangeCheckConfig { z: Column, - range: Column, lookup_enable_selector: Selector, } -/// Helper chip that verfiies that the value witnessed in a given cell lies within a given range defined by N_BYTES. +/// Helper chip that verifies that the value witnessed in a given cell lies within a given range defined by N_BYTES. /// For example, Let's say we want to constraint 0x1f2f3f4f to be within the range N_BYTES=4. /// /// `z(0) = 0x1f2f3f4f` @@ -47,8 +45,8 @@ pub struct RangeCheckConfig { /// /// The column z contains the witnessed value to be checked at offset 0 /// At offset i, the column z contains the value z(i+1) = (z(i) - k(i)) / 2^8 (shift right by 8 bits) where k(i) is the i-th decomposition big-endian of `value` -/// The contraints that are enforced are: -/// - z(i) - 2^8â‹…z(i+1) ∈ lookup_u8 (enabled by lookup_enable_selector at offset [0, N_BYTES - 1]) +/// The constraints that are enforced are: +/// - z(i) - 2^8â‹…z(i+1) ∈ lookup_u8_table (enabled by lookup_enable_selector at offset [0, N_BYTES - 1]) /// - z(N_BYTES) == 0 #[derive(Debug, Clone)] pub struct RangeCheckChip { @@ -61,13 +59,14 @@ impl RangeCheckChip { } /// Configures the Range Chip + /// Note: the lookup table should be loaded with values from `0` to `2^8 - 1` otherwise the range check will fail. pub fn configure( meta: &mut ConstraintSystem, z: Column, - range: Column, + lookup_u8_table: Column, lookup_enable_selector: Selector, ) -> RangeCheckConfig { - meta.annotate_lookup_any_column(range, || "LOOKUP_MAXBITS_RANGE"); + meta.annotate_lookup_any_column(lookup_u8_table, || "LOOKUP_MAXBITS_RANGE"); meta.lookup_any( "range u8 check for difference between each interstitial running sum output", @@ -76,7 +75,7 @@ impl RangeCheckChip { let z_next = meta.query_advice(z, Rotation::next()); let lookup_enable_selector = meta.query_selector(lookup_enable_selector); - let u8_range = meta.query_fixed(range, Rotation::cur()); + let u8_range = meta.query_fixed(lookup_u8_table, Rotation::cur()); let diff = z_cur - z_next * Expression::Constant(Fp::from(1 << 8)); @@ -86,7 +85,6 @@ impl RangeCheckChip { RangeCheckConfig { z, - range, lookup_enable_selector, } } @@ -153,24 +151,4 @@ impl RangeCheckChip { }, ) } - - /// Loads the lookup table with values from `0` to `2^8 - 1` - pub fn load(&self, layouter: &mut impl Layouter) -> Result<(), Error> { - let range = 1 << (8); - - layouter.assign_region( - || format!("load range check table of {} bits", 8), - |mut region| { - for i in 0..range { - region.assign_fixed( - || "assign cell in fixed column", - self.config.range, - i, - || Value::known(Fp::from(i as u64)), - )?; - } - Ok(()) - }, - ) - } } diff --git a/zk_prover/src/chips/range/tests.rs b/zk_prover/src/chips/range/tests.rs index 54f6fccc..07cc5768 100644 --- a/zk_prover/src/chips/range/tests.rs +++ b/zk_prover/src/chips/range/tests.rs @@ -1,8 +1,11 @@ -use crate::chips::range::range_check::{RangeCheckChip, RangeCheckConfig}; +use crate::{ + chips::range::range_check::{RangeCheckChip, RangeCheckConfig}, + circuits::traits::CircuitBase, +}; use halo2_proofs::{ circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value}, halo2curves::bn256::Fr as Fp, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Selector}, + plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Selector}, poly::Rotation, }; @@ -88,6 +91,7 @@ impl AddChip { pub struct TestConfig { pub addchip_config: AddConfig, pub range_check_config: RangeCheckConfig, + pub lookup_u8_table: Column, } // The test circuit takes two inputs a and b. @@ -99,6 +103,9 @@ struct TestCircuit { pub b: Fp, } +/// Inherit the `CircuitBase` trait for the `TestCircuit` struct. +impl CircuitBase for TestCircuit {} + impl Circuit for TestCircuit { type Config = TestConfig; type FloorPlanner = SimpleFloorPlanner; @@ -109,7 +116,7 @@ impl Circuit for TestCircuit { fn configure(meta: &mut ConstraintSystem) -> Self::Config { let z = meta.advice_column(); - let range = meta.fixed_column(); + let lookup_u8_table = meta.fixed_column(); let a = meta.advice_column(); let b = meta.advice_column(); @@ -127,7 +134,7 @@ impl Circuit for TestCircuit { let lookup_enable_selector = meta.complex_selector(); let range_check_config = - RangeCheckChip::::configure(meta, z, range, lookup_enable_selector); + RangeCheckChip::::configure(meta, z, lookup_u8_table, lookup_enable_selector); let addchip_config = AddChip::configure(meta, a, b, c, add_selector); @@ -135,6 +142,7 @@ impl Circuit for TestCircuit { TestConfig { addchip_config, range_check_config, + lookup_u8_table, } } } @@ -149,12 +157,12 @@ impl Circuit for TestCircuit { let (a_cell, b_cell, c_cell) = addchip.assign(self.a, self.b, layouter.namespace(|| "add chip"))?; + // Load the lookup table + self.load(&mut layouter, config.lookup_u8_table)?; + // Initiate the range check chip let range_chip = RangeCheckChip::construct(config.range_check_config); - // Load the lookup table - range_chip.load(&mut layouter)?; - // check range on a, b and c range_chip.assign( layouter.namespace(|| "checking value a is in range"), diff --git a/zk_prover/src/circom/incremental_mst_inclusion.circom b/zk_prover/src/circom/incremental_mst_inclusion.circom index 98ca38d3..3dd14bdd 100644 --- a/zk_prover/src/circom/incremental_mst_inclusion.circom +++ b/zk_prover/src/circom/incremental_mst_inclusion.circom @@ -8,9 +8,9 @@ Inputs: --------- - step_in[2] : `user_state_prev` and `liabilities_state_prev` from the previous step of the IVC - username: username of the user whose inclusion in the merkle sum tree we want to prove -- user_balances[N_ASSETS]: balances of the user whose inclusion in the merkle sum tree we want to prove +- user_balances[N_CURRENCIES]: balances of the user whose inclusion in the merkle sum tree we want to prove - path_element_hashes[LEVELS]: hashes of elements of the merkle path -- path_element_balances[LEVELS][N_ASSETS]: balances of the elements of the merkle path +- path_element_balances[LEVELS][N_CURRENCIES]: balances of the elements of the merkle path - path_indices[LEVELS]: binary selector that indicates whether given path_element is on the left or right side of merkle path Outputs: @@ -22,7 +22,7 @@ Outputs: Parameters: ------------ - LEVELS: number of levels in the merkle sum tree -- N_ASSETS: number of assets for each user +- N_CURRENCIES: number of currencies for each user - N_BYTES: range of the balances of the users Functionality: @@ -32,21 +32,21 @@ Functionality: 3. Starting from the `leaf_hash` and the Merkle Proof, compute the `root_hash` of the resulting Merkle Sum Tree 4. Starting from `liabilities_state_prev` and `root_hash`, compute `liabilities_state_cur` as H(`liabilities_state_prev`, `root_hash`) */ -template IncrementalMstInclusion (LEVELS, N_ASSETS, N_BYTES) { +template IncrementalMstInclusion (LEVELS, N_CURRENCIES, N_BYTES) { signal input step_in[2]; signal input username; - signal input user_balances[N_ASSETS]; + signal input user_balances[N_CURRENCIES]; signal input path_element_hashes[LEVELS]; - signal input path_element_balances[LEVELS][N_ASSETS]; + signal input path_element_balances[LEVELS][N_CURRENCIES]; signal input path_indices[LEVELS]; signal output step_out[2]; // 1. - component build_leaf_hash = Poseidon(1 + N_ASSETS); + component build_leaf_hash = Poseidon(1 + N_CURRENCIES); build_leaf_hash.inputs[0] <== username; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { build_leaf_hash.inputs[i + 1] <== user_balances[i]; } @@ -56,7 +56,7 @@ template IncrementalMstInclusion (LEVELS, N_ASSETS, N_BYTES) { build_user_state_cur.inputs[1] <== build_leaf_hash.out; // 3. - component check_inclusion = MerkleSumTreeInclusion(LEVELS, N_ASSETS, N_BYTES); + component check_inclusion = MerkleSumTreeInclusion(LEVELS, N_CURRENCIES, N_BYTES); check_inclusion.leaf_hash <== build_leaf_hash.out; check_inclusion.leaf_balances <== user_balances; diff --git a/zk_prover/src/circom/merkle_sum_tree.circom b/zk_prover/src/circom/merkle_sum_tree.circom index 5056ea8e..94cb83c0 100644 --- a/zk_prover/src/circom/merkle_sum_tree.circom +++ b/zk_prover/src/circom/merkle_sum_tree.circom @@ -7,12 +7,12 @@ include "./node_modules/circomlib/circuits/mux1.circom"; /* Inputs: --------- -- left_balances[N_ASSETS] : Balances of the left node -- right_balances[N_ASSETS] : Balances of the right node +- left_balances[N_CURRENCIES] : Balances of the left node +- right_balances[N_CURRENCIES] : Balances of the right node Outputs: --------- -- out_balances[N_ASSETS] : Each element of `out_balances` is the sum of the corresponding elements in left_balances and right_balances. +- out_balances[N_CURRENCIES] : Each element of `out_balances` is the sum of the corresponding elements in left_balances and right_balances. Ex. out_balances[0] = left_balances[0] + right_balances[0] Functionality: @@ -27,15 +27,15 @@ When the output will be used as an input to another summation. When the next lev */ -template Summer(N_ASSETS, N_BYTES) { - signal input left_balances[N_ASSETS]; - signal input right_balances[N_ASSETS]; - signal output out_balances[N_ASSETS]; +template Summer(N_CURRENCIES, N_BYTES) { + signal input left_balances[N_CURRENCIES]; + signal input right_balances[N_CURRENCIES]; + signal output out_balances[N_CURRENCIES]; - component left_in_range[N_ASSETS]; - component right_in_range[N_ASSETS]; + component left_in_range[N_CURRENCIES]; + component right_in_range[N_CURRENCIES]; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { left_in_range[i] = Num2Bits(8*N_BYTES); right_in_range[i] = Num2Bits(8*N_BYTES); @@ -50,21 +50,21 @@ template Summer(N_ASSETS, N_BYTES) { Inputs: --------- - left_hash: Hash of the left node -- left_balances[N_ASSETS] : Balances of the left node +- left_balances[N_CURRENCIES] : Balances of the left node - right_hash: Hash of the right node -- right_balances[N_ASSETS] : Balances of the right node +- right_balances[N_CURRENCIES] : Balances of the right node - s: binary selector Outputs: --------- - swapped_left_hash: left_hash if s = 0, right_hash if s = 1 -- swapped_left_balances[N_ASSETS]: left_balances if s = 0, right_balances if s = 1 +- swapped_left_balances[N_CURRENCIES]: left_balances if s = 0, right_balances if s = 1 - swapped_right_hash: right_hash if s = 0, left_hash if s = 1 -- swapped_right_balances[N_ASSETS]: right_balances if s = 0, left_balances if s = 1 +- swapped_right_balances[N_CURRENCIES]: right_balances if s = 0, left_balances if s = 1 Parameters: ------------ -- N_ASSETS: number of assets for each user +- N_CURRENCIES: number of currencies for each user Functionality: -------------- @@ -72,57 +72,57 @@ Functionality: 2. Constraint that s is either 0 or 1 */ -template Swapper(N_ASSETS) { +template Swapper(N_CURRENCIES) { signal input left_hash; - signal input left_balances[N_ASSETS]; + signal input left_balances[N_CURRENCIES]; signal input right_hash; - signal input right_balances[N_ASSETS]; + signal input right_balances[N_CURRENCIES]; signal input s; signal output swapped_left_hash; - signal output swapped_left_balances[N_ASSETS]; + signal output swapped_left_balances[N_CURRENCIES]; signal output swapped_right_hash; - signal output swapped_right_balances[N_ASSETS]; + signal output swapped_right_balances[N_CURRENCIES]; s * (1 - s) === 0; - component mux = MultiMux1(2 + 2*N_ASSETS); + component mux = MultiMux1(2 + 2*N_CURRENCIES); mux.c[0][0] <== left_hash; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { mux.c[1 + i][0] <== left_balances[i]; } - mux.c[1 + N_ASSETS][0] <== right_hash; + mux.c[1 + N_CURRENCIES][0] <== right_hash; - for (var i = 0; i < N_ASSETS; i++) { - mux.c[2 + N_ASSETS + i][0] <== right_balances[i]; + for (var i = 0; i < N_CURRENCIES; i++) { + mux.c[2 + N_CURRENCIES + i][0] <== right_balances[i]; } mux.c[0][1] <== right_hash; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { mux.c[1 + i][1] <== right_balances[i]; } - mux.c[1 + N_ASSETS][1] <== left_hash; + mux.c[1 + N_CURRENCIES][1] <== left_hash; - for (var i = 0; i < N_ASSETS; i++) { - mux.c[2 + N_ASSETS + i][1] <== left_balances[i]; + for (var i = 0; i < N_CURRENCIES; i++) { + mux.c[2 + N_CURRENCIES + i][1] <== left_balances[i]; } mux.s <== s; swapped_left_hash <== mux.out[0]; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { swapped_left_balances[i] <== mux.out[1 + i]; } - swapped_right_hash <== mux.out[1 + N_ASSETS]; + swapped_right_hash <== mux.out[1 + N_CURRENCIES]; - for (var i = 0; i < N_ASSETS; i++) { - swapped_right_balances[i] <== mux.out[2 + N_ASSETS + i]; + for (var i = 0; i < N_CURRENCIES; i++) { + swapped_right_balances[i] <== mux.out[2 + N_CURRENCIES + i]; } } @@ -130,43 +130,43 @@ template Swapper(N_ASSETS) { Inputs: --------- - left_hash: Hash of the left node -- left_balances[N_ASSETS] : Balances of the left node +- left_balances[N_CURRENCIES] : Balances of the left node - right_hash: Hash of the right node -- right_balances[N_ASSETS] : Balances of the right node +- right_balances[N_CURRENCIES] : Balances of the right node Outputs: --------- -- hash: poseidon hash of (left_hash, left_balances[0], ..., left_balances[N_ASSETS - 1], right_hash, right_balances[0], ..., right_balances[N_ASSETS - 1]) +- hash: poseidon hash of (left_hash, left_balances[0], ..., left_balances[N_CURRENCIES - 1], right_hash, right_balances[0], ..., right_balances[N_CURRENCIES - 1]) Parameters: ------------ -- N_ASSETS: number of assets for each user +- N_CURRENCIES: number of currencies for each user Functionality: -------------- 1. Perform the hashing of two nodes belonging to a level of the merkle sum tree */ -template Hasher(N_ASSETS) { +template Hasher(N_CURRENCIES) { signal input left_hash; - signal input left_balances[N_ASSETS]; + signal input left_balances[N_CURRENCIES]; signal input right_hash; - signal input right_balances[N_ASSETS]; + signal input right_balances[N_CURRENCIES]; signal output hash; // 1. - component hasher = Poseidon(2 + 2*N_ASSETS); + component hasher = Poseidon(2 + 2*N_CURRENCIES); hasher.inputs[0] <== left_hash; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { hasher.inputs[1 + i] <== left_balances[i]; } - hasher.inputs[1 + N_ASSETS] <== right_hash; + hasher.inputs[1 + N_CURRENCIES] <== right_hash; - for (var i = 0; i < N_ASSETS; i++) { - hasher.inputs[2 + N_ASSETS + i] <== right_balances[i]; + for (var i = 0; i < N_CURRENCIES; i++) { + hasher.inputs[2 + N_CURRENCIES + i] <== right_balances[i]; } hash <== hasher.out; @@ -177,9 +177,9 @@ template Hasher(N_ASSETS) { Inputs: --------- - leaf_hash: hash of the leaf node that we want to prove inclusion for -- leaf_balances[N_ASSETS]: balances of the leaf node that we want to prove inclusion for +- leaf_balances[N_CURRENCIES]: balances of the leaf node that we want to prove inclusion for - path_element_hashes[LEVELS]: hashes of elements of the merkle path -- path_element_balances[LEVELS][N_ASSETS]: balances of the elements of the merkle path +- path_element_balances[LEVELS][N_CURRENCIES]: balances of the elements of the merkle path - path_indices[LEVELS]: binary selector that indicates whether given path_element is on the left or right side of merkle path Outputs: @@ -189,7 +189,7 @@ Outputs: Parameters: ------------ - LEVELS: number of levels in the merkle sum tree -- N_ASSETS: number of assets for each user +- N_CURRENCIES: number of currencies for each user - N_BYTES: range of the balances of the users Functionality: @@ -203,11 +203,11 @@ Notes: ------ - The summer is performed before the swapper because the swap doesn't influence the summation. */ -template MerkleSumTreeInclusion(LEVELS, N_ASSETS, N_BYTES) { +template MerkleSumTreeInclusion(LEVELS, N_CURRENCIES, N_BYTES) { signal input leaf_hash; - signal input leaf_balances[N_ASSETS]; + signal input leaf_balances[N_CURRENCIES]; signal input path_element_hashes[LEVELS]; - signal input path_element_balances[LEVELS][N_ASSETS]; + signal input path_element_balances[LEVELS][N_CURRENCIES]; signal input path_indices[LEVELS]; signal output root_hash; @@ -218,13 +218,13 @@ template MerkleSumTreeInclusion(LEVELS, N_ASSETS, N_BYTES) { for (var i = 0; i < LEVELS; i++) { // 1. - summers[i] = Summer(N_ASSETS, N_BYTES); + summers[i] = Summer(N_CURRENCIES, N_BYTES); summers[i].left_balances <== i == 0 ? leaf_balances : summers[i - 1].out_balances; summers[i].right_balances <== path_element_balances[i]; // 2. - swappers[i] = Swapper(N_ASSETS); + swappers[i] = Swapper(N_CURRENCIES); swappers[i].left_hash <== i == 0 ? leaf_hash : hashers[i - 1].hash; swappers[i].left_balances <== i == 0 ? leaf_balances : summers[i - 1].out_balances; @@ -233,7 +233,7 @@ template MerkleSumTreeInclusion(LEVELS, N_ASSETS, N_BYTES) { swappers[i].s <== path_indices[i]; // 3. - hashers[i] = Hasher(N_ASSETS); + hashers[i] = Hasher(N_CURRENCIES); hashers[i].left_hash <== swappers[i].swapped_left_hash; hashers[i].left_balances <== swappers[i].swapped_left_balances; @@ -243,9 +243,9 @@ template MerkleSumTreeInclusion(LEVELS, N_ASSETS, N_BYTES) { } // 4. - component root_balance_in_range[N_ASSETS]; + component root_balance_in_range[N_CURRENCIES]; - for (var i = 0; i < N_ASSETS; i++) { + for (var i = 0; i < N_CURRENCIES; i++) { root_balance_in_range[i] = Num2Bits(8*N_BYTES); root_balance_in_range[i].in <== summers[LEVELS - 1].out_balances[i]; } diff --git a/zk_prover/src/circuits/merkle_sum_tree.rs b/zk_prover/src/circuits/merkle_sum_tree.rs index 3ed075c0..19c4baf9 100644 --- a/zk_prover/src/circuits/merkle_sum_tree.rs +++ b/zk_prover/src/circuits/merkle_sum_tree.rs @@ -3,7 +3,8 @@ use crate::chips::poseidon::hash::{PoseidonChip, PoseidonConfig}; use crate::chips::poseidon::poseidon_spec::PoseidonSpec; use crate::chips::range::range_check::{RangeCheckChip, RangeCheckConfig}; use crate::circuits::traits::CircuitBase; -use crate::merkle_sum_tree::{big_uint_to_fp, Entry, MerkleSumTree}; +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; use halo2_proofs::circuit::{AssignedCell, Layouter, SimpleFloorPlanner}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use halo2_proofs::plonk::{ @@ -11,80 +12,93 @@ use halo2_proofs::plonk::{ }; use snark_verifier_sdk::CircuitExt; -/// Circuit for verifying inclusion of a leaf_hash inside a merkle sum tree with a given root. +/// Circuit for verifying inclusion of an entry (username, balances) inside a merkle sum tree with a given root. /// /// # Type Parameters /// -/// * `LEVELS`: The number of levels of the merkle sum tree -/// * `N_ASSETS`: The number of assets for which the solvency is verified. +/// * `LEVELS`: The number of levels of the merkle sum tree. In particular, it indicates the number of hashing operations that are performed from the leaf to the root. For example a tree with 16 entries has 4 levels. +/// * `N_CURRENCIES`: The number of currencies for which the solvency is verified. /// * `N_BYTES`: The number of bytes in which the balances should lie /// /// # Fields /// /// * `entry`: The entry to be verified inclusion of. -/// * `path_element_hashes`: The hashes of the path elements from the leaf to root. The length of this vector is LEVELS -/// * `path_element_balances`: The balances of the path elements from the leaf to the root. The length of this vector is LEVELS /// * `path_indices`: The boolean indices of the path elements from the leaf to the root. 0 indicates that the element is on the right to the path, 1 indicates that the element is on the left to the path. The length of this vector is LEVELS +/// * `sibling_leaf_node_hash_preimage`: The preimage of the hash that corresponds to the Sibling Leaf Node (part of the Merkle Proof). +/// * `sibling_middle_node_hash_preimages`: The preimages of the hashes that corresponds to the Sibling Middle Nodes (part of the Merkle Proof). +/// * `root`: The root of the Merkle Sum Tree #[derive(Clone)] -pub struct MstInclusionCircuit { - pub entry: Entry, - pub path_element_hashes: Vec, - pub path_element_balances: Vec<[Fp; N_ASSETS]>, +pub struct MstInclusionCircuit +where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, +{ + pub entry: Entry, pub path_indices: Vec, - pub root_hash: Fp, + pub sibling_leaf_node_hash_preimage: [Fp; N_CURRENCIES + 1], + pub sibling_middle_node_hash_preimages: Vec<[Fp; N_CURRENCIES + 2]>, + pub root: Node, } -impl CircuitExt - for MstInclusionCircuit +impl CircuitExt + for MstInclusionCircuit where - [usize; 2 * (1 + N_ASSETS)]: Sized, - [usize; N_ASSETS + 1]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - /// Returns the number of public inputs of the circuit. It is 2, namely the laef hash to be verified inclusion of and the root hash of the merkle sum tree. + /// Returns the number of public inputs of the circuit. It is {2 + N_CURRENCIES}, namely the leaf hash to be verified inclusion of, the root hash of the merkle sum tree and the root balances of the merkle sum tree. fn num_instance(&self) -> Vec { - vec![2] + vec![{ 2 + N_CURRENCIES }] } /// Returns the values of the public inputs of the circuit. Namely the leaf hash to be verified inclusion of and the root hash of the merkle sum tree. fn instances(&self) -> Vec> { - vec![vec![self.entry.compute_leaf().hash, self.root_hash]] + let mut instance = vec![self.entry.compute_leaf().hash, self.root.hash]; + instance.extend_from_slice(&self.root.balances); + vec![instance] } } -impl CircuitBase - for MstInclusionCircuit +impl CircuitBase + for MstInclusionCircuit +where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { } -impl - MstInclusionCircuit +impl + MstInclusionCircuit +where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { pub fn init_empty() -> Self { Self { - entry: Entry::init_empty(), - path_element_hashes: vec![Fp::zero(); LEVELS], - path_element_balances: vec![[Fp::zero(); N_ASSETS]; LEVELS], + entry: Entry::zero_entry(), path_indices: vec![Fp::zero(); LEVELS], - root_hash: Fp::zero(), + sibling_leaf_node_hash_preimage: [Fp::zero(); N_CURRENCIES + 1], + sibling_middle_node_hash_preimages: vec![[Fp::zero(); N_CURRENCIES + 2]; LEVELS], + root: Node::init_empty(), } } - /// Initializes the circuit with the merkle sum tree and the index of the user of which the inclusion is to be verified. - pub fn init(merkle_sum_tree: MerkleSumTree, user_index: usize) -> Self + /// Initializes the circuit with the merkle proof and the entry of the user of which the inclusion is to be verified. + pub fn init(merkle_proof: MerkleProof) -> Self where - [usize; N_ASSETS + 1]:, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - let proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - - assert_eq!(proof.path_indices.len(), LEVELS); - assert_eq!(proof.sibling_hashes.len(), LEVELS); - assert_eq!(proof.sibling_sums.len(), LEVELS); - + assert_eq!(merkle_proof.path_indices.len(), LEVELS); + assert_eq!( + merkle_proof.sibling_middle_node_hash_preimages.len(), + LEVELS - 1 + ); Self { - entry: proof.entry, - path_element_hashes: proof.sibling_hashes, - path_element_balances: proof.sibling_sums, - path_indices: proof.path_indices, - root_hash: proof.root_hash, + entry: merkle_proof.entry, + path_indices: merkle_proof.path_indices, + sibling_leaf_node_hash_preimage: merkle_proof.sibling_leaf_node_hash_preimage, + sibling_middle_node_hash_preimages: merkle_proof.sibling_middle_node_hash_preimages, + root: merkle_proof.root, } } } @@ -92,33 +106,37 @@ impl /// Configuration for the Mst Inclusion circuit /// # Type Parameters /// -/// * `N_ASSETS`: The number of assets for which the solvency is verified. +/// * `N_CURRENCIES`: The number of currencies for which the solvency is verified. /// * `N_BYTES`: The number of bytes in which the balances should lie /// /// # Fields /// /// * `merkle_sum_tree_config`: Configuration for the merkle sum tree -/// * `poseidon_entry_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of 1 + N_ASSETS. Needed to perform the hashing from the entry to the leaf. -/// * `poseidon_middle_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of 2 * (1 + N_ASSETS). Needed to perform hashings from the leaf to the root. +/// * `poseidon_entry_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of N_CURRENCIES + 1. Needed to perform the hashing from the entry to the leaf. +/// * `poseidon_middle_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of N_CURRENCIES + 2. Needed to perform hashings from the leaf to the root. /// * `range_check_config`: Configuration for the range check chip /// * `instance`: Instance column used to store the public inputs +/// * `advices`: Advice columns used to store the private inputs #[derive(Debug, Clone)] -pub struct MstInclusionConfig +pub struct MstInclusionConfig where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { merkle_sum_tree_config: MerkleSumTreeConfig, - poseidon_entry_config: PoseidonConfig<2, 1, { 1 + N_ASSETS }>, - poseidon_middle_config: PoseidonConfig<2, 1, { 2 * (1 + N_ASSETS) }>, + poseidon_entry_config: PoseidonConfig<2, 1, { N_CURRENCIES + 1 }>, + poseidon_middle_config: PoseidonConfig<2, 1, { N_CURRENCIES + 2 }>, range_check_config: RangeCheckConfig, instance: Column, advices: [Column; 3], + fixed_columns: [Column; 5], } -impl MstInclusionConfig +impl MstInclusionConfig where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { pub fn configure(meta: &mut ConstraintSystem) -> Self { // the max number of advices columns needed is WIDTH + 1 given requirement of the poseidon config @@ -136,17 +154,18 @@ where // enable constant for the fixed_column[2], this is required for the poseidon chip and the range check chip meta.enable_constant(fixed_columns[2]); - let poseidon_entry_config = PoseidonChip::::configure( - meta, - advices[0..2].try_into().unwrap(), - advices[2], - fixed_columns[0..2].try_into().unwrap(), - fixed_columns[2..4].try_into().unwrap(), - ); + let poseidon_entry_config = + PoseidonChip::::configure( + meta, + advices[0..2].try_into().unwrap(), + advices[2], + fixed_columns[0..2].try_into().unwrap(), + fixed_columns[2..4].try_into().unwrap(), + ); // in fact, the poseidon config requires #WIDTH advice columns for state and 1 for partial_sbox, #WIDTH fixed columns for rc_a and #WIDTH for rc_b let poseidon_middle_config = - PoseidonChip::::configure( + PoseidonChip::::configure( meta, advices[0..2].try_into().unwrap(), advices[2], @@ -159,8 +178,8 @@ where meta.enable_equality(*col); } - // the configuration of merkle_sum_tree will always require 3 advices, no matter the number of assets - let merkle_sum_tree_config = MerkleSumTreeChip::::configure( + // the configuration of merkle_sum_tree will always require 3 advices, no matter the number of currencies + let merkle_sum_tree_config = MerkleSumTreeChip::::configure( meta, advices[0..3].try_into().unwrap(), selectors[0..2].try_into().unwrap(), @@ -183,16 +202,18 @@ where range_check_config, instance, advices, + fixed_columns, } } } -impl Circuit - for MstInclusionCircuit +impl Circuit + for MstInclusionCircuit where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - type Config = MstInclusionConfig; + type Config = MstInclusionConfig; type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -201,7 +222,7 @@ where /// Configures the circuit fn configure(meta: &mut ConstraintSystem) -> Self::Config { - MstInclusionConfig::::configure(meta) + MstInclusionConfig::::configure(meta) } fn synthesize( @@ -211,21 +232,21 @@ where ) -> Result<(), Error> { // build auxiliary chips let merkle_sum_tree_chip = - MerkleSumTreeChip::::construct(config.merkle_sum_tree_config.clone()); + MerkleSumTreeChip::::construct(config.merkle_sum_tree_config); - let poseidon_entry_chip = PoseidonChip::::construct( - config.poseidon_entry_config.clone(), - ); + let poseidon_entry_chip = + PoseidonChip::::construct( + config.poseidon_entry_config, + ); let poseidon_middle_chip = - PoseidonChip::::construct( - config.poseidon_middle_config.clone(), + PoseidonChip::::construct( + config.poseidon_middle_config, ); - let range_check_chip = - RangeCheckChip::::construct(config.range_check_config.clone()); + let range_check_chip = RangeCheckChip::::construct(config.range_check_config); - // Assign the entry username + // Assign the entry username to the witness let username = self.assign_value_to_witness( layouter.namespace(|| "assign entry username"), big_uint_to_fp(self.entry.username_as_big_uint()), @@ -233,10 +254,10 @@ where config.advices[0], )?; - // Assign the entry balances + // Assign the entry balances to the witness let mut current_balances = vec![]; - for i in 0..N_ASSETS { + for i in 0..N_CURRENCIES { let balance = self.assign_value_to_witness( layouter.namespace(|| format!("assign entry balance {}", i)), big_uint_to_fp(&self.entry.balances()[i]), @@ -247,14 +268,14 @@ where } // Perform the hashing to username and balances to obtain the leaf hash - // create an hash_input array of length 1 + N_ASSETS that contains the entry username and the entry balances + // create an hash_input array of length N_CURRENCIES + 1 that contains the entry username and the entry balances let entry_hasher_input_vec: Vec> = [username] .iter() .chain(current_balances.iter()) .map(|x| x.to_owned()) .collect(); - let entry_hasher_input: [AssignedCell; 1 + N_ASSETS] = + let entry_hasher_input: [AssignedCell; N_CURRENCIES + 1] = match entry_hasher_input_vec.try_into() { Ok(arr) => arr, Err(_) => panic!("Failed to convert Vec to Array"), @@ -274,13 +295,150 @@ where config.instance, )?; - // load range check chip - range_check_chip.load(&mut layouter)?; + // load lookup table for range check + self.load(&mut layouter, config.fixed_columns[4])?; for level in 0..LEVELS { let namespace_prefix = format!("level {}", level); - // For each level assign the index to the circuit + let sibling_hash: AssignedCell; // hash of the sibling node + let mut sibling_balances: Vec> = vec![]; // balances of the sibling node + + // Perform the hashing of sibling leaf hash preimage to obtain the sibling leaf hash + if level == 0 { + // Assign username from sibling leaf node hash preimage to the circuit + let sibling_leaf_node_username = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling leaf node username")), + self.sibling_leaf_node_hash_preimage[0], + "sibling leaf node username", + config.advices[0], + )?; + + // Assign balances from sibling leaf node hash preimage to the circuit + for currency in 0..N_CURRENCIES { + let leaf_node_sibling_balance = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling leaf node balance {}", currency)), + self.sibling_leaf_node_hash_preimage[currency + 1], + "sibling leaf balance", + config.advices[1], + )?; + sibling_balances.push(leaf_node_sibling_balance); + } + + // create an hash_input array of length N_CURRENCIES + 1 that contains the sibling_leaf_node_username and the sibling_balances (the sibling leaf node hash preimage) + let sibling_hasher_input_vec: Vec> = + [sibling_leaf_node_username] + .iter() + .chain(sibling_balances.iter()) + .map(|x| x.to_owned()) + .collect(); + + let sibling_hasher_input: [AssignedCell; N_CURRENCIES + 1] = + match sibling_hasher_input_vec.try_into() { + Ok(arr) => arr, + Err(_) => panic!("Failed to convert Vec to Array"), + }; + + // compute the sibling hash + let computed_sibling_hash = poseidon_entry_chip.hash( + layouter.namespace(|| format!("{}: perform poseidon hash", namespace_prefix)), + sibling_hasher_input, + )?; + + // For level 0, perform range check on the leaf node balances and on the sibling node balances + for currency in 0..N_CURRENCIES { + // Each balance cell is constrained to be within the range defined by N_BYTES + range_check_chip.assign( + layouter.namespace(|| { + format!( + "{}: currency {}: range check leaf balance", + namespace_prefix, currency + ) + }), + ¤t_balances[currency], + )?; + range_check_chip.assign( + layouter.namespace(|| { + format!( + "{}: currency {}: range check sibling balance", + namespace_prefix, currency + ) + }), + &sibling_balances[currency], + )?; + } + + sibling_hash = computed_sibling_hash; + } + // Other levels + // Assign sibling node hash preimage to the circuit (split it in balances, left child hash and right child hash) + // Perform the hashing of sibling node hash preimage to obtain the sibling node hash + else { + // Assign balances from sibling middle node hash preimage to the circuit + for currency in 0..N_CURRENCIES { + let middle_node_sibling_balance = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling node balance {}", currency)), + self.sibling_middle_node_hash_preimages[level - 1][currency], + "sibling node balance", + config.advices[1], + )?; + sibling_balances.push(middle_node_sibling_balance); + } + + // Assign middle_node_sibling_child_left_hash from middle node hash preimage to the circuit + let middle_node_sibling_child_left_hash = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling left hash")), + self.sibling_middle_node_hash_preimages[level - 1][N_CURRENCIES], + "sibling left hash", + config.advices[2], + )?; + + // Assign middle_node_sibling_child_right_hash from middle node hash preimage to the circuit + let middle_node_sibling_child_right_hash = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling right hash")), + self.sibling_middle_node_hash_preimages[level - 1][N_CURRENCIES + 1], + "sibling right hash", + config.advices[2], + )?; + + // create an hash_input array of length 2 + N_CURRENCIES that contains the sibling balances, the middle_node_sibling_child_left_hash and the middle_node_sibling_child_right_hash + let sibling_hasher_input_vec: Vec> = sibling_balances + .iter() + .chain([middle_node_sibling_child_left_hash].iter()) + .chain([middle_node_sibling_child_right_hash].iter()) + .map(|x| x.to_owned()) + .collect(); + + let sibling_hasher_input: [AssignedCell; N_CURRENCIES + 2] = + match sibling_hasher_input_vec.try_into() { + Ok(arr) => arr, + Err(_) => panic!("Failed to convert Vec to Array"), + }; + + // compute the sibling hash + let computed_sibling_hash = poseidon_middle_chip.hash( + layouter.namespace(|| format!("{}: perform poseidon hash", namespace_prefix)), + sibling_hasher_input, + )?; + + // For other levels, only perform range on the sibling node balances. Any risk of overflow of the `current_balances` will be checked during verification + for currency in 0..N_CURRENCIES { + // Each balance cell is constrained to be within the range defined by N_BYTES + range_check_chip.assign( + layouter.namespace(|| { + format!( + "{}: currency {}: range check sibling balance", + namespace_prefix, currency + ) + }), + &sibling_balances[currency], + )?; + } + + sibling_hash = computed_sibling_hash; + }; + + // For each level assign the swap bit to the circuit let swap_bit_level = self.assign_value_to_witness( layouter.namespace(|| format!("{}: assign swap bit", namespace_prefix)), self.path_indices[level], @@ -288,69 +446,43 @@ where config.advices[0], )?; - // For each level assign the hashes to the circuit + // For every level, perform the swap of the hashes (between `current_hash` and `sibling_hash`) according to the swap bit let (hash_left_current, hash_right_current) = merkle_sum_tree_chip - .assign_nodes_hashes_per_level( - layouter.namespace(|| format!("{}: assign nodes hashes", namespace_prefix)), + .swap_hashes_per_level( + layouter.namespace(|| format!("{}: swap hashes", namespace_prefix)), ¤t_hash, - self.path_element_hashes[level], - swap_bit_level.clone(), + &sibling_hash, + &swap_bit_level, )?; let mut next_balances = vec![]; - let mut left_balances = vec![]; - let mut right_balances = vec![]; - - // Within each level, assign the balances to the circuit per asset - for asset in 0..N_ASSETS { - let (left_balance, right_balance, next_balance) = merkle_sum_tree_chip - .assign_nodes_balance_per_asset( - layouter.namespace(|| { - format!( - "{}: asset {}: assign nodes balance", - namespace_prefix, asset - ) - }), - ¤t_balances[asset], - self.path_element_balances[level][asset], - swap_bit_level.clone(), - )?; - // Each balance cell is constrained to be within the range defined by N_BYTES - range_check_chip.assign( + // For every level, perform the swap of the balances (between `current_balances` and `sibling_balances`) according to the swap bit + for currency in 0..N_CURRENCIES { + let next_balance = merkle_sum_tree_chip.swap_balances_per_level( layouter.namespace(|| { format!( - "{}: asset {}: range check left balance", - namespace_prefix, asset + "{}: currency {}: assign nodes balance", + namespace_prefix, currency ) }), - &left_balance, - )?; - range_check_chip.assign( - layouter.namespace(|| { - format!( - "{}: asset {}: range check right balance", - namespace_prefix, asset - ) - }), - &right_balance, + ¤t_balances[currency], + &sibling_balances[currency], + &swap_bit_level, )?; next_balances.push(next_balance); - left_balances.push(left_balance); - right_balances.push(right_balance); } - // create an hash_input array of length 2 * (1 + N_ASSETS) that contains the left hash, the left balances, the right hash and the right balances - let middle_hasher_input_vec: Vec> = [hash_left_current] + // create an hash_input array of length N_CURRENCIES + 2 that contains the next balances, the left hash and the right hash + let middle_hasher_input_vec: Vec> = next_balances .iter() - .chain(left_balances.iter()) + .chain([hash_left_current].iter()) .chain([hash_right_current].iter()) - .chain(right_balances.iter()) .map(|x| x.to_owned()) .collect(); - let middle_hasher_input: [AssignedCell; 2 * (1 + N_ASSETS)] = + let middle_hasher_input: [AssignedCell; N_CURRENCIES + 2] = match middle_hasher_input_vec.try_into() { Ok(arr) => arr, Err(_) => panic!("Failed to convert Vec to Array"), @@ -374,11 +506,15 @@ where config.instance, )?; - // perform range check on the balances of the root to make sure these lie in the range defined by N_BYTES - for balance in current_balances.iter() { - range_check_chip.assign(layouter.namespace(|| "range check root balance"), balance)?; + // expose the last current balances, namely the root balances, as public input + for (i, balance) in current_balances.iter().enumerate() { + self.expose_public( + layouter.namespace(|| format!("public root balance {}", i)), + balance, + 2 + i, + config.instance, + )?; } - Ok(()) } } diff --git a/zk_prover/src/circuits/mod.rs b/zk_prover/src/circuits/mod.rs index 3cf1fbb0..1a494993 100644 --- a/zk_prover/src/circuits/mod.rs +++ b/zk_prover/src/circuits/mod.rs @@ -1,5 +1,4 @@ pub mod merkle_sum_tree; -pub mod solvency; mod tests; pub mod traits; pub mod types; diff --git a/zk_prover/src/circuits/solvency.rs b/zk_prover/src/circuits/solvency.rs deleted file mode 100644 index 3d5cde6b..00000000 --- a/zk_prover/src/circuits/solvency.rs +++ /dev/null @@ -1,357 +0,0 @@ -use crate::chips::less_than_check::lt_check::{CheckLtChip, CheckLtConfig}; -use crate::chips::merkle_sum_tree::{MerkleSumTreeChip, MerkleSumTreeConfig}; -use crate::chips::poseidon::hash::{PoseidonChip, PoseidonConfig}; -use crate::chips::poseidon::poseidon_spec::PoseidonSpec; -use crate::circuits::traits::CircuitBase; -use crate::merkle_sum_tree::MerkleSumTree; -use halo2_proofs::circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value}; -use halo2_proofs::halo2curves::bn256::Fr as Fp; -use halo2_proofs::plonk::{ - Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Instance, Selector, -}; -use snark_verifier_sdk::CircuitExt; - -/// Circuit for verifying solvency, namely that the asset_sums is greater than the sum of the liabilities stored in the merkle sum tree -/// -/// # Type Parameters -/// -/// * `N_ASSETS`: The number of assets for which the solvency is verified. -/// * `N_BYTES`: Range in which the balances should lie -/// -/// # Fields -/// -/// * `left_node_hash`: The hash of the penultimate left node of the merkle sum tree -/// * `left_node_balances`: The balances of the penultimate left node of the merkle sum tree -/// * `right_node_hash`: The hash of the penultimate right node of the merkle sum tree -/// * `right_node_balances`: The balances of the penultimate right node of the merkle sum tree -/// * `asset_sums`: The sum of the assets of the CEX for each asset -/// * `root_hash`: The root hash of the merkle sum tree -#[derive(Clone)] -pub struct SolvencyCircuit { - pub left_node_hash: Fp, - pub left_node_balances: [Fp; N_ASSETS], - pub right_node_hash: Fp, - pub right_node_balances: [Fp; N_ASSETS], - pub asset_sums: [Fp; N_ASSETS], - pub root_hash: Fp, -} - -impl CircuitBase - for SolvencyCircuit -{ -} - -impl CircuitExt - for SolvencyCircuit -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - /// Returns the number of public inputs of the circuit. It is 1 + N_ASSETS, namely the root hash of the merkle sum tree and the sum of the assets of the CEX for each asset - fn num_instance(&self) -> Vec { - vec![1 + N_ASSETS] - } - - /// Returns the values of the public inputs of the circuit. The first value is the root hash of the merkle sum tree and the remaining values are the sum of the assets of the CEX for each asset - fn instances(&self) -> Vec> { - let mut instances = vec![self.root_hash]; - instances.extend(self.asset_sums); - vec![instances] - } -} - -impl SolvencyCircuit { - pub fn init_empty() -> Self { - Self { - left_node_hash: Fp::zero(), - left_node_balances: [Fp::zero(); N_ASSETS], - right_node_hash: Fp::zero(), - right_node_balances: [Fp::zero(); N_ASSETS], - asset_sums: [Fp::zero(); N_ASSETS], - root_hash: Fp::zero(), - } - } - - /// Initializes the circuit with the merkle sum tree and the assets sum - pub fn init( - merkle_sum_tree: MerkleSumTree, - asset_sums: [Fp; N_ASSETS], - ) -> Self { - let (penultimate_node_left, penultimate_node_right) = merkle_sum_tree - .penultimate_level_data() - .expect("Failed to retrieve penultimate level data"); - - let root_hash = merkle_sum_tree.root().hash; - - Self { - left_node_hash: penultimate_node_left.hash, - left_node_balances: penultimate_node_left.balances, - right_node_hash: penultimate_node_right.hash, - right_node_balances: penultimate_node_right.balances, - asset_sums, - root_hash, - } - } -} - -/// Configuration for the solvency circuit -/// # Type Parameters -/// -/// * `N_ASSETS`: The number of assets for which the solvency is verified. -/// * `N_BYTES`: Range in which the balances should lie -/// -/// # Fields -/// -/// * `merkle_sum_tree_config`: Configuration for the merkle sum tree -/// * `poseidon_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 -/// * `instance`: Instance column used to store the public inputs -/// * `lt_selector`: Selector to activate the less than constraint -/// * `lt_config`: Configuration for the less than chip -/// -/// The circuit performs an additional constraint: -/// * `lt_enable * (lt_config.is_lt - 1) = 0` (if `lt_enable` is toggled). It basically enforces the result of the less than chip to be 1. -#[derive(Debug, Clone)] -pub struct SolvencyConfig -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - advice_cols: [Column; 3], - merkle_sum_tree_config: MerkleSumTreeConfig, - poseidon_config: PoseidonConfig<2, 1, { 2 * (1 + N_ASSETS) }>, - instance: Column, - check_lt_config: CheckLtConfig, -} - -impl SolvencyConfig -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - /// Configures the circuit - pub fn configure(meta: &mut ConstraintSystem) -> Self { - // the max number of advices columns needed is #WIDTH + 1 given requirement of the poseidon config - let advice_cols: [Column; 3] = std::array::from_fn(|_| meta.advice_column()); - - // the max number of fixed columns needed is 2 * WIDTH given requirement of the poseidon config - let fixed_columns: [Column; 4] = std::array::from_fn(|_| meta.fixed_column()); - - // we also need 4 selectors - 3 simple selectors and 1 complex selector - let selectors: [Selector; 3] = std::array::from_fn(|_| meta.selector()); - let enable_lookup_selector = meta.complex_selector(); - - // enable constant for the fixed_column[2], this is required for the poseidon chip - meta.enable_constant(fixed_columns[2]); - - // in fact, the poseidon config requires #WIDTH advice columns for state and 1 for partial_sbox, #WIDTH fixed columns for rc_a and #WIDTH for rc_b - let poseidon_config = PoseidonChip::::configure( - meta, - advice_cols[0..2].try_into().unwrap(), - advice_cols[2], - fixed_columns[0..2].try_into().unwrap(), - fixed_columns[2..4].try_into().unwrap(), - ); - - // enable permutation for all the advice columns - for col in &advice_cols { - meta.enable_equality(*col); - } - - // the configuration of merkle_sum_tree will always require 3 advices, no matter the number of assets - let merkle_sum_tree_config = MerkleSumTreeChip::::configure( - meta, - advice_cols[0..3].try_into().unwrap(), - selectors[0..2].try_into().unwrap(), - ); - - // configure check lt chip - let check_lt_config = CheckLtChip::::configure( - meta, - advice_cols[0], - advice_cols[1], - advice_cols[2], - fixed_columns[0], - selectors[2], - enable_lookup_selector, - ); - - let instance = meta.instance_column(); - meta.enable_equality(instance); - - Self { - advice_cols, - merkle_sum_tree_config, - poseidon_config, - check_lt_config, - instance, - } - } - - /// Generic method to assign witness value to a cell in the witness table to advice column `column_index`. `object_to_assign` is label to identify the object being assigned. It is useful for debugging. - pub fn assign_value_to_witness( - &self, - mut layouter: impl Layouter, - value: Fp, - column_index: usize, - object_to_assign: &'static str, - ) -> Result, Error> { - layouter.assign_region( - || format!("assign {}", object_to_assign), - |mut region| { - region.assign_advice( - || "value", - self.advice_cols[column_index], - 0, - || Value::known(value), - ) - }, - ) - } -} - -impl Circuit for SolvencyCircuit -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - type Config = SolvencyConfig; - type FloorPlanner = SimpleFloorPlanner; - - fn without_witnesses(&self) -> Self { - Self::init_empty() - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - SolvencyConfig::::configure(meta) - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), Error> { - // build auxiliary chips - let merkle_sum_tree_chip = - MerkleSumTreeChip::::construct(config.merkle_sum_tree_config.clone()); - let poseidon_chip = PoseidonChip::::construct( - config.poseidon_config.clone(), - ); - let check_lt_chip = CheckLtChip::::construct(config.check_lt_config); - - // assign asset sums value to the witness - let asset_sums = self - .asset_sums - .iter() - .enumerate() - .map(|(i, sum)| { - config.assign_value_to_witness( - layouter.namespace(|| format!("assign asset sum {}", i)), - *sum, - 0, - "asset sum", - ) - }) - .collect::, _>>()?; - - // Assign the penultimate left node hash and the penultimate left node balances following this layout on two columns: - // - // | a | b | - // | --------------------- | -------------------------- | - // | left_node_hash | left_node_balances_0 | - // | - | left_node_balances_1 | - // | - | ... | - // | - | left_node_balances_N | - - let left_node_hash = self.assign_value_to_witness( - layouter.namespace(|| "assign penultimate left node hash"), - self.left_node_hash, - "left node hash", - config.advice_cols[0], - )?; - - let left_node_balances = self - .left_node_balances - .iter() - .enumerate() - .map(|(i, balance)| { - self.assign_value_to_witness( - layouter.namespace(|| format!("assign entry balance {}", i)), - *balance, - "left node balance", - config.advice_cols[1], - ) - }) - .collect::, _>>()?; - - // assign swap bit - let swap_bit = self.assign_value_to_witness( - layouter.namespace(|| "assign swap bit"), - Fp::from(0), - "swap bit", - config.advice_cols[2], - )?; - - // assign penultimate nodes hashes according to the swap bit - let (left_hash, right_hash) = merkle_sum_tree_chip.assign_nodes_hashes_per_level( - layouter.namespace(|| "assign penultimate nodes hashes"), - &left_node_hash, - self.right_node_hash, - swap_bit.clone(), - )?; - - let mut root_balances = vec![]; - let mut left_balances = vec![]; - let mut right_balances = vec![]; - - // assign penultimate nodes balances per each asset according to the swap bit - for asset in 0..N_ASSETS { - let (left_balance, right_balance, next_balance) = merkle_sum_tree_chip - .assign_nodes_balance_per_asset( - layouter.namespace(|| format!("asset {}: assign nodes balances", asset)), - &left_node_balances[asset], - self.right_node_balances[asset], - swap_bit.clone(), - )?; - - root_balances.push(next_balance); - left_balances.push(left_balance); - right_balances.push(right_balance); - } - - // create an hash_input array of length L that contains the left hash, the left balances, the right hash and the right balances - let hash_input_vec: Vec> = [left_hash] - .iter() - .chain(left_balances.iter()) - .chain([right_hash].iter()) - .chain(right_balances.iter()) - .map(|x| x.to_owned()) - .collect(); - - let hash_input: [AssignedCell; 2 * (1 + N_ASSETS)] = match hash_input_vec.try_into() - { - Ok(arr) => arr, - Err(_) => panic!("Failed to convert Vec to Array"), - }; - - // compute the root hash - let root_hash = poseidon_chip.hash( - layouter.namespace(|| format!("perform root hash")), - hash_input, - )?; - - // expose the root hash, as public input - self.expose_public( - layouter.namespace(|| "public root hash"), - &root_hash, - 0, - config.instance, - )?; - - // enforce root balances to be less than the assets sum - for i in 0..N_ASSETS { - check_lt_chip.assign( - layouter.namespace(|| "enforce less than"), - &root_balances[i], - &asset_sums[i], - )?; - } - - Ok(()) - } -} diff --git a/zk_prover/src/circuits/tests.rs b/zk_prover/src/circuits/tests.rs index e55ffd0d..2e7a6dcd 100644 --- a/zk_prover/src/circuits/tests.rs +++ b/zk_prover/src/circuits/tests.rs @@ -1,27 +1,23 @@ #[cfg(test)] mod test { - use crate::merkle_sum_tree::MerkleSumTree; + use crate::merkle_sum_tree::{MerkleSumTree, Tree}; use crate::{ circuits::{ merkle_sum_tree::MstInclusionCircuit, - solvency::SolvencyCircuit, - utils::{full_prover, full_verifier, generate_setup_artifacts, get_verification_cost}, + utils::{full_prover, full_verifier, generate_setup_artifacts}, }, - merkle_sum_tree::{big_uint_to_fp, Entry}, + merkle_sum_tree::Entry, }; use halo2_proofs::{ dev::{FailureLocation, MockProver, VerifyFailure}, halo2curves::bn256::Fr as Fp, plonk::Any, }; - use num_bigint::{BigUint, ToBigUint}; - use snark_verifier_sdk::{ - evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}, - CircuitExt, - }; + use num_bigint::ToBigUint; + use snark_verifier_sdk::CircuitExt; - const N_ASSETS: usize = 2; + const N_CURRENCIES: usize = 2; const LEVELS: usize = 4; const N_BYTES: usize = 14; const K: u32 = 11; @@ -29,18 +25,18 @@ mod test { #[test] fn test_valid_merkle_sum_tree() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); for user_index in 0..16 { - let circuit = MstInclusionCircuit::::init( - merkle_sum_tree.clone(), - user_index, - ); + // get proof for entry ˆuser_indexˆ + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + let circuit = MstInclusionCircuit::::init(merkle_proof); let valid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); assert_eq!(circuit.instances()[0].len(), circuit.num_instance()[0]); + assert_eq!(circuit.instances()[0].len(), 2 + N_CURRENCIES); valid_prover.assert_satisfied(); } @@ -48,7 +44,7 @@ mod test { #[test] fn test_valid_merkle_sum_tree_with_full_prover() { - let circuit = MstInclusionCircuit::::init_empty(); + let circuit = MstInclusionCircuit::::init_empty(); // Generate a universal trusted setup for testing purposes. // @@ -59,53 +55,48 @@ mod test { let (params, pk, vk) = generate_setup_artifacts(K, None, circuit).unwrap(); let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + let circuit = MstInclusionCircuit::::init(merkle_proof); // Generate the proof let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); // verify the proof to be true assert!(full_verifier(¶ms, &vk, proof, circuit.instances())); - } - #[test] - fn test_valid_solvency_with_full_prover() { - let circuit = SolvencyCircuit::::init_empty(); + // the user should perform the check on the public inputs + // public input #0 is the leaf hash + let expected_leaf_hash = user_entry.compute_leaf().hash; + assert_eq!(circuit.instances()[0][0], expected_leaf_hash); - // The verification key (vk) and the proving key (pk) are then generated. - // An empty circuit is used here to emphasize that the circuit inputs are not relevant when generating the keys. - // Important: The dimensions of the circuit used to generate the keys must match those of the circuit used to generate the proof. - // In this case, the dimensions are represented by the height of the Merkle tree. - let (params, pk, vk) = generate_setup_artifacts(10, None, circuit).unwrap(); - - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - let asset_sums = [Fp::from(556863u64), Fp::from(556863u64)]; - - // Only now we can instantiate the circuit with the actual inputs - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - // Generate the proof - let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); + // public input #1 is the root hash + let expected_root_hash = merkle_sum_tree.root().hash; + assert_eq!(circuit.instances()[0][1], expected_root_hash); - // verify the proof to be true - assert!(full_verifier(¶ms, &vk, proof, circuit.instances())); + // public inputs [2, 2+N_CURRENCIES - 1] are the root balances + let expected_root_balances = merkle_sum_tree.root().balances; + for i in 0..N_CURRENCIES { + assert_eq!(circuit.instances()[0][2 + i], expected_root_balances[i]); + } } // Passing an invalid root hash in the instance column should fail the permutation check between the computed root hash and the instance column root hash #[test] fn test_invalid_root_hash() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + let circuit = MstInclusionCircuit::::init(merkle_proof); let mut instances = circuit.instances(); let invalid_root_hash = Fp::from(1000u64); @@ -119,7 +110,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (121, "permute state").into(), offset: 36 } }, @@ -133,17 +124,20 @@ mod test { #[test] fn test_invalid_root_hash_as_instance_with_full_prover() { - let circuit = MstInclusionCircuit::::init_empty(); + let circuit = MstInclusionCircuit::::init_empty(); // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). let (params, pk, vk) = generate_setup_artifacts(K, None, circuit).unwrap(); let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + let circuit = MstInclusionCircuit::::init(merkle_proof); let invalid_root_hash = Fp::from(1000u64); @@ -160,14 +154,18 @@ mod test { // Passing an invalid entry balance as input for the witness generation should fail: // - the permutation check between the leaf hash and the instance column leaf hash // - the permutation check between the computed root hash and the instance column root hash + // - the permutations checks between the computed root balances and the instance column root balances #[test] fn test_invalid_entry_balance_as_witness() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); - let mut circuit = - MstInclusionCircuit::::init(merkle_sum_tree, 0); + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + // Only now we can instantiate the circuit with the actual inputs + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -186,17 +184,31 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (26, "assign nodes hashes per merkle tree level").into(), offset: 0 } }, VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (121, "permute state").into(), offset: 36 } }, + VerifyFailure::Permutation { + column: (Any::advice(), 2).into(), + location: FailureLocation::InRegion { + region: (111, "assign nodes balances per currency").into(), + offset: 1 + } + }, + VerifyFailure::Permutation { + column: (Any::advice(), 2).into(), + location: FailureLocation::InRegion { + region: (112, "assign nodes balances per currency").into(), + offset: 1 + } + }, VerifyFailure::Permutation { column: (Any::Instance, 0).into(), location: FailureLocation::OutsideRegion { row: 0 } @@ -205,6 +217,14 @@ mod test { column: (Any::Instance, 0).into(), location: FailureLocation::OutsideRegion { row: 1 } }, + VerifyFailure::Permutation { + column: (Any::Instance, 0).into(), + location: FailureLocation::OutsideRegion { row: 2 } + }, + VerifyFailure::Permutation { + column: (Any::Instance, 0).into(), + location: FailureLocation::OutsideRegion { row: 3 } + }, ]) ); } @@ -213,10 +233,14 @@ mod test { #[test] fn test_invalid_leaf_hash_as_instance() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + // Only now we can instantiate the circuit with the actual inputs + let circuit = MstInclusionCircuit::::init(merkle_proof); let mut instances = circuit.instances(); let invalid_leaf_hash = Fp::from(1000u64); @@ -230,7 +254,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (26, "assign nodes hashes per merkle tree level").into(), offset: 0 } }, @@ -242,15 +266,51 @@ mod test { ); } - // Passing a non binary index should fail the bool constraint inside "assign nodes hashes per merkle tree level" and "assign nodes balances per asset" region and the permutation check between the computed root hash and the instance column root hash + // Building a proof using as input a csv file with an entry that is not in range [0, 2^N_BYTES*8 - 1] should fail the range check constraint on the leaf balance #[test] - fn test_non_binary_index() { + fn test_balance_not_in_range() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") + MerkleSumTree::::from_csv("../csv/entry_16_overflow.csv") .unwrap(); - let mut circuit = - MstInclusionCircuit::::init(merkle_sum_tree, 0); + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + let circuit = MstInclusionCircuit::::init(merkle_proof); + + let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); + + assert_eq!( + invalid_prover.verify(), + Err(vec![ + VerifyFailure::Permutation { + column: (Any::Fixed, 2).into(), + location: FailureLocation::OutsideRegion { row: 246 } + }, + VerifyFailure::Permutation { + column: (Any::advice(), 0).into(), + location: FailureLocation::InRegion { + region: (21, "assign value to perform range check").into(), + offset: 14 + } + }, + ]) + ); + } + + // Passing a non binary index should fail the bool constraint inside "assign nodes hashes per merkle tree level" and "assign nodes balances per currency" region and the permutation check between the computed root hash and the instance column root hash + #[test] + fn test_non_binary_index() { + let merkle_sum_tree = + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + // Only now we can instantiate the circuit with the actual inputs + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -265,7 +325,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (26, "assign nodes hashes per merkle tree level").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -273,7 +333,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (13, "assign nodes balances per asset").into(), + region: (27, "assign nodes balances per currency").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -281,7 +341,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (16, "assign nodes balances per asset").into(), + region: (28, "assign nodes balances per currency").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -289,7 +349,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (26, "assign nodes hashes per merkle tree level").into(), offset: 0 }, cell_values: vec![ @@ -308,6 +368,26 @@ mod test { "0x17ef9d8ee0e2c8470814651413b71009a607a020214f749687384a7b7a7eb67a" .to_string() ), + (((Any::advice(), 2).into(), 0).into(), "0x2".to_string()), + ] + }, + VerifyFailure::ConstraintNotSatisfied { + constraint: ((7, "swap constraint").into(), 1, "").into(), + location: FailureLocation::InRegion { + region: (26, "assign nodes hashes per merkle tree level").into(), + offset: 0 + }, + cell_values: vec![ + ( + ((Any::advice(), 0).into(), 0).into(), + "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407" + .to_string() + ), + ( + ((Any::advice(), 1).into(), 0).into(), + "0x17ef9d8ee0e2c8470814651413b71009a607a020214f749687384a7b7a7eb67a" + .to_string() + ), ( ((Any::advice(), 1).into(), 1).into(), "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407" @@ -319,13 +399,25 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (13, "assign nodes balances per asset").into(), + region: (27, "assign nodes balances per currency").into(), offset: 0 }, cell_values: vec![ (((Any::advice(), 0).into(), 0).into(), "0x2e70".to_string()), (((Any::advice(), 0).into(), 1).into(), "0x108ef".to_string()), (((Any::advice(), 1).into(), 0).into(), "0x108ef".to_string()), + (((Any::advice(), 2).into(), 0).into(), "0x2".to_string()), + ] + }, + VerifyFailure::ConstraintNotSatisfied { + constraint: ((7, "swap constraint").into(), 1, "").into(), + location: FailureLocation::InRegion { + region: (27, "assign nodes balances per currency").into(), + offset: 0 + }, + cell_values: vec![ + (((Any::advice(), 0).into(), 0).into(), "0x2e70".to_string()), + (((Any::advice(), 1).into(), 0).into(), "0x108ef".to_string()), (((Any::advice(), 1).into(), 1).into(), "0x2e70".to_string()), (((Any::advice(), 2).into(), 0).into(), "0x2".to_string()), ] @@ -333,13 +425,25 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (16, "assign nodes balances per asset").into(), + region: (28, "assign nodes balances per currency").into(), offset: 0 }, cell_values: vec![ (((Any::advice(), 0).into(), 0).into(), "0xa0cb".to_string()), (((Any::advice(), 0).into(), 1).into(), "0x48db".to_string()), (((Any::advice(), 1).into(), 0).into(), "0x48db".to_string()), + (((Any::advice(), 2).into(), 0).into(), "0x2".to_string()), + ] + }, + VerifyFailure::ConstraintNotSatisfied { + constraint: ((7, "swap constraint").into(), 1, "").into(), + location: FailureLocation::InRegion { + region: (28, "assign nodes balances per currency").into(), + offset: 0 + }, + cell_values: vec![ + (((Any::advice(), 0).into(), 0).into(), "0xa0cb".to_string()), + (((Any::advice(), 1).into(), 0).into(), "0x48db".to_string()), (((Any::advice(), 1).into(), 1).into(), "0xa0cb".to_string()), (((Any::advice(), 2).into(), 0).into(), "0x2".to_string()), ] @@ -347,7 +451,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (121, "permute state").into(), offset: 36 } }, @@ -363,11 +467,14 @@ mod test { #[test] fn test_swapping_index() { let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; - let mut circuit = - MstInclusionCircuit::::init(merkle_sum_tree, 0); + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + // Only now we can instantiate the circuit with the actual inputs + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -382,7 +489,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (121, "permute state").into(), offset: 36 } }, @@ -394,281 +501,19 @@ mod test { ); } - // Adding a balance at the verge of overflowing should fail the range check for any following computed sum and, because we are adding a fake balance, the root hash check should fail too - #[test] - fn test_balance_not_in_range() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - let mut circuit = - MstInclusionCircuit::::init(merkle_sum_tree.clone(), 0); - - let balance = BigUint::from(2u64).pow(N_BYTES as u32 * 8) - BigUint::from(1u64); - - circuit.path_element_balances[0][0] = big_uint_to_fp(&balance); // 2^64 - 1. It means that as soon as it is summed with the other balances, it will overflow - - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 431 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 739 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 1047 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 1355 } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (35, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (56, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (77, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (94, "permute state").into(), - offset: 36 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (95, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::Instance, 0).into(), - location: FailureLocation::OutsideRegion { row: 1 } - }, - ]) - ); - } - - // Passing asset_sums that are less than the liabilities sum should not fail the solvency circuit - #[test] - fn test_valid_liabilities_less_than_assets() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - // Make the first asset sum more than liabilities sum (556862) - let asset_sums = [Fp::from(556863u64), Fp::from(556863u64)]; - - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - let valid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - valid_prover.assert_satisfied(); - } - - #[test] - fn test_solvency_on_chain_verifier() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - let asset_sums = [Fp::from(556863u64), Fp::from(556863u64)]; - - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). - let (params, pk, _) = generate_setup_artifacts(10, None, circuit.clone()).unwrap(); - - get_verification_cost(¶ms, &pk, circuit.clone()); - - let num_instances = circuit.num_instance(); - let instances = circuit.instances(); - - let proof_calldata = gen_evm_proof_shplonk(¶ms, &pk, circuit, instances.clone()); - - let deployment_code = gen_evm_verifier_shplonk::>( - ¶ms, - pk.get_vk(), - num_instances, - None, - ); - - let gas_cost = evm_verify(deployment_code, instances, proof_calldata); - - assert!( - (350000..=450000).contains(&gas_cost), - "gas_cost is not within the expected range" - ); - } - - // Passing assets sum that is less than the liabilities sum should fail the solvency circuit - #[test] - fn test_invalid_assets_less_than_liabilities() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - // Make the first asset sum less than liabilities sum (556862) - let less_than_asset_sums_1st = [Fp::from(556861u64), Fp::from(556863u64)]; - - let circuit = SolvencyCircuit::::init( - merkle_sum_tree.clone(), - less_than_asset_sums_1st, - ); - - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 250 } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (24, "assign value to perform range check").into(), - offset: 14 - } - }, - ]) - ); - - // Make the second asset sum less than liabilities sum (556862) - let less_than_asset_sums_2nd = [Fp::from(556863u64), Fp::from(556861u64)]; - - let circuit = SolvencyCircuit::::init( - merkle_sum_tree.clone(), - less_than_asset_sums_2nd, - ); - - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 251 } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (27, "assign value to perform range check").into(), - offset: 14 - } - }, - ]) - ); - - // Make both the balances less than liabilities sum (556862) - let less_than_asset_sums_both = [Fp::from(556861u64), Fp::from(556861u64)]; - - let circuit = - SolvencyCircuit::::init(merkle_sum_tree, less_than_asset_sums_both); - - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 250 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 251 } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (24, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 2).into(), - location: FailureLocation::InRegion { - region: (27, "assign value to perform range check").into(), - offset: 14 - } - }, - ]) - ); - } - - // Manipulating the liabilities to make it less than the assets sum should fail the solvency circuit because the root hash will not match - #[test] - fn test_invalid_manipulated_liabilties() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - // For the second asset, the asset_sums is less than the liabilities sum (556862) namely the CEX is not solvent! - let less_than_asset_sums_2nd = [Fp::from(556863u64), Fp::from(556861u64)]; - - let mut circuit = - SolvencyCircuit::::init(merkle_sum_tree, less_than_asset_sums_2nd); - - // But actually, the CEX tries to manipulate the liabilities sum for the second asset to make it less than the assets sum and result solvent - circuit.left_node_balances[1] = Fp::from(1u64); - - // This should pass the less the less than constraint but generate a root hash that does not match the one passed in the instance - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (21, "permute state").into(), - offset: 36 - } - }, - VerifyFailure::Permutation { - column: (Any::Instance, 0).into(), - location: FailureLocation::OutsideRegion { row: 0 } - }, - ]) - ); - } - #[cfg(feature = "dev-graph")] #[test] fn print_mst_inclusion() { use plotters::prelude::*; let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; - let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + let circuit = MstInclusionCircuit::::init(merkle_proof); let root = BitMapBackend::new("prints/mst-inclusion-layout.png", (2048, 32768)) .into_drawing_area(); @@ -681,27 +526,4 @@ mod test { .render(K, &circuit, &root) .unwrap(); } - - #[cfg(feature = "dev-graph")] - #[test] - fn print_solvency_circuit() { - use plotters::prelude::*; - - let asset_sums = [Fp::from(556863u64), Fp::from(556863u64)]; - - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); - - let root = - BitMapBackend::new("prints/solvency-layout.png", (2048, 32768)).into_drawing_area(); - root.fill(&WHITE).unwrap(); - let root = root.titled("Solvency Layout", ("sans-serif", 60)).unwrap(); - - halo2_proofs::dev::CircuitLayout::default() - .render(K, &circuit, &root) - .unwrap(); - } } diff --git a/zk_prover/src/circuits/traits.rs b/zk_prover/src/circuits/traits.rs index 61d3d3de..359b3f5b 100644 --- a/zk_prover/src/circuits/traits.rs +++ b/zk_prover/src/circuits/traits.rs @@ -1,6 +1,6 @@ use halo2_proofs::circuit::{Layouter, Value}; use halo2_proofs::halo2curves::bn256::Fr as Fp; -use halo2_proofs::plonk::{Advice, Column, Error}; +use halo2_proofs::plonk::{Advice, Column, Error, Fixed}; use halo2_proofs::{circuit::AssignedCell, plonk::Instance}; /// Trait containing common methods for all circuits @@ -30,4 +30,24 @@ pub trait CircuitBase { |mut region| region.assign_advice(|| "value", advice_col, 0, || Value::known(value)), ) } + + /// Loads the lookup table with values from `0` to `2^8 - 1` + fn load(&self, layouter: &mut impl Layouter, column: Column) -> Result<(), Error> { + let range = 1 << 8; + + layouter.assign_region( + || format!("load range check table of {} bits", 8), + |mut region| { + for i in 0..range { + region.assign_fixed( + || "assign cell in fixed column", + column, + i, + || Value::known(Fp::from(i as u64)), + )?; + } + Ok(()) + }, + ) + } } diff --git a/zk_prover/src/circuits/types.rs b/zk_prover/src/circuits/types.rs index d6a1cee8..4a546666 100644 --- a/zk_prover/src/circuits/types.rs +++ b/zk_prover/src/circuits/types.rs @@ -6,3 +6,9 @@ pub struct ProofSolidityCallData { pub proof: String, pub public_inputs: Vec, } + +#[derive(Serialize, Deserialize)] +pub struct CommitmentSolidityCallData { + pub root_hash: U256, + pub root_balances: Vec, +} diff --git a/zk_prover/src/circuits/utils.rs b/zk_prover/src/circuits/utils.rs index 96bb2bcb..80525204 100644 --- a/zk_prover/src/circuits/utils.rs +++ b/zk_prover/src/circuits/utils.rs @@ -225,7 +225,7 @@ fn fix_verifier_sol(yul_code_path: PathBuf) -> Result()?; let transcript_addr = format!("{:#x}", addr_as_num); transcript_addrs.push(addr_as_num); line = line.replace( @@ -238,7 +238,7 @@ fn fix_verifier_sol(yul_code_path: PathBuf) -> Result()?; let transcript_addr = format!("{:#x}", addr_as_num); transcript_addrs.push(addr_as_num); line = line.replace( @@ -433,9 +433,7 @@ pub fn gen_proof_solidity_calldata + CircuitExt>( let flattened_instances = instances.into_iter().flatten(); for val in flattened_instances { - let bytes = val.to_repr(); - let u = U256::from_little_endian(bytes.as_slice()); - public_inputs.push(u); + public_inputs.push(field_element_to_solidity_calldata(val)); } let solidity_proof_calldata = Bytes::from(proof_calldata); @@ -443,6 +441,13 @@ pub fn gen_proof_solidity_calldata + CircuitExt>( (solidity_proof_calldata, public_inputs) } +/// Converts a field element to a Solidity calldata +pub fn field_element_to_solidity_calldata(field_element: Fp) -> U256 { + let bytes = field_element.to_repr(); + let u = U256::from_little_endian(bytes.as_slice()); + u +} + /// Generates the solidity code for the verification contract starting from the yul code (yul_code_path) and writes it to sol_code_path pub fn write_verifier_sol_from_yul( yul_code_path: &str, diff --git a/zk_prover/src/lib.rs b/zk_prover/src/lib.rs index 378c8434..d3a3a6a1 100644 --- a/zk_prover/src/lib.rs +++ b/zk_prover/src/lib.rs @@ -8,4 +8,4 @@ pub mod chips; /// Zk circuits with a full prover and verifier. A circuit can be viewed as an assembly of chips. pub mod circuits; /// Utilities to build the merkle sum tree data structure. No zk proof in here. -pub mod merkle_sum_tree; \ No newline at end of file +pub mod merkle_sum_tree; diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16.csv deleted file mode 100644 index 917a3849..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;11888,41163 -MBlfbBGI;67823,18651 -lAhWlEWZ;18651,2087 -nuZweYtO;22073,55683 -gbdSwiuY;34897,83296 -RZNneNuP;83296,16881 -YsscHXkp;31699,35479 -RkLzkDun;2087,79731 -HlQlnEYI;30605,11888 -RqkZOFYe;16881,14874 -NjCSRAfD;41163,67823 -pHniJMQY;14874,22073 -dOGIMzKR;10032,10032 -HfMDmNLp;55683,34897 -xPLKzCBl;79731,30605 -AtwIxZHo;35479,31699 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_bigints.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_bigints.csv deleted file mode 100644 index e39b5bcc..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_bigints.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;18446744073709551616,79731 -MBlfbBGI;67823,55683 -lAhWlEWZ;18651,22073 -nuZweYtO;22073,35479 -gbdSwiuY;34897,10032 -RZNneNuP;83296,2087 -YsscHXkp;31699,34897 -RkLzkDun;2087,67823 -HlQlnEYI;30605,31699 -RqkZOFYe;16881,16881 -NjCSRAfD;41163,14874 -pHniJMQY;14874,18651 -dOGIMzKR;10032,41163 -HfMDmNLp;55683,83296 -xPLKzCBl;79731,18446744073709551616 -AtwIxZHo;35479,30605 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_modified.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_modified.csv deleted file mode 100644 index cacf3c69..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_modified.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;11888,41163 -MBlfbBGI;67823,18651 -lAhWlEWZ;18651,2087 -nuZweYtO;22073,55683 -gbdSwiuY;34897,83296 -RZNneNuP;83296,16881 -YsscHXkp;31699,35479 -RkLzkDun;2086,79732 -HlQlnEYI;30605,11888 -RqkZOFYe;16881,14874 -NjCSRAfD;41163,67823 -pHniJMQY;14874,22073 -dOGIMzKR;10032,10032 -HfMDmNLp;55683,34897 -xPLKzCBl;79731,30605 -AtwIxZHo;35479,31699 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_no_overflow.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_no_overflow.csv deleted file mode 100644 index 49dc9358..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_no_overflow.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;18446744073709551615,0 -MBlfbBGI;0,18446744073709551615 -lAhWlEWZ;0,0 -nuZweYtO;0,0 -gbdSwiuY;0,0 -RZNneNuP;0,0 -YsscHXkp;0,0 -RkLzkDun;0,0 -HlQlnEYI;0,0 -RqkZOFYe;0,0 -NjCSRAfD;0,0 -pHniJMQY;0,0 -dOGIMzKR;0,0 -HfMDmNLp;0,0 -xPLKzCBl;0,0 -AtwIxZHo;0,0 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow.csv deleted file mode 100644 index 1f1e2141..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;18446744073709551616,0 -MBlfbBGI;0,18446744073709551616 -lAhWlEWZ;0,0 -nuZweYtO;0,0 -gbdSwiuY;0,0 -RZNneNuP;0,0 -YsscHXkp;0,0 -RkLzkDun;0,0 -HlQlnEYI;0,0 -RqkZOFYe;0,0 -NjCSRAfD;0,0 -pHniJMQY;0,0 -dOGIMzKR;0,0 -HfMDmNLp;0,0 -xPLKzCBl;0,0 -AtwIxZHo;0,0 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow_2.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow_2.csv deleted file mode 100644 index 3b3ecf62..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_overflow_2.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;18446744073709551615,0 -MBlfbBGI;0,18446744073709551615 -lAhWlEWZ;0,0 -nuZweYtO;0,0 -gbdSwiuY;0,0 -RZNneNuP;0,0 -YsscHXkp;0,0 -RkLzkDun;0,0 -HlQlnEYI;0,0 -RqkZOFYe;0,0 -NjCSRAfD;0,0 -pHniJMQY;0,0 -dOGIMzKR;0,0 -HfMDmNLp;0,0 -xPLKzCBl;0,0 -AtwIxZHo;1,1 diff --git a/zk_prover/src/merkle_sum_tree/csv/entry_16_switched_order.csv b/zk_prover/src/merkle_sum_tree/csv/entry_16_switched_order.csv deleted file mode 100644 index 4c318183..00000000 --- a/zk_prover/src/merkle_sum_tree/csv/entry_16_switched_order.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;11888,79731 -MBlfbBGI;67823,22073 -lAhWlEWZ;18651,18651 -nuZweYtO;22073,35479 -gbdSwiuY;34897,83296 -RZNneNuP;83296,34897 -YsscHXkp;31699,55683 -RkLzkDun;2087,30605 -HlQlnEYI;30605,10032 -RqkZOFYe;16881,16881 -NjCSRAfD;41163,41163 -pHniJMQY;14874,31699 -dOGIMzKR;10032,11888 -HfMDmNLp;55683,14874 -AtwIxZHo;35479,67823 -xPLKzCBl;79731,2087 diff --git a/zk_prover/src/merkle_sum_tree/entry.rs b/zk_prover/src/merkle_sum_tree/entry.rs index be6fdb35..e77de9fd 100644 --- a/zk_prover/src/merkle_sum_tree/entry.rs +++ b/zk_prover/src/merkle_sum_tree/entry.rs @@ -4,15 +4,15 @@ use num_bigint::BigUint; /// An entry in the Merkle Sum Tree from the database of the CEX. /// It contains the username and the balances of the user. -#[derive(Clone, Debug)] -pub struct Entry { +#[derive(Clone, Debug, std::cmp::PartialEq)] +pub struct Entry { username_as_big_uint: BigUint, - balances: [BigUint; N_ASSETS], + balances: [BigUint; N_CURRENCIES], username: String, } -impl Entry { - pub fn new(username: String, balances: [BigUint; N_ASSETS]) -> Result { +impl Entry { + pub fn new(username: String, balances: [BigUint; N_CURRENCIES]) -> Result { Ok(Entry { username_as_big_uint: big_intify_username(&username), balances, @@ -20,19 +20,20 @@ impl Entry { }) } - pub fn init_empty() -> Self { - let empty_balances: [BigUint; N_ASSETS] = std::array::from_fn(|_| BigUint::from(0u32)); + /// Returns a zero entry where the username is 0 and the balances are all 0 + pub fn zero_entry() -> Self { + let empty_balances: [BigUint; N_CURRENCIES] = std::array::from_fn(|_| BigUint::from(0u32)); Entry { username_as_big_uint: BigUint::from(0u32), balances: empty_balances, - username: "".to_string(), + username: "0".to_string(), } } - pub fn compute_leaf(&self) -> Node + pub fn compute_leaf(&self) -> Node where - [usize; N_ASSETS + 1]: Sized, + [usize; N_CURRENCIES + 1]: Sized, { Node::leaf(&self.username_as_big_uint, &self.balances) } @@ -40,15 +41,18 @@ impl Entry { /// Stores the new balance values /// /// Returns the updated node - pub fn recompute_leaf(&mut self, updated_balances: &[BigUint; N_ASSETS]) -> Node + pub fn recompute_leaf( + &mut self, + updated_balances: &[BigUint; N_CURRENCIES], + ) -> Node where - [usize; N_ASSETS + 1]: Sized, + [usize; N_CURRENCIES + 1]: Sized, { self.balances = updated_balances.clone(); Node::leaf(&self.username_as_big_uint, updated_balances) } - pub fn balances(&self) -> &[BigUint; N_ASSETS] { + pub fn balances(&self) -> &[BigUint; N_CURRENCIES] { &self.balances } diff --git a/zk_prover/src/merkle_sum_tree/mod.rs b/zk_prover/src/merkle_sum_tree/mod.rs index b7950d93..02bb452a 100644 --- a/zk_prover/src/merkle_sum_tree/mod.rs +++ b/zk_prover/src/merkle_sum_tree/mod.rs @@ -2,19 +2,32 @@ mod entry; mod mst; mod node; mod tests; +mod tree; pub mod utils; use halo2_proofs::halo2curves::bn256::Fr as Fp; +/// A struct representing a Merkle Proof. +/// +/// Fields: +/// * `entry`: The entry for which the proof is generated +/// * `root`: The root of the Merkle Sum Tree +/// * `sibling_leaf_node_hash_preimage`: The hash preimage of the sibling leaf node. The hash preimage is equal to `[sibling_username, sibling.balance[0], sibling.balance[1], ... sibling.balance[N_CURRENCIES - 1]]` +/// * `sibling_middle_node_hash_preimages`: The hash preimages of the sibling middle nodes. The hash preimage is equal to `[sibling_left_child.balance[0] + sibling_right_child.balance[0], sibling_left_child.balance[1] + sibling_right_child.balance[1], ..., sibling_left_child.balance[N_CURRENCIES - 1] + sibling_right_child.balance[N_CURRENCIES - 1], sibling_left_child.hash, sibling_right_child.hash]` #[derive(Clone, Debug)] -pub struct MerkleProof { - pub root_hash: Fp, - pub entry: Entry, - pub sibling_hashes: Vec, - pub sibling_sums: Vec<[Fp; N_ASSETS]>, +pub struct MerkleProof +where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, +{ + pub entry: Entry, + pub root: Node, + pub sibling_leaf_node_hash_preimage: [Fp; N_CURRENCIES + 1], + pub sibling_middle_node_hash_preimages: Vec<[Fp; N_CURRENCIES + 2]>, pub path_indices: Vec, } pub use entry::Entry; +pub use mst::Cryptocurrency; pub use mst::MerkleSumTree; pub use node::Node; -pub use utils::{big_intify_username, big_uint_to_fp}; +pub use tree::Tree; diff --git a/zk_prover/src/merkle_sum_tree/mst.rs b/zk_prover/src/merkle_sum_tree/mst.rs index 4145f7ed..f1413576 100644 --- a/zk_prover/src/merkle_sum_tree/mst.rs +++ b/zk_prover/src/merkle_sum_tree/mst.rs @@ -1,89 +1,159 @@ use crate::merkle_sum_tree::utils::{ - build_merkle_tree_from_entries, create_proof, index_of, parse_csv_to_entries, verify_proof, + build_leaves_from_entries, build_merkle_tree_from_leaves, parse_csv_to_entries, }; -use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; +use crate::merkle_sum_tree::{Entry, Node, Tree}; +use halo2_proofs::halo2curves::bn256::Fr as Fp; use num_bigint::BigUint; /// Merkle Sum Tree Data Structure. /// /// A Merkle Sum Tree is a binary Merkle Tree with the following properties: -/// * Each Entry of a Merkle Sum Tree is a pair of a username and #N_ASSETS balances. -/// * Each Leaf Node contains a hash and #N_ASSETS balances. The hash is equal to `H(username, balance[0], balance[1], ... balance[N_ASSETS])`. -/// * Each Middle Node contains a hash and #N_ASSETS balances. The hash is equal to `H(LeftChild.hash, LeftChild.balance[0], LeftChild.balance[1], LeftChild.balance[N_ASSETS], RightChild.hash, RightChild.balance[0], RightChild.balance[1], RightChild.balance[N_ASSETS])`. The balances are equal to the sum of the balances of the child nodes per each asset. -/// * The Root Node represents the committed state of the Tree and contains the sum of all the entries' balances per each asset. +/// * Each Entry of a Merkle Sum Tree is a pair of a username and #N_CURRENCIES balances. +/// * Each Leaf Node contains a hash and #N_CURRENCIES balances. The hash is equal to `H(username, balance[0], balance[1], ... balance[N_CURRENCIES - 1])`. The balances are equal to the balances associated to the entry +/// * Each Middle Node contains a hash and #N_CURRENCIES balances. The hash is equal to `H(LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_CURRENCIES - 1] + RightChild.balance[N_CURRENCIES - 1], LeftChild.hash, RightChild.hash)`. The balances are equal to the sum of the balances of the child nodes per each cryptocurrency. +/// * The Root Node represents the committed state of the Tree and contains the sum of all the entries' balances per each cryptocurrency. /// /// # Type Parameters /// -/// * `N_ASSETS`: The number of assets for each user account +/// * `N_CURRENCIES`: The number of cryptocurrencies for each user account /// * `N_BYTES`: Range in which each node balance should lie #[derive(Debug, Clone)] -pub struct MerkleSumTree { - root: Node, - nodes: Vec>>, +pub struct MerkleSumTree { + root: Node, + nodes: Vec>>, depth: usize, - entries: Vec>, + entries: Vec>, + cryptocurrencies: Vec, is_sorted: bool, } -impl MerkleSumTree { - pub const MAX_DEPTH: usize = 29; +impl Tree + for MerkleSumTree +{ + fn root(&self) -> &Node { + &self.root + } + + fn depth(&self) -> &usize { + &self.depth + } + + fn nodes(&self) -> &[Vec>] { + &self.nodes + } + + fn get_entry(&self, index: usize) -> &Entry { + &self.entries[index] + } + + fn cryptocurrencies(&self) -> &[Cryptocurrency] { + &self.cryptocurrencies + } +} +#[derive(Debug, Clone)] +pub struct Cryptocurrency { + pub name: String, + pub chain: String, +} + +impl MerkleSumTree { + /// Returns the leaves of the tree + pub fn leaves(&self) -> &[Node] { + &self.nodes[0] + } + /// Returns the entries of the tree + pub fn entries(&self) -> &[Entry] { + &self.entries + } /// Builds a Merkle Sum Tree from a CSV file stored at `path`. The CSV file must be formatted as follows: /// - /// `username;balances` + /// `username,balance__,balance__,...` /// - /// `dxGaEAii;11888,41163` - pub fn new(path: &str) -> Result> + /// `dxGaEAii,11888,41163` + pub fn from_csv(path: &str) -> Result> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - let entries = parse_csv_to_entries::<&str, N_ASSETS, N_BYTES>(path)?; - Self::build_tree(entries, false) + let (cryptocurrencies, entries) = + parse_csv_to_entries::<&str, N_CURRENCIES, N_BYTES>(path)?; + Self::from_entries(entries, cryptocurrencies, false) } /// Builds a Merkle Sum Tree from a CSV file stored at `path`. The MST leaves are sorted by the username byte values. The CSV file must be formatted as follows: /// - /// `username;balances` + /// `username,balance__,balance__,...` /// - /// `dxGaEAii;11888,41163` - pub fn new_sorted(path: &str) -> Result> + /// `dxGaEAii,11888,41163` + pub fn from_csv_sorted(path: &str) -> Result> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - let mut entries = parse_csv_to_entries::<&str, N_ASSETS, N_BYTES>(path)?; + let (cryptocurrencies, mut entries) = + parse_csv_to_entries::<&str, N_CURRENCIES, N_BYTES>(path)?; entries.sort_by(|a, b| a.username().cmp(b.username())); - Self::build_tree(entries, true) + Self::from_entries(entries, cryptocurrencies, true) } - fn build_tree( - entries: Vec>, + /// Builds a Merkle Sum Tree from a vector of entries + pub fn from_entries( + mut entries: Vec>, + cryptocurrencies: Vec, is_sorted: bool, - ) -> Result, Box> + ) -> Result, Box> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { let depth = (entries.len() as f64).log2().ceil() as usize; - if !(1..=Self::MAX_DEPTH).contains(&depth) { - return Err( - "The tree depth must be between 1 and 27, namely it can support 2^27 users at max" - .into(), - ); + let mut nodes = vec![]; + + // Pad the entries with empty entries to make the number of entries equal to 2^depth + if entries.len() < 2usize.pow(depth as u32) { + entries.extend(vec![ + Entry::zero_entry(); + 2usize.pow(depth as u32) - entries.len() + ]); } - let mut nodes = vec![]; - let root = build_merkle_tree_from_entries(&entries, depth, &mut nodes)?; + let leaves = build_leaves_from_entries(&entries); + + let root = build_merkle_tree_from_leaves(&leaves, depth, &mut nodes)?; Ok(MerkleSumTree { root, nodes, depth, entries, + cryptocurrencies, + is_sorted, + }) + } + + /// Builds a Merkle Sum Tree from a root node, a vector of nodes, a depth, a vector of entries, a vector of cryptocurrencies and a boolean indicating whether the leaves are sorted by the username byte values. + pub fn from_params( + root: Node, + nodes: Vec>>, + depth: usize, + entries: Vec>, + cryptocurrencies: Vec, + is_sorted: bool, + ) -> Result> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + Ok(MerkleSumTree:: { + root, + nodes, + depth, + entries, + cryptocurrencies, is_sorted, }) } @@ -101,11 +171,11 @@ impl MerkleSumTree Result, Box> + new_balances: &[BigUint; N_CURRENCIES], + ) -> Result, Box> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { let index = self.index_of_username(username)?; @@ -119,7 +189,15 @@ impl MerkleSumTree::middle(left_child, right_child); + + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_CURRENCIES) { + *balance = left_child.balances[i] + right_child.balances[i]; + } + hash_preimage[N_CURRENCIES] = left_child.hash; + hash_preimage[N_CURRENCIES + 1] = right_child.hash; + + self.nodes[depth][parent_index] = Node::middle_node_from_preimage(&hash_preimage); current_index = parent_index; } @@ -128,46 +206,10 @@ impl MerkleSumTree &Node { - &self.root - } - - pub fn depth(&self) -> &usize { - &self.depth - } - - pub fn leaves(&self) -> &[Node] { - &self.nodes[0] - } - - pub fn entries(&self) -> &[Entry] { - &self.entries - } - - /// Returns the nodes stored at the penultimate level of the tree, namely the one before the root - pub fn penultimate_level_data( - &self, - ) -> Result<(&Node, &Node), &'static str> { - let penultimate_level = self - .nodes - .get(self.depth - 1) - .ok_or("The tree does not have a penultimate level")?; - - Ok((&penultimate_level[0], &penultimate_level[1])) - } - - /// Returns the index of the user with the given username and balances in the tree - pub fn index_of(&self, username: &str, balances: [BigUint; N_ASSETS]) -> Option - where - [usize; N_ASSETS + 1]: Sized, - { - index_of(username, balances, &self.nodes) - } - /// Returns the index of the leaf with the matching username pub fn index_of_username(&self, username: &str) -> Result> where - [usize; N_ASSETS + 1]: Sized, + [usize; N_CURRENCIES + 1]: Sized, { if !self.is_sorted { self.entries @@ -182,18 +224,4 @@ impl MerkleSumTree Result, &'static str> { - create_proof(index, &self.entries, self.depth, &self.nodes, &self.root) - } - - /// Verifies a MerkleProof - pub fn verify_proof(&self, proof: &MerkleProof) -> bool - where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, - { - verify_proof(proof) - } } diff --git a/zk_prover/src/merkle_sum_tree/node.rs b/zk_prover/src/merkle_sum_tree/node.rs index e4eef23e..963ac6e6 100644 --- a/zk_prover/src/merkle_sum_tree/node.rs +++ b/zk_prover/src/merkle_sum_tree/node.rs @@ -1,60 +1,114 @@ +use crate::chips::poseidon::poseidon_spec::PoseidonSpec; +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use halo2_gadgets::poseidon::primitives::{self as poseidon, ConstantLength}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use num_bigint::BigUint; -use super::{ - big_uint_to_fp, - utils::{poseidon_entry, poseidon_node}, -}; - -#[derive(Clone, Debug)] -pub struct Node { +#[derive(Clone, Debug, PartialEq)] +pub struct Node { pub hash: Fp, - pub balances: [Fp; N_ASSETS], + pub balances: [Fp; N_CURRENCIES], } -impl Node { +impl Node { + /// Builds a leaf-level node of the MST + /// The leaf node hash is equal to `H(username, balance[0], balance[1], ... balance[N_CURRENCIES - 1])` + /// The balances are equal to `balance[0], balance[1], ... balance[N_CURRENCIES - 1]` + pub fn leaf(username: &BigUint, balances: &[BigUint; N_CURRENCIES]) -> Node + where + [usize; N_CURRENCIES + 1]: Sized, + { + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 1]; + hash_preimage[0] = big_uint_to_fp(username); + for (i, balance) in hash_preimage.iter_mut().enumerate().skip(1) { + *balance = big_uint_to_fp(&balances[i - 1]); + } + + Node::leaf_node_from_preimage(&hash_preimage) + } + /// Builds a "middle" (non-leaf-level) node of the MST - pub fn middle(child_l: &Node, child_r: &Node) -> Node + /// The middle node hash is equal to `H(LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_CURRENCIES - 1] + RightChild.balance[N_CURRENCIES - 1], LeftChild.hash, RightChild.hash)` + /// The balances are equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_CURRENCIES - 1] + RightChild.balance[N_CURRENCIES - 1]` + pub fn middle(child_l: &Node, child_r: &Node) -> Node where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [(); N_CURRENCIES + 2]: Sized, { - let mut balances_sum = [Fp::zero(); N_ASSETS]; - for (i, balance) in balances_sum.iter_mut().enumerate() { + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_CURRENCIES) { *balance = child_l.balances[i] + child_r.balances[i]; } + hash_preimage[N_CURRENCIES] = child_l.hash; + hash_preimage[N_CURRENCIES + 1] = child_r.hash; + Node::middle_node_from_preimage(&hash_preimage) + } + + /// Returns an empty node where the hash is 0 and the balances are all 0 + pub fn init_empty() -> Node + where + [usize; N_CURRENCIES + 1]: Sized, + { Node { - hash: poseidon_node( - child_l.hash, - child_l.balances, - child_r.hash, - child_r.balances, - ), - balances: balances_sum, + hash: Fp::zero(), + balances: [Fp::zero(); N_CURRENCIES], } } - /// Builds a leaf-level node of the MST - pub fn leaf(username: &BigUint, balances: &[BigUint; N_ASSETS]) -> Node + pub fn leaf_node_from_preimage(preimage: &[Fp; N_CURRENCIES + 1]) -> Node + where + [usize; N_CURRENCIES + 1]: Sized, + { + Node { + hash: Self::poseidon_hash_leaf(preimage[0], preimage[1..].try_into().unwrap()), + balances: preimage[1..].try_into().unwrap(), + } + } + + /// Builds a middle-level node of the MST + /// The hash preimage must be equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_CURRENCIES - 1] + RightChild.balance[N_CURRENCIES - 1], LeftChild.hash, RightChild.hash` + /// The balances are equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_CURRENCIES - 1] + RightChild.balance[N_CURRENCIES - 1]` + pub fn middle_node_from_preimage(preimage: &[Fp; N_CURRENCIES + 2]) -> Node where - [usize; N_ASSETS + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { Node { - hash: poseidon_entry::( - big_uint_to_fp(username), - balances - .iter() - .map(big_uint_to_fp) - .collect::>() - .try_into() - .unwrap(), + hash: Self::poseidon_hash_middle( + preimage[0..N_CURRENCIES].try_into().unwrap(), + preimage[N_CURRENCIES], + preimage[N_CURRENCIES + 1], ), - //Map the array of balances using big_int_to_fp: - balances: balances - .iter() - .map(big_uint_to_fp) - .collect::>() - .try_into() - .unwrap(), + balances: preimage[0..N_CURRENCIES].try_into().unwrap(), } } + + fn poseidon_hash_middle( + balances_sum: [Fp; N_CURRENCIES], + hash_child_left: Fp, + hash_child_right: Fp, + ) -> Fp + where + [usize; N_CURRENCIES + 2]: Sized, + { + let mut hash_inputs: [Fp; N_CURRENCIES + 2] = [Fp::zero(); N_CURRENCIES + 2]; + + hash_inputs[0..N_CURRENCIES].copy_from_slice(&balances_sum); + hash_inputs[N_CURRENCIES] = hash_child_left; + hash_inputs[N_CURRENCIES + 1] = hash_child_right; + + poseidon::Hash::, 2, 1>::init() + .hash(hash_inputs) + } + + fn poseidon_hash_leaf(username: Fp, balances: [Fp; N_CURRENCIES]) -> Fp + where + [usize; N_CURRENCIES + 1]: Sized, + { + let mut hash_inputs: [Fp; N_CURRENCIES + 1] = [Fp::zero(); N_CURRENCIES + 1]; + + hash_inputs[0] = username; + hash_inputs[1..N_CURRENCIES + 1].copy_from_slice(&balances); + + poseidon::Hash::, 2, 1>::init() + .hash(hash_inputs) + } } diff --git a/zk_prover/src/merkle_sum_tree/tests.rs b/zk_prover/src/merkle_sum_tree/tests.rs index 164f64ba..b79fb22d 100644 --- a/zk_prover/src/merkle_sum_tree/tests.rs +++ b/zk_prover/src/merkle_sum_tree/tests.rs @@ -1,19 +1,19 @@ #[cfg(test)] mod test { - use crate::merkle_sum_tree::utils::{big_uint_to_fp, poseidon_node}; - use crate::merkle_sum_tree::{Entry, MerkleSumTree}; + use crate::merkle_sum_tree::utils::big_uint_to_fp; + use crate::merkle_sum_tree::{Entry, MerkleSumTree, Node, Tree}; use num_bigint::{BigUint, ToBigUint}; + use rand::Rng as _; - const N_ASSETS: usize = 2; + const N_CURRENCIES: usize = 2; const N_BYTES: usize = 8; #[test] fn test_mst() { // create new merkle tree let merkle_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); // get root let root = merkle_tree.root(); @@ -32,35 +32,16 @@ mod test { assert!(merkle_tree.verify_proof(&proof)); // Should generate different root hashes when changing the entry order - let merkle_tree_2 = MerkleSumTree::::new( - "src/merkle_sum_tree/csv/entry_16_switched_order.csv", - ) - .unwrap(); + let merkle_tree_2 = + MerkleSumTree::::from_csv("../csv/entry_16_switched_order.csv") + .unwrap(); assert_ne!(root.hash, merkle_tree_2.root().hash); // the balance total should be the same assert_eq!(root.balances, merkle_tree_2.root().balances); - // should retrun the index of an entry that exist in the tree - assert_eq!( - merkle_tree.index_of( - "AtwIxZHo", - [35479.to_biguint().unwrap(), 31699.to_biguint().unwrap()] - ), - Some(15) - ); - - // shouldn't retrun the index of an entry that doesn't exist in the tree - assert_eq!( - merkle_tree.index_of( - "AtwHHHHo", - [35478.to_biguint().unwrap(), 35478.to_biguint().unwrap()] - ), - None - ); - // should create valid proof for each entry in the tree and verify it - for i in 0..15 { + for i in 0..=15 { let proof = merkle_tree.generate_proof(i).unwrap(); assert!(merkle_tree.verify_proof(&proof)); } @@ -68,38 +49,34 @@ mod test { // shouldn't create a proof for an entry that doesn't exist in the tree assert!(merkle_tree.generate_proof(16).is_err()); - // shouldn't verify a proof with a wrong entry - let mut proof_invalid_1 = proof.clone(); - proof_invalid_1.entry = Entry::new( + // shouldn't verify a proof with a wrong leaf + let invalid_entry = Entry::new( "AtwIxZHo".to_string(), [35479.to_biguint().unwrap(), 35479.to_biguint().unwrap()], ) .unwrap(); + let invalid_entry = invalid_entry; + let mut proof_invalid_1 = proof.clone(); + proof_invalid_1.entry = invalid_entry; assert!(!merkle_tree.verify_proof(&proof_invalid_1)); // shouldn't verify a proof with a wrong root hash let mut proof_invalid_2 = proof.clone(); - proof_invalid_2.root_hash = 0.into(); + proof_invalid_2.root.hash = 0.into(); assert!(!merkle_tree.verify_proof(&proof_invalid_2)); - - // shouldn't verify a proof with a wrong computed balance - let mut proof_invalid_3 = proof; - proof_invalid_3.sibling_sums[0] = [0.into(), 0.into()]; } #[test] fn test_update_mst_leaf() { let merkle_tree_1 = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); let root_hash_1 = merkle_tree_1.root().hash; //Create the second tree with the 7th entry different from the the first tree - let mut merkle_tree_2 = MerkleSumTree::::new( - "src/merkle_sum_tree/csv/entry_16_modified.csv", - ) - .unwrap(); + let mut merkle_tree_2 = + MerkleSumTree::::from_csv("../csv/entry_16_modified.csv") + .unwrap(); let root_hash_2 = merkle_tree_2.root().hash; assert!(root_hash_1 != root_hash_2); @@ -118,8 +95,7 @@ mod test { #[test] fn test_update_invalid_mst_leaf() { let mut merkle_tree = - MerkleSumTree::::new_sorted("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv_sorted("../csv/entry_16.csv").unwrap(); let new_root = merkle_tree.update_leaf( "non_existing_user", //This username is not present in the tree @@ -134,75 +110,23 @@ mod test { #[test] fn test_sorted_mst() { let merkle_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); let old_root_balances = merkle_tree.root().balances; let old_root_hash = merkle_tree.root().hash; let sorted_merkle_tree = - MerkleSumTree::::new_sorted("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv_sorted("../csv/entry_16.csv").unwrap(); let new_root_balances = sorted_merkle_tree.root().balances; let new_root_hash = sorted_merkle_tree.root().hash; - // The index of an entry should not be the same for sorted and unsorted MST - assert_ne!( - merkle_tree - .index_of( - "AtwIxZHo", - [35479.to_biguint().unwrap(), 31699.to_biguint().unwrap()] - ) - .unwrap(), - sorted_merkle_tree.index_of_username("AtwIxZHo").unwrap() - ); - // The root balances should be the same for sorted and unsorted MST assert!(old_root_balances == new_root_balances); // The root hash should not be the same for sorted and unsorted MST assert!(old_root_hash != new_root_hash); } - // Passing a csv file with a single entry that has a balance that is not in the expected range will fail - #[test] - fn test_mst_overflow_1() { - let result = MerkleSumTree::::new( - "src/merkle_sum_tree/csv/entry_16_overflow.csv", - ); - - if let Err(e) = result { - assert_eq!( - e.to_string(), - "Accumulated balance is not in the expected range, proof generation will fail!" - ); - } - } - - #[test] - // Passing a csv file in which the entries have a balance in the range, but while summing it generates a ndoe in which the balance is not in the expected range will fail - fn test_mst_overflow_2() { - let result = MerkleSumTree::::new( - "src/merkle_sum_tree/csv/entry_16_overflow_2.csv", - ); - - if let Err(e) = result { - assert_eq!( - e.to_string(), - "Accumulated balance is not in the expected range, proof generation will fail!" - ); - } - } - - // Passing a csv file with a single entry that has a balance that is the maximum that can fit in the expected range will not fail - #[test] - fn test_mst_no_overflow() { - let result = MerkleSumTree::::new( - "src/merkle_sum_tree/csv/entry_16_no_overflow.csv", - ); - assert!(result.is_ok()); - } - #[test] fn test_big_uint_conversion() { let big_uint = 3.to_biguint().unwrap(); @@ -226,35 +150,116 @@ mod test { } #[test] - fn test_penultimate_level_data() { + fn get_middle_node_hash_preimage() { let merkle_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let depth = *merkle_tree.depth(); + + // The tree has 16 leaves, so the levels are 0, 1, 2, 3, 4. Where level 0 is the leaves and level 4 is the root + // Fetch a random level from 1 to depth + let mut rng = rand::thread_rng(); + let level = rng.gen_range(1..depth); + + // Fetch a random index inside the level. For example level 1 has 8 nodes, so the index can be 0, 1, 2, 3, 4, 5, 6, 7 + let index = rng.gen_range(0..merkle_tree.nodes()[level].len()); + + // Fetch middle node with index from level + let middle_node = merkle_tree.nodes()[level][index].clone(); + + // Fetch the hash preimage of the middle node + let hash_preimage = merkle_tree + .get_middle_node_hash_preimage(level, index) + .unwrap(); + + let computed_middle_node = Node::::middle_node_from_preimage(&hash_preimage); + + // The hash of the middle node should match the hash computed from the hash preimage + assert_eq!(middle_node.hash, computed_middle_node.hash); + } + #[test] + fn get_leaf_node_hash_preimage() { + let merkle_tree = + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + // Generate a random number between 0 and 15 + let mut rng = rand::thread_rng(); + let index = rng.gen_range(0..16); + + // Fetch leaf with index + let leaf = merkle_tree.leaves()[index].clone(); + + // Fetch the hash preimage of the leaf + let hash_preimage = merkle_tree.get_leaf_node_hash_preimage(index).unwrap(); + + let computed_leaf = Node::::leaf_node_from_preimage(&hash_preimage); + + // The hash of the leaf should match the hash computed from the hash preimage + assert_eq!(leaf.hash, computed_leaf.hash); + } + + #[test] + fn test_tree_with_zero_element_1() { + // create new merkle tree + let merkle_tree = + MerkleSumTree::::from_csv("../csv/entry_13.csv").unwrap(); + + // get root let root = merkle_tree.root(); - let (node_left, node_right) = merkle_tree - .penultimate_level_data() - .expect("Failed to retrieve penultimate level data"); + // The last 3 entries of the merkle tree should be zero entries + for i in 13..16 { + let entry = merkle_tree.entries()[i].clone(); + assert_eq!(entry, Entry::::zero_entry()); + } - // perform hashing using poseidon node - let expected_root = poseidon_node( - node_left.hash, - node_left.balances, - node_right.hash, - node_right.balances, - ); + // expect root hash to be different than 0 + assert!(root.hash != 0.into()); + // expect balance to match the sum of all entries + assert!(root.balances == [385969.into(), 459661.into()]); + // expect depth to be 4 + assert!(*merkle_tree.depth() == 4_usize); - assert_eq!(root.hash, expected_root); + // should create valid proof for each entry in the tree and verify it + for i in 0..=15 { + let proof = merkle_tree.generate_proof(i).unwrap(); + assert!(merkle_tree.verify_proof(&proof)); + } - assert_eq!( - root.balances[0], - node_left.balances[0] + node_right.balances[0] - ); + // shouldn't create a proof for an entry that doesn't exist in the tree + assert!(merkle_tree.generate_proof(16).is_err()); + } - assert_eq!( - root.balances[1], - node_left.balances[1] + node_right.balances[1] - ); + #[test] + fn test_tree_with_zero_element_2() { + // create new merkle tree + let merkle_tree = + MerkleSumTree::::from_csv("../csv/entry_17.csv").unwrap(); + + // get root + let root = merkle_tree.root(); + + // The last 15 entries of the merkle tree should be zero entries + for i in 17..32 { + let entry = merkle_tree.entries()[i].clone(); + assert_eq!(entry, Entry::::zero_entry()); + } + + // expect root hash to be different than 0 + assert!(root.hash != 0.into()); + // expect balance to match the sum of all entries + assert!(root.balances == [556863.into(), 556863.into()]); + // expect depth to be 5 + assert!(*merkle_tree.depth() == 5_usize); + + // should create valid proof for each entry in the tree and verify it + for i in 0..=31 { + let proof = merkle_tree.generate_proof(i).unwrap(); + assert!(merkle_tree.verify_proof(&proof)); + } + + // shouldn't create a proof for an entry that doesn't exist in the tree + assert!(merkle_tree.generate_proof(32).is_err()); } } diff --git a/zk_prover/src/merkle_sum_tree/tree.rs b/zk_prover/src/merkle_sum_tree/tree.rs new file mode 100644 index 00000000..b19019bf --- /dev/null +++ b/zk_prover/src/merkle_sum_tree/tree.rs @@ -0,0 +1,185 @@ +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use crate::merkle_sum_tree::Cryptocurrency; +use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; +use halo2_proofs::halo2curves::bn256::Fr as Fp; + +/// A trait representing the basic operations for a Merkle-Sum-like Tree. +pub trait Tree { + /// Returns a reference to the root node. + fn root(&self) -> &Node; + + /// Returns the depth of the tree. + fn depth(&self) -> &usize; + + /// Returns a slice of the nodes. + fn nodes(&self) -> &[Vec>]; + + /// Returns the cryptocurrencies whose balances are in the tree. The order of cryptocurrencies and balances is supposed to agree for all the entries. + fn cryptocurrencies(&self) -> &[Cryptocurrency]; + + fn get_entry(&self, index: usize) -> &Entry; + + /// Returns the hash preimage of a middle node. + fn get_middle_node_hash_preimage( + &self, + level: usize, + index: usize, + ) -> Result<[Fp; N_CURRENCIES + 2], Box> + where + [usize; N_CURRENCIES + 2]: Sized, + { + if level == 0 || level > *self.depth() { + return Err(Box::from("Invalid depth")); + } + + self.nodes() + .get(level) + .and_then(|layer| layer.get(index)) + .ok_or_else(|| Box::::from("Node not found"))?; + + // Assuming the left and right children are stored in order + let left_child = &self.nodes()[level - 1][2 * index]; + let right_child = &self.nodes()[level - 1][2 * index + 1]; + + // Constructing preimage + let mut preimage = [Fp::zero(); N_CURRENCIES + 2]; + + // for each balance in the left and right child, add them together and store in preimage + for (i, balance) in preimage.iter_mut().enumerate().take(N_CURRENCIES) { + *balance = left_child.balances[i] + right_child.balances[i]; + } + + // Add left and right child hashes to preimage + preimage[N_CURRENCIES] = left_child.hash; + preimage[N_CURRENCIES + 1] = right_child.hash; + + Ok(preimage) + } + + /// Returns the hash preimage of a leaf node. + fn get_leaf_node_hash_preimage( + &self, + index: usize, + ) -> Result<[Fp; N_CURRENCIES + 1], Box> + where + [usize; N_CURRENCIES + 1]: Sized, + { + // Fetch entry corresponding to index + let entry = self.get_entry(index); + + // Constructing preimage + let mut preimage = [Fp::zero(); N_CURRENCIES + 1]; + + // Add username to preimage + preimage[0] = big_uint_to_fp(entry.username_as_big_uint()); + + // Add balances to preimage + for (i, balance) in preimage.iter_mut().enumerate().skip(1).take(N_CURRENCIES) { + *balance = big_uint_to_fp(&entry.balances()[i - 1]); + } + + Ok(preimage) + } + + /// Generates a MerkleProof for the user with the given index. + fn generate_proof( + &self, + index: usize, + ) -> Result, Box> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + let nodes = self.nodes(); + let depth = *self.depth(); + let root = self.root(); + + if index >= nodes[0].len() { + return Err(Box::from("Index out of bounds")); + } + + let mut sibling_middle_node_hash_preimages = Vec::with_capacity(depth - 1); + + let sibling_leaf_index = if index % 2 == 0 { index + 1 } else { index - 1 }; + + let sibling_leaf_node_hash_preimage: [Fp; N_CURRENCIES + 1] = + self.get_leaf_node_hash_preimage(sibling_leaf_index)?; + let mut path_indices = vec![Fp::zero(); depth]; + let mut current_index = index; + + for level in 0..depth { + let position = current_index % 2; + let sibling_index = current_index - position + (1 - position); + + if sibling_index < nodes[level].len() && level != 0 { + // Fetch hash preimage for sibling middle nodes + let sibling_node_preimage = + self.get_middle_node_hash_preimage(level, sibling_index)?; + sibling_middle_node_hash_preimages.push(sibling_node_preimage); + } + + path_indices[level] = Fp::from(position as u64); + current_index /= 2; + } + + let entry = self.get_entry(index).clone(); + + Ok(MerkleProof { + entry, + root: root.clone(), + sibling_leaf_node_hash_preimage, + sibling_middle_node_hash_preimages, + path_indices, + }) + } + + /// Verifies a MerkleProof. + fn verify_proof(&self, proof: &MerkleProof) -> bool + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + let mut node = proof.entry.compute_leaf(); + + let sibling_leaf_node = + Node::::leaf_node_from_preimage(&proof.sibling_leaf_node_hash_preimage); + + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_CURRENCIES) { + *balance = node.balances[i] + sibling_leaf_node.balances[i]; + } + + if proof.path_indices[0] == 0.into() { + hash_preimage[N_CURRENCIES] = node.hash; + hash_preimage[N_CURRENCIES + 1] = sibling_leaf_node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } else { + hash_preimage[N_CURRENCIES] = sibling_leaf_node.hash; + hash_preimage[N_CURRENCIES + 1] = node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } + + for i in 1..proof.path_indices.len() { + let sibling_node = Node::::middle_node_from_preimage( + &proof.sibling_middle_node_hash_preimages[i - 1], + ); + + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_CURRENCIES) { + *balance = node.balances[i] + sibling_node.balances[i]; + } + + if proof.path_indices[i] == 0.into() { + hash_preimage[N_CURRENCIES] = node.hash; + hash_preimage[N_CURRENCIES + 1] = sibling_node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } else { + hash_preimage[N_CURRENCIES] = sibling_node.hash; + hash_preimage[N_CURRENCIES + 1] = node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } + } + + proof.root.hash == node.hash && proof.root.balances == node.balances + } +} diff --git a/zk_prover/src/merkle_sum_tree/utils/build_tree.rs b/zk_prover/src/merkle_sum_tree/utils/build_tree.rs index c3e1741f..813b4914 100644 --- a/zk_prover/src/merkle_sum_tree/utils/build_tree.rs +++ b/zk_prover/src/merkle_sum_tree/utils/build_tree.rs @@ -2,23 +2,23 @@ use crate::merkle_sum_tree::{Entry, Node}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use rayon::prelude::*; -pub fn build_merkle_tree_from_entries( - entries: &[Entry], +pub fn build_merkle_tree_from_leaves( + leaves: &[Node], depth: usize, - nodes: &mut Vec>>, -) -> Result, Box> + nodes: &mut Vec>>, +) -> Result, Box> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - let n = entries.len(); + let n = leaves.len(); - let mut tree: Vec>> = Vec::with_capacity(depth + 1); + let mut tree: Vec>> = Vec::with_capacity(depth + 1); tree.push(vec![ Node { hash: Fp::from(0), - balances: [Fp::from(0); N_ASSETS] + balances: [Fp::from(0); N_CURRENCIES] }; n ]); @@ -30,13 +30,15 @@ where tree.push(vec![ Node { hash: Fp::from(0), - balances: [Fp::from(0); N_ASSETS] + balances: [Fp::from(0); N_CURRENCIES] }; nodes_in_level ]); } - build_leaves_level(entries, &mut tree); + for (index, leaf) in leaves.iter().enumerate() { + tree[0][index] = leaf.clone(); + } for level in 1..=depth { build_middle_level(level, &mut tree) @@ -47,30 +49,50 @@ where Ok(root) } -fn build_leaves_level( - entries: &[Entry], - tree: &mut [Vec>], -) where - [usize; N_ASSETS + 1]: Sized, +pub fn build_leaves_from_entries( + entries: &[Entry], +) -> Vec> +where + [usize; N_CURRENCIES + 1]: Sized, { - let results = entries + // Precompute the zero leaf (this will only be used if we encounter a zero entry) + let zero_leaf = Entry::::zero_entry().compute_leaf(); + + let leaves = entries .par_iter() - .map(|entry| entry.compute_leaf()) + .map(|entry| { + // If the entry is the zero entry then we return the precomputed zero leaf + // Otherwise, we compute the leaf as usual + if entry == &Entry::::zero_entry() { + zero_leaf.clone() + } else { + entry.compute_leaf() + } + }) .collect::>(); - for (index, node) in results.iter().enumerate() { - tree[0][index] = node.clone(); - } + leaves } -fn build_middle_level(level: usize, tree: &mut [Vec>]) +fn build_middle_level(level: usize, tree: &mut [Vec>]) where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { - let results: Vec> = (0..tree[level - 1].len()) + let results: Vec> = (0..tree[level - 1].len()) .into_par_iter() .step_by(2) - .map(|index| Node::middle(&tree[level - 1][index], &tree[level - 1][index + 1])) + .map(|index| { + let mut hash_preimage = [Fp::zero(); N_CURRENCIES + 2]; + + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_CURRENCIES) { + *balance = + tree[level - 1][index].balances[i] + tree[level - 1][index + 1].balances[i]; + } + + hash_preimage[N_CURRENCIES] = tree[level - 1][index].hash; + hash_preimage[N_CURRENCIES + 1] = tree[level - 1][index + 1].hash; + Node::middle_node_from_preimage(&hash_preimage) + }) .collect(); for (index, new_node) in results.into_iter().enumerate() { diff --git a/zk_prover/src/merkle_sum_tree/utils/create_proof.rs b/zk_prover/src/merkle_sum_tree/utils/create_proof.rs deleted file mode 100644 index 600ae88a..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/create_proof.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; -use halo2_proofs::halo2curves::bn256::Fr as Fp; - -pub fn create_proof( - index: usize, - entries: &[Entry], - depth: usize, - nodes: &[Vec>], - root: &Node, -) -> Result, &'static str> { - if index >= nodes[0].len() { - return Err("The leaf does not exist in this tree"); - } - - let mut sibling_hashes = vec![Fp::from(0); depth]; - let mut sibling_sums = vec![[Fp::from(0); N_ASSETS]; depth]; - let mut path_indices = vec![Fp::from(0); depth]; - let mut current_index = index; - - for level in 0..depth { - let position = current_index % 2; - let level_start_index = current_index - position; - let level_end_index = level_start_index + 2; - - path_indices[level] = Fp::from(position as u64); - - for i in level_start_index..level_end_index { - if i != current_index { - sibling_hashes[level] = nodes[level][i].hash; - sibling_sums[level] = nodes[level][i].balances; - } - } - current_index /= 2; - } - - Ok(MerkleProof { - root_hash: root.hash, - entry: entries[index].clone(), - sibling_hashes, - sibling_sums, - path_indices, - }) -} diff --git a/zk_prover/src/merkle_sum_tree/utils/csv_parser.rs b/zk_prover/src/merkle_sum_tree/utils/csv_parser.rs index 75bb39a6..5df9c446 100644 --- a/zk_prover/src/merkle_sum_tree/utils/csv_parser.rs +++ b/zk_prover/src/merkle_sum_tree/utils/csv_parser.rs @@ -1,39 +1,55 @@ -use crate::merkle_sum_tree::Entry; +use crate::merkle_sum_tree::{Cryptocurrency, Entry}; use num_bigint::BigUint; -use serde::Deserialize; +use std::collections::HashMap; use std::error::Error; use std::fs::File; use std::path::Path; -#[derive(Debug, Deserialize)] -struct CsvEntry { - username: String, - balances: String, -} - -/// Parses a CSV file stored at path into a vector of Entries -pub fn parse_csv_to_entries, const N_ASSETS: usize, const N_BYTES: usize>( +pub fn parse_csv_to_entries, const N_CURRENCIES: usize, const N_BYTES: usize>( path: P, -) -> Result>, Box> { - let mut entries = Vec::new(); +) -> Result<(Vec, Vec>), Box> { let file = File::open(path)?; - let mut rdr = csv::ReaderBuilder::new() - .delimiter(b';') // The fields are separated by a semicolon - .from_reader(file); + let mut rdr = csv::ReaderBuilder::new().from_reader(file); - let mut balances_acc: Vec = vec![BigUint::from(0 as usize); N_ASSETS]; + let headers = rdr.headers()?.clone(); + let mut cryptocurrencies: Vec = Vec::with_capacity(N_CURRENCIES); - for result in rdr.deserialize() { - let record: CsvEntry = result?; + // Extracting cryptocurrency names from column names + for header in headers.iter().skip(1) { + // Skipping 'username' column + let parts: Vec<&str> = header.split('_').collect(); + if parts.len() == 3 && parts[0] == "balance" { + cryptocurrencies.push(Cryptocurrency { + name: parts[1].to_owned(), + chain: parts[2].to_owned(), + }); + } else { + // Throw an error if the header is malformed + return Err(format!("Invalid header: {}", header).into()); + } + } + + let mut entries = Vec::new(); + let mut balances_acc: Vec = vec![BigUint::from(0_usize); N_CURRENCIES]; - // Split the balances string into separate balance strings - let balance_strs: Vec<&str> = record.balances.split(',').collect(); + for result in rdr.deserialize() { + let record: HashMap = result?; + let username = record.get("username").ok_or("Username not found")?.clone(); - // Parse each balance string as a BigUint - let balances_big_int: Vec = balance_strs - .into_iter() - .map(|balance_str| BigUint::parse_bytes(balance_str.as_bytes(), 10).unwrap()) - .collect(); + let mut balances_big_int = Vec::new(); + for cryptocurrency in &cryptocurrencies { + let balance_str = record + .get(format!("balance_{}_{}", cryptocurrency.name, cryptocurrency.chain).as_str()) + .ok_or(format!( + "Balance for {} on {} not found", + cryptocurrency.name, cryptocurrency.chain + ))?; + let balance = BigUint::parse_bytes(balance_str.as_bytes(), 10).ok_or(format!( + "Invalid balance for {} on {}", + cryptocurrency.name, cryptocurrency.chain + ))?; + balances_big_int.push(balance); + } balances_acc = balances_acc .iter() @@ -41,19 +57,9 @@ pub fn parse_csv_to_entries, const N_ASSETS: usize, const N_BYTES .map(|(x, y)| x + y) .collect(); - let entry = Entry::new(record.username, balances_big_int.try_into().unwrap())?; + let entry = Entry::new(username, balances_big_int.try_into().unwrap())?; entries.push(entry); } - // Iterate through the balance accumulator and throw error if any balance is not in range 0, 2 ^ (8 * N_BYTES): - for balance in balances_acc { - if balance >= BigUint::from(2 as usize).pow(8 * N_BYTES as u32) { - return Err( - "Accumulated balance is not in the expected range, proof generation will fail!" - .into(), - ); - } - } - - Ok(entries) + Ok((cryptocurrencies, entries)) } diff --git a/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs b/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs deleted file mode 100644 index 13b264ba..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs +++ /dev/null @@ -1,19 +0,0 @@ -use ethers::types::U256; -use num_bigint::BigUint; - -use crate::merkle_sum_tree::Entry; - -pub fn generate_leaf_hash(user_name: String, balances: Vec) -> U256 -where - [usize; N_ASSETS + 1]: Sized, -{ - // Convert usize to BigInt for the `Entry` struct - let balances_big_uint: Vec = balances.into_iter().map(BigUint::from).collect(); - - let entry: Entry = - Entry::new(user_name, balances_big_uint.try_into().unwrap()).unwrap(); - - // Convert Fp to U256 - let hash_str = format!("{:?}", entry.compute_leaf().hash); - U256::from_str_radix(&hash_str, 16).unwrap() -} diff --git a/zk_prover/src/merkle_sum_tree/utils/hash.rs b/zk_prover/src/merkle_sum_tree/utils/hash.rs deleted file mode 100644 index bb9b0640..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/hash.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::chips::poseidon::poseidon_spec::PoseidonSpec; -use halo2_gadgets::poseidon::primitives::{self as poseidon, ConstantLength}; -use halo2_proofs::halo2curves::bn256::Fr as Fp; - -pub fn poseidon_node( - l1: Fp, - l2: [Fp; N_ASSETS], - r1: Fp, - r2: [Fp; N_ASSETS], -) -> Fp -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - let mut hash_inputs: [Fp; 2 * (1 + N_ASSETS)] = [Fp::zero(); 2 * (1 + N_ASSETS)]; - - hash_inputs[0] = l1; - hash_inputs[1..N_ASSETS + 1].copy_from_slice(&l2); - hash_inputs[N_ASSETS + 1] = r1; - hash_inputs[N_ASSETS + 2..2 * N_ASSETS + 2].copy_from_slice(&r2); - - poseidon::Hash::, 2, 1>::init() - .hash(hash_inputs) -} - -pub fn poseidon_entry(left: Fp, right: [Fp; N_ASSETS]) -> Fp -where - [usize; N_ASSETS + 1]: Sized, -{ - let mut hash_inputs: [Fp; N_ASSETS + 1] = [Fp::zero(); N_ASSETS + 1]; - - hash_inputs[0] = left; - hash_inputs[1..N_ASSETS + 1].copy_from_slice(&right); - - poseidon::Hash::, 2, 1>::init() - .hash(hash_inputs) -} diff --git a/zk_prover/src/merkle_sum_tree/utils/index_of.rs b/zk_prover/src/merkle_sum_tree/utils/index_of.rs deleted file mode 100644 index 5ef7f191..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/index_of.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::merkle_sum_tree::{Entry, Node}; -use num_bigint::BigUint; - -pub fn index_of( - username: &str, - balances: [BigUint; N_ASSETS], - nodes: &[Vec>], -) -> Option -where - [usize; N_ASSETS + 1]: Sized, -{ - let entry: Entry = Entry::new(username.to_string(), balances).unwrap(); - let leaf = entry.compute_leaf(); - let leaf_hash = leaf.hash; - - nodes[0].iter().position(|node| node.hash == leaf_hash) -} diff --git a/zk_prover/src/merkle_sum_tree/utils/mod.rs b/zk_prover/src/merkle_sum_tree/utils/mod.rs index e759def0..c4f0a33e 100644 --- a/zk_prover/src/merkle_sum_tree/utils/mod.rs +++ b/zk_prover/src/merkle_sum_tree/utils/mod.rs @@ -1,17 +1,7 @@ mod build_tree; -mod create_proof; mod csv_parser; -mod generate_leaf_hash; -mod hash; -mod index_of; mod operation_helpers; -mod proof_verification; -pub use build_tree::build_merkle_tree_from_entries; -pub use create_proof::create_proof; +pub use build_tree::{build_leaves_from_entries, build_merkle_tree_from_leaves}; pub use csv_parser::parse_csv_to_entries; -pub use generate_leaf_hash::generate_leaf_hash; -pub use hash::{poseidon_entry, poseidon_node}; -pub use index_of::index_of; pub use operation_helpers::*; -pub use proof_verification::verify_proof; diff --git a/zk_prover/src/merkle_sum_tree/utils/proof_verification.rs b/zk_prover/src/merkle_sum_tree/utils/proof_verification.rs deleted file mode 100644 index 78c6ec72..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/proof_verification.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::merkle_sum_tree::utils::big_uint_to_fp; -use crate::merkle_sum_tree::{MerkleProof, Node}; -use halo2_proofs::halo2curves::bn256::Fr as Fp; - -pub fn verify_proof(proof: &MerkleProof) -> bool -where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - let mut node = proof.entry.compute_leaf(); - let mut balances = proof - .entry - .balances() - .iter() - .map(big_uint_to_fp) - .collect::>(); - - for i in 0..proof.sibling_hashes.len() { - let sibling_node = Node { - hash: proof.sibling_hashes[i], - balances: proof.sibling_sums[i], - }; - - if proof.path_indices[i] == 0.into() { - node = Node::middle(&node, &sibling_node); - } else { - node = Node::middle(&sibling_node, &node); - } - - for (balance, sibling_balance) in balances.iter_mut().zip(sibling_node.balances.iter()) { - *balance += sibling_balance; - } - } - - proof.root_hash == node.hash && balances == node.balances -}