diff --git a/.env.example b/.env.example index 99b3e20..0f45960 100644 --- a/.env.example +++ b/.env.example @@ -3,8 +3,8 @@ export APTOS_PRIVATE_KEY="0x3d31ef06ed8003c3a85125b6e6287967a7b80a3e4367ccf2649e export APTOS_MODULE_ADDRESS="852578629621677c02f4b9679622f25cac00b4fe17d1fd8b197ba52a2627ee3b" export CHAIN_ID="testnet" -export APTOS_TESTCONTAINER__ACCOUNTS="0xe47491c27051639d2bc0167af9370dd39f6df3479edfb51658a2eb0a16239cf6,0xdbba3d6050eab8b8683598fad3f80ba1282664a9fca018d629fe883e59889241" -export APTOS_TESTCONTAINER__NODE_URL="https://api.testnet.aptoslabs.com/v1" -export APTOS_TESTCONTAINER__ENABLE_NODE=true +export APTOS_TESTCONTAINER__ACCOUNTS="0xb6c8ce69f296d08fc217b953c7fba5eb25fe14ce0c764b1360ddea4e7e21470a,0x054031364b8a623c093277d30ce9fefe0df363226c23b1cb130d6382f4a1162a" +export APTOS_TESTCONTAINER__NODE_URL="http://10.20.21.121:8888" +export APTOS_TESTCONTAINER__ENABLE_NODE=false export APTOS_TESTCONTAINER__DEPLOY_CONTRACT=true -export APTOS_TESTCONTAINER__CHAIN_ID=2 \ No newline at end of file +export APTOS_TESTCONTAINER__CHAIN_ID=4 \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4474f6c..5608f82 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -46,6 +46,7 @@ jobs: test-and-coverage: name: Test and Coverage runs-on: ubuntu-latest + timeout-minutes: 25 steps: - uses: actions/checkout@v4 with: @@ -58,4 +59,4 @@ jobs: - name: Set PKG_CONFIG_PATH run: echo "PKG_CONFIG_PATH=/usr/lib/pkgconfig" >> $GITHUB_ENV - name: Run tests - run: cargo tarpaulin --all-features --verbose --tests --skip-clean + run: cargo tarpaulin --all-features --verbose --tests --skip-clean --timeout 600 diff --git a/Cargo.lock b/Cargo.lock index 21daf39..59b6d12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -380,10 +380,10 @@ dependencies = [ "blst", "bulletproofs", "bytes", - "curve25519-dalek", + "curve25519-dalek 3.2.0", "curve25519-dalek-ng", "digest 0.9.0", - "ed25519-dalek", + "ed25519-dalek 1.0.1", "ff", "hex", "hkdf 0.10.0", @@ -985,18 +985,22 @@ dependencies = [ [[package]] name = "aptos-testcontainer" -version = "0.1.0" -source = "git+https://github.com/sota-zk-labs/aptos-testcontainer.git?tag=v0.0.3#2e2887fbcabaf0e22f5d5f79df2285daec9096a3" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aebc3c0e8d108bb2629c707b2821fd879ce043e18857f171db768982bf29600" dependencies = [ "anyhow", "base64 0.22.1", "config", + "ed25519-dalek 2.1.1", + "hex", "log", "rand 0.8.5", "regex", "serde", "testcontainers", "thiserror", + "tiny-keccak", "tokio", "walkdir", ] @@ -2557,6 +2561,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.76", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -2807,14 +2838,24 @@ dependencies = [ "signature 1.6.4", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature 2.2.0", +] + [[package]] name = "ed25519-dalek" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", "rand 0.7.3", "serde", "serde_bytes", @@ -2822,6 +2863,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "ed25519-dalek-bip32" version = "0.2.0" @@ -2829,7 +2884,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" dependencies = [ "derivation-path", - "ed25519-dalek", + "ed25519-dalek 1.0.1", "hmac 0.12.1", "sha2 0.10.8", ] @@ -2979,6 +3034,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "fixed" version = "1.28.0" @@ -7348,9 +7409,9 @@ dependencies = [ [[package]] name = "testcontainers" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d80fe0008971413157e67062150cbf508b92f0eb525b9f49de1aec4267f24" +checksum = "2ef8374cea2c164699681ecc39316c3e1d953831a7a5721e36c7736d974e15fa" dependencies = [ "async-trait", "bollard", @@ -7529,9 +7590,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -8568,7 +8629,7 @@ name = "x25519-dalek" version = "1.2.0" source = "git+https://github.com/Tranduy1dol/x25519-dalek?branch=zeroize_v1.7#d98aca90959611359089b2194874faa200d55977" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 3.2.0", "rand_core 0.5.1", "zeroize", ] diff --git a/Cargo.toml b/Cargo.toml index 68f3711..774451b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,7 @@ tokio = { version = "1.39.3", features = ["macros", "rt-multi-thread"] } url = { version = "2.4.0", features = ["serde"] } [dev-dependencies] -aptos-testcontainer = { git = "https://github.com/sota-zk-labs/aptos-testcontainer.git", tag = "v0.0.3", features = [ - "testing", -] } +aptos-testcontainer = { version = "0.1.2", features = ["testing"] } [patch.crates-io] merlin = { git = "https://github.com/aptos-labs/merlin" } diff --git a/contracts/navori b/contracts/navori index d653951..c071c5f 160000 --- a/contracts/navori +++ b/contracts/navori @@ -1 +1 @@ -Subproject commit d6539515cd0a9b841461c57e9319930089a0dbec +Subproject commit c071c5f87cf7408c549d2ac7b4aba60fab7a5525 diff --git a/src/contracts_caller/gps/mod.rs b/src/contracts_caller/gps/mod.rs new file mode 100644 index 0000000..fe11730 --- /dev/null +++ b/src/contracts_caller/gps/mod.rs @@ -0,0 +1,2 @@ +pub mod types; +pub mod verify_proof_and_register; diff --git a/src/contracts_caller/gps/types/mod.rs b/src/contracts_caller/gps/types/mod.rs new file mode 100644 index 0000000..b282889 --- /dev/null +++ b/src/contracts_caller/gps/types/mod.rs @@ -0,0 +1 @@ +pub mod verify_proof_and_register; diff --git a/src/contracts_caller/gps/types/verify_proof_and_register.rs b/src/contracts_caller/gps/types/verify_proof_and_register.rs new file mode 100644 index 0000000..2f5bb40 --- /dev/null +++ b/src/contracts_caller/gps/types/verify_proof_and_register.rs @@ -0,0 +1,58 @@ +use std::str::FromStr; + +use aptos_sdk::move_types::u256::U256; +use serde::Deserialize; + +#[derive(Debug)] +pub struct VerifyProofAndRegisterData { + pub proof_params: Vec, + pub proof: Vec, + pub task_metadata: Vec, + pub cairo_aux_input: Vec, + pub cairo_verifier_id: U256, + pub pre_registered_facts: Vec, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VerifyProofAndRegisterDataJson { + pub proof_params: Vec, + pub proof: Vec, + pub task_metadata: Vec, + pub cairo_aux_input: Vec, + pub cairo_verifier_id: String, + pub pre_registered_facts: Vec, +} + +impl From for VerifyProofAndRegisterData { + fn from(value: VerifyProofAndRegisterDataJson) -> Self { + VerifyProofAndRegisterData { + proof_params: value + .proof_params + .iter() + .map(|x| U256::from_str(x).unwrap()) + .collect(), + proof: value + .proof + .iter() + .map(|x| U256::from_str(x).unwrap()) + .collect(), + task_metadata: value + .task_metadata + .iter() + .map(|x| U256::from_str(x).unwrap()) + .collect(), + cairo_aux_input: value + .cairo_aux_input + .iter() + .map(|x| U256::from_str(x).unwrap()) + .collect(), + cairo_verifier_id: U256::from_str(value.cairo_verifier_id.as_str()).unwrap(), + pre_registered_facts: value + .pre_registered_facts + .iter() + .map(|x| U256::from_str(x).unwrap()) + .collect(), + } + } +} diff --git a/src/contracts_caller/gps/verify_proof_and_register.rs b/src/contracts_caller/gps/verify_proof_and_register.rs new file mode 100644 index 0000000..a4afbba --- /dev/null +++ b/src/contracts_caller/gps/verify_proof_and_register.rs @@ -0,0 +1,157 @@ +use std::str::FromStr; + +use anyhow::ensure; +use aptos_sdk::move_types::identifier::Identifier; +use aptos_sdk::move_types::language_storage::ModuleId; +use aptos_sdk::move_types::value::{serialize_values, MoveValue}; +use aptos_sdk::rest_client::aptos_api_types::MoveType; +use aptos_sdk::rest_client::error::RestError; +use aptos_sdk::types::transaction::{EntryFunction, TransactionPayload}; +use log::{debug, info}; + +use crate::config::AppConfig; +use crate::contracts_caller::gps::types::verify_proof_and_register::VerifyProofAndRegisterData; +use crate::contracts_caller::transaction_helper::{build_transaction, get_event_from_transaction}; +use crate::error::CoreError::{FlowNotFinished, TransactionNotSucceed}; + +pub async fn verify_proof_and_register( + config: &AppConfig, + data: &VerifyProofAndRegisterData, +) -> anyhow::Result<()> { + let module_name = "gps_statement_verifier"; + let mut txs = vec![]; + + // Register facts transaction + let payload = TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new(config.module_address, Identifier::new("fact_registry")?), + Identifier::new("register_facts")?, + vec![], + serialize_values(&vec![MoveValue::Vector( + data.pre_registered_facts + .iter() + .map(|v| MoveValue::U256(*v)) + .collect(), + )]), + )); + let tx = build_transaction(payload, &config.account, config.chain_id); + txs.push(("register_facts".to_string(), tx)); + + // Prepush task metadata transaction + let payload = TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new(config.module_address, Identifier::new(module_name)?), + Identifier::new("prepush_task_metadata")?, + vec![], + serialize_values(&vec![MoveValue::Vector( + data.task_metadata + .iter() + .map(|v| MoveValue::U256(*v)) + .collect(), + )]), + )); + let tx = build_transaction(payload, &config.account, config.chain_id); + txs.push(("prepush_task_metadata".to_string(), tx)); + + // Prepush data to verify proof and register transaction + let payload = TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new(config.module_address, Identifier::new(module_name)?), + Identifier::new("prepush_data_to_verify_proof_and_register")?, + vec![], + serialize_values(&vec![ + MoveValue::Vector( + data.proof_params + .iter() + .map(|v| MoveValue::U256(*v)) + .collect(), + ), + MoveValue::Vector(data.proof.iter().map(|v| MoveValue::U256(*v)).collect()), + MoveValue::Vector( + data.cairo_aux_input + .iter() + .map(|v| MoveValue::U256(*v)) + .collect(), + ), + MoveValue::U256(data.cairo_verifier_id), + ]), + )); + let tx = build_transaction(payload, &config.account, config.chain_id); + txs.push(("prepush_data_to_verify_proof_and_register".to_string(), tx)); + + // Verify_proof_and_register + for cnt_loop in 1..10 { + debug!("verify_proof_and_register {}", cnt_loop); + let payload = TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new(config.module_address, Identifier::new(module_name)?), + Identifier::new("verify_proof_and_register")?, + vec![], + serialize_values(&vec![]), + )); + let tx = build_transaction(payload, &config.account, config.chain_id); + txs.push((format!("verify_proof_and_register {}", cnt_loop), tx)); + } + + let pending_transactions = txs + .into_iter() + .map(|(name, transaction)| { + let client = config.client.clone(); + tokio::spawn(async move { + let init_transaction = client.submit(&transaction).await?.into_inner(); + debug!("sent {} hash = {}", name, init_transaction.hash.to_string()); + Ok::<_, RestError>((name, init_transaction)) + }) + }) + .collect::>(); + + let mut results = Vec::with_capacity(pending_transactions.len()); + for handle in pending_transactions { + results.push(handle.await??); + } + + let results = results + .into_iter() + .map(|(name, pending_transaction)| { + let client = config.client.clone(); + tokio::spawn(async move { + let transaction = client + .wait_for_transaction(&pending_transaction) + .await? + .into_inner(); + Ok::<_, anyhow::Error>((name, transaction)) + }) + }) + .collect::>(); + + let mut transactions = Vec::with_capacity(results.len()); + for handle in results { + let (name, transaction) = handle.await??; + let transaction_info = transaction.transaction_info()?; + ensure!( + transaction_info.success, + TransactionNotSucceed(format!("{}; hash: {}", name, transaction_info.hash)) + ); + info!( + "{} finished: id={}; hash={}; gas={}", + name, + transaction_info.version, + transaction_info.hash.to_string(), + transaction_info.gas_used, + ); + transactions.push(transaction); + } + + let last_transaction = transactions.last().unwrap(); + + // Get the event from the last transaction + let event = get_event_from_transaction( + last_transaction, + MoveType::from_str(&format!( + "{}::{}::VparFinished", + config.module_address, module_name + ))?, + ); + ensure!( + event.is_ok(), + FlowNotFinished("verify_proof_and_register".to_string()) + ); + + Ok(()) +} diff --git a/src/contracts_caller/memory_page_fact_registry/register_continuous_memory_page.rs b/src/contracts_caller/memory_page_fact_registry/register_continuous_memory_page.rs index e6d4733..6f33d2d 100644 --- a/src/contracts_caller/memory_page_fact_registry/register_continuous_memory_page.rs +++ b/src/contracts_caller/memory_page_fact_registry/register_continuous_memory_page.rs @@ -32,14 +32,14 @@ pub async fn register_continuous_memory_page( MoveValue::Vector(values), MoveValue::U256(U256::from_str(&data.z)?), MoveValue::U256(U256::from_str(&data.alpha)?), - MoveValue::U256(U256::from_str(&data.prime)?), ]), )); let tx = build_transaction(payload, &config.account, config.chain_id); let transaction = config.client.submit_and_wait(&tx).await?.into_inner(); let transaction_info = transaction.transaction_info()?; info!( - "register_continuous_memory_page: {}; gas used: {}", + "register_continuous_memory_page finished: id={}; hash={}; gas={}", + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used ); diff --git a/src/contracts_caller/memory_page_fact_registry/register_continuous_page_batch.rs b/src/contracts_caller/memory_page_fact_registry/register_continuous_page_batch.rs index 8eac775..21a8776 100644 --- a/src/contracts_caller/memory_page_fact_registry/register_continuous_page_batch.rs +++ b/src/contracts_caller/memory_page_fact_registry/register_continuous_page_batch.rs @@ -21,17 +21,10 @@ pub async fn register_continuous_page_batch( config: &AppConfig, data: MemoryPageEntries, ) -> anyhow::Result<()> { - let ContinuousMemoryPage { - z, - alpha, - prime, - values: _, - start_addr: _, - } = data.memory_page_entries.first().unwrap(); + let ContinuousMemoryPage { z, alpha, .. } = data.memory_page_entries.first().unwrap(); let z = MoveValue::U256(U256::from_str(z)?); let alpha = MoveValue::U256(U256::from_str(alpha)?); - let prime = MoveValue::U256(U256::from_str(prime)?); let mut converted_data = data .memory_page_entries @@ -55,7 +48,7 @@ pub async fn register_continuous_page_batch( (vec![], vec![], 0), |(mut chunks, mut cur_el, mut cur_value_len), (start_addr, values_len, values)| { let new_value_len = cur_value_len + values_len; - if cur_el.len() == 0 { + if cur_el.is_empty() { cur_el.push((start_addr, values)); cur_value_len += values_len; return (chunks, cur_el, cur_value_len); @@ -74,13 +67,12 @@ pub async fn register_continuous_page_batch( }, ); - if cur_el.len() != 0 { + if !cur_el.is_empty() { chunks.push(cur_el); } let txs = chunks.into_iter().enumerate().map(|(i, chunk)| { let (chunk_start_addr, chunk_values): (Vec<_>, Vec<_>) = chunk.into_iter().unzip(); - let payload = TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( config.module_address, @@ -93,14 +85,10 @@ pub async fn register_continuous_page_batch( MoveValue::Vector(chunk_values), z.clone(), alpha.clone(), - prime.clone(), ]), )); let tx = build_transaction(payload, &config.account, config.chain_id); - ( - format!("register_continuous_memory_page_batch_{}", i).to_string(), - tx, - ) + (format!("register_continuous_memory_page_batch_{}", i), tx) }); let pending_transactions = txs @@ -136,13 +124,12 @@ pub async fn register_continuous_page_batch( let transaction_info = transaction.transaction_info()?; ensure!( transaction_info.success, - TransactionNotSucceed( - format!("{}; hash: {}", name, transaction_info.hash).to_string() - ) + TransactionNotSucceed(format!("{}; hash: {}", name, transaction_info.hash)) ); info!( - "{}: {}; gas used: {}", + "{} finished: id={}; hash={}; gas={}", name, + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used, ); diff --git a/src/contracts_caller/mod.rs b/src/contracts_caller/mod.rs index d39c262..992bbdd 100644 --- a/src/contracts_caller/mod.rs +++ b/src/contracts_caller/mod.rs @@ -1,3 +1,4 @@ +pub mod gps; pub mod memory_page_fact_registry; pub mod transaction_helper; pub mod types; diff --git a/src/contracts_caller/transaction_helper.rs b/src/contracts_caller/transaction_helper.rs index 9f7df13..7c6da17 100644 --- a/src/contracts_caller/transaction_helper.rs +++ b/src/contracts_caller/transaction_helper.rs @@ -40,7 +40,7 @@ pub fn build_transaction( ) .sender(sender.address()) .sequence_number(i) - .max_gas_amount(30000) + .max_gas_amount(200000) .gas_unit_price(100) .build(); sender.sign_transaction(tx) diff --git a/src/contracts_caller/verify_fri/compute_next_layer.rs b/src/contracts_caller/verify_fri/compute_next_layer.rs index f26ce91..62fade8 100644 --- a/src/contracts_caller/verify_fri/compute_next_layer.rs +++ b/src/contracts_caller/verify_fri/compute_next_layer.rs @@ -30,7 +30,8 @@ pub async fn compute_next_layer( let transaction = config.client.submit_and_wait(&tx).await?.into_inner(); let transaction_info = transaction.transaction_info()?; info!( - "finished compute next layer {}; gas used: {}", + "compute_next_layer finished: id={}; hash={}; gas={}", + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used ); diff --git a/src/contracts_caller/verify_fri/init_fri_group.rs b/src/contracts_caller/verify_fri/init_fri_group.rs index e3258cd..cd0972f 100644 --- a/src/contracts_caller/verify_fri/init_fri_group.rs +++ b/src/contracts_caller/verify_fri/init_fri_group.rs @@ -23,10 +23,10 @@ pub async fn init_fri_group(config: &AppConfig, data: InitFriGroup) -> anyhow::R .into_inner() .transaction_info()? .clone(); - let txd = transaction_info.hash; info!( - "init fri group {}; gas used {}", - txd.clone(), + "init_fri_group finished: id={}; hash={}; gas={}", + transaction_info.version, + transaction_info.hash.to_string(), transaction_info.gas_used ); Ok(transaction_info.success) diff --git a/src/contracts_caller/verify_fri/merkle_verifier.rs b/src/contracts_caller/verify_fri/merkle_verifier.rs index 7534455..cbb3fb0 100644 --- a/src/contracts_caller/verify_fri/merkle_verifier.rs +++ b/src/contracts_caller/verify_fri/merkle_verifier.rs @@ -26,7 +26,8 @@ pub async fn merkle_verifier(config: &AppConfig, data: &VerifyMerkle) -> anyhow: let transaction = config.client.submit_and_wait(&tx).await?.into_inner(); let transaction_info = transaction.transaction_info()?; info!( - "finished verify_merkle {}; gas used: {}", + "verify_merkle finished: id={}; hash={}; gas={}", + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used ); diff --git a/src/contracts_caller/verify_fri/register_fact_fri.rs b/src/contracts_caller/verify_fri/register_fact_fri.rs index c6a4320..32833b5 100644 --- a/src/contracts_caller/verify_fri/register_fact_fri.rs +++ b/src/contracts_caller/verify_fri/register_fact_fri.rs @@ -31,7 +31,8 @@ pub async fn register_fact_fri( let transaction_status = transaction.success(); let transaction_info = transaction.transaction_info()?; info!( - "finished register_fact_verify_fri {}; gas used: {}", + "register_fact_verify_fri finished: id={}; hash={}; gas={}", + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used ); diff --git a/src/contracts_caller/verify_merkle/merkle_statement.rs b/src/contracts_caller/verify_merkle/merkle_statement.rs index e91291b..6398785 100644 --- a/src/contracts_caller/verify_merkle/merkle_statement.rs +++ b/src/contracts_caller/verify_merkle/merkle_statement.rs @@ -35,7 +35,8 @@ pub async fn verify_merkle_statement( let transaction = config.client.submit_and_wait(&tx).await?.into_inner(); let transaction_info = transaction.transaction_info()?; info!( - "finished verify_merkle_statement {}; gas used: {}", + "verify_merkle_statement finished: id={}; hash={}; gas={}", + transaction_info.version, transaction_info.hash.to_string(), transaction_info.gas_used ); diff --git a/src/data_samples/README.md b/src/data_samples/README.md index 4dcc7bd..3fc6c43 100644 --- a/src/data_samples/README.md +++ b/src/data_samples/README.md @@ -1,6 +1,7 @@ # Aptos Transaction Verification -This project verifies transaction data from the Ethereum mainnet. It follows a specific flow to verify both Merkle and FRI transactions, and then registers a continuous page batch and verifies proof and register. +This project verifies transaction data from the Ethereum mainnet. It follows a specific flow to verify both Merkle and +FRI transactions, and then registers a continuous page batch and verifies proof and register. ## Transaction Verification Flow diff --git a/src/data_samples/gps/verify_proof_and_register_1.json b/src/data_samples/gps/verify_proof_and_register_1.json new file mode 100644 index 0000000..9b5a9d8 --- /dev/null +++ b/src/data_samples/gps/verify_proof_and_register_1.json @@ -0,0 +1,3558 @@ +{ + "preRegisteredFacts": [ + "90374861002239632883146525806296082229390106108247837426675086315668045719761", + "56179984307737135325919351184789470684532458739302700119337202059111297536095", + "19190820922101267664215359754841501926553775541624241835940789063091042960464", + "66586306965550603250910956553732177691905041135943809483521167389721193902029", + "68443066659093902002674439413897714857136051230929887104012199028945057695626", + "23192747390799604015430652824310028313406567091172154104214555033819721960689", + "97283375723887248194450477128146682165031810510343354567282663123280809221661", + "80968054135729823233098444019380404866236903770867981797552678178437726896436", + "113739474458047985875134190238202909490865559207753141829375000051595492879090", + "20946212888909783695959691982338390660827109775859716352857773793588687912713", + "18236560283595263861680501190348216068035274366239795797554205265777798677847", + "3475479194832868407252076218244065764153368218389092265849466931110185742916", + "36540216028641017149922661842736303619839298998394385602444281694375903052249", + "26751428622798066946593928384877292663892571316476265809625637633982414766613", + "108989866619290065012341693446604475344491203869097610514645397579480237619250", + "1706752348348350474316359563606222616037273166550736401876700743583814423394", + "102942953147077953577589898780534969926714763267459649931943250340206611985712", + "94996409189514341198972986074256390453367838049543555656374742468620736799996", + "7630635281270509304868970434369247630120859000564221113883913918139204902212", + "80068896147766953807751265463552510608474307949535623210047793435449947310989", + "114295154860226915328731256983284563858045735337125703450891967138442818857632", + "8417308633700696570178253158247249244774146709181695323743846714363528183003", + "79877103184977587145722178107489386645267945862174438383674182972620613464854", + "106622138440118238983021857248984299671297827476239310122691154542315572030452", + "35407789176729882023043346870195508198735280297753316525720822423999599438423", + "97247116699888635887092397993480624001232228530526374282764628633193826110296", + "99382438699614618382213388767371054426929963780766253748605072450548089096844", + "90037562315543375628611111594410050182085992774909526018552910702672849371547", + "66330217308210720753442297318980762487735785518018287993987132182462864714651", + "109571841541340825468209355313413891725787430962867981137038973523064361371237", + "109937365287439598906500883782213142231907427443560869688630243469916952399010", + "113385865575537621107394117379981261347666776727074493318494347737026645700795", + "23122203662614098324643090809541223981196048012147350120265330136512811004930", + "1056405680268605560294856755247691653342780261320667366779585585236155642442", + "87661505103736964751275757691313253648970106905164251785999294346436602113608", + "102687685640516492079118532882253008979682440349285359822275299001352415439951", + "23905697917661649423247972005223309598503440259943287872839907444179363364504", + "9956032705630556713599707735790616984651366117863346977335729174033595071931", + "96738810824213402847756679585491770521220456489714866058023318212839351509101", + "63834959162310767538843963137616271394241929873922387589022016011695315860778", + "21289049327692527859432450424389138860663521299399575156176885744994266527501", + "86232104727778949950935448711080979246717811947975337571968163691683226474146", + "102313560892902765619089366797567032814530208108882506079988386739661925842265", + "99515437057018328544294475001053112012841277062790484232940716266599397988057", + "10668736116974850029457233946177110228200385721657622520766124553543632184384", + "76103409895220100604235711728933125215091844418169113707022087801198846966165", + "113010486737795247946614252243717974083103498894976661835631581742069108908557", + "49364954754557103458724625605552951667693246646850685161342184015024079107074", + "21101393901139303402053518578563147748604228725946476106009553379297289500360", + "49057143170402849511933489439129029796978255118420492401606558513886701176184", + "105354731550163339410107008027797505967674200410979413601900457972614432198832", + "90565076274237802796740807405316931168975598712441947294022211662139222564246", + "110086539187109278267772369060252173502692807704231807386629478288955820606553", + "91701366154883661998080407194984734883588360864725838195350520660916272224550", + "10142247108685080334892437554414866974972072085399771470436015465089292126074", + "29846338217282302211720587287700154483319699420383757799056426384711488791337", + "27938671957139595210220691902146898397681086789544505455972136928035908911847", + "82397658054668831145706925873152499116096413535619458060749379405000904989250", + "114350224661168995256315748222052165337018756369447544642618460051770218058663", + "109449309974240654711094492499272317932638372062015147273552600751522531927132", + "72754288117656108990702924709275729187164329684458390959556709486333489176219", + "3549079161997778458715558469415602786285474423103849383204864453585494590598", + "34180556474406191060669719433425086607404936459323656751147442645349487160742", + "43765057642094157918166183142218037077738095098377774018701635793727204014420", + "90338052431962724685534383491983206853366403753213758686231057853304211136459", + "78593063359401999309183237875655244819560333354895701115347297264562942709344", + "74397434760339478525253859888632724196286728764602353655830333545367635693211", + "26331198787662591149683874088792836750375707093253627370654392720192174963831", + "112966566532689715129209330793849427993777907280780183292673865937361135937791", + "114353287122562499920403540458455011940628482725948814589329826696105247950135", + "74793741954496830626288812339382886908941319930944040532593327777657290557145", + "34816126872178744582897783663511921391868282525489350295187750768827352316016", + "21192453921598015764696235205121701434331412370431684436751933143838798473874", + "44058201973227503740034396715380727969112740245779215366320280890003333982477", + "29533018075707303783434947446180013484050458337692795871871452151406143646581", + "1515089686428457373979034688329533927928349613916887567879601389354743370622", + "109180325929866834046270827904451567568497733033134200374019349511256767897440", + "74803672184456742013297129602262186562311733420299114203575638766212190585231", + "115238366101742584162835591700054714193217723931612061275619410075644648428546", + "32468678250053212505585649596015464999877799621553994413247029896773066667413", + "83364528782048618142708226118279656717061858624081534727039416012820163224633", + "7354024309730882796394228327040203349880364428944973235716092765476455492827", + "1262870503500310307550645023858402879272209665433488597993297460482425337681", + "98335980330019236625060043875409342710228293575666239080011807480414732765509", + "50946595616360816829923577986994745828151869137771049307445926030578784109485", + "36091201194688256622898407911670913963302847417436669790744715657240876899240", + "8808253819130602704597917725112680472256833111887576050377948899492705923474", + "41172636646503426875678768053851629635776602665650552436822695192637817118749", + "57345710549584635654376568872517963763578746035456680536854183592502432570300", + "8592690889905210972890398735532689180019458953833470005607590901672380695210", + "4166477994583105470567754255283418669459564354509224410886188538894147142981", + "68098757309841651586951304259266886311988607392802233236113645028486168507396", + "24991295910751946290113312312609549408787761745773777699987177576591735352986", + "44579876644222395824149806086725617918387553747425122027470825518990251740243", + "15227406251604233210603812810167629530808202085136198556337441549511877890960", + "22759540127952266669819370265282379758525372733374540416507802513771255892716", + "43127206729995927237848006162371109890076978014461685775634432683267685856426", + "41713821958160636851968483405352077418860766134587223705294185412188684305270", + "26208125733708805609633428661679389703362429167499430915810971395717416747145", + "76610189760043808548699718210259885776088478988479636720437380804721153098755", + "89512216112173270344143296040145603274650163871066984128619395954363420721339", + "20460714744270138307212528049453329198095121561210823963362966657556483034334", + "26132924683195836720371956609390091423632291995299668692240211036108215269474", + "5833487682800299469138526098834355959268474110834809916356825665675462740090", + "104168692497517601592269866592849005457185792813289145227648260949961420864131", + "25331304506557690176407806936878770676661143952534511069637066064175583660259", + "112018639779265106474848771291281771837615571390662122133274809689481075308680", + "43241577635777865484894036547205004558146528317683229065146611241513131335510", + "44298908683033041834217230570717599544704508151662319940657234279904124414826", + "63552330732732459467178499721380645650878694771142132740091085775704359351779", + "43787187384165832627764329527271795808183561866472090676239822547264004758022", + "75945073431498078448020725259869395714443637284325161544957599542351223232505", + "3487179213006642983436008189858169851299213853792874972837855149736029401094", + "19194865307362108242290006920339162915830230902494071902265621916750355946629", + "97568969073055749633422855926655463704707484230994155156931576401701347016144", + "102238434528026988975197954301433106354948626029658627734228689550897160347614", + "66594741843714574534308635729583698167667776410737504500354069533715403500323", + "51777580934224258187544418755076951133541389668871178609223423989089924081639", + "21589639526269990982086909365872153956502020087277655108454424960163541671436", + "81384416940325143552201510640904753937666873078017876860068735190840262769922", + "49133513547692332775728603722476218340473115481627222594095172309501801157474", + "73734380932306603407515307721321779934177802377409864424716732654369673246710", + "2246242615905913254289602438933399890848860254152406286075054315866149677898", + "32674031223765518728565388665708213082065722640384335713247313951353485898957", + "28746886696149701919814134856061510367100204788242834599828602344175436902511", + "39167172499001521372424096108110778083374328793564421932890271511530920922273", + "5568791916240257974108514411297609833792444630749693797301395811224369646704", + "20648755118034012175088350428474024653337183431348871734331406995784145356367", + "106801795140800106612769951485343336194859968206661756633407649315203733828610", + "109233825391360408160515995038642668597144657585165770780785494193129195973941", + "77207505616123334879940117435155892191723326029288634557447400993849107713194", + "71610279175603669325936289183255885935727478053095853966547197850172747643407", + "89854640986939055245084861674373301917111961062361634149692827460746570066714", + "28247203691230740736613218045571786984629316425418178432608500161341110986189", + "59546743490332337201206414807226390307040560870249265640051968488562401608969", + "67929796707307015787838902159703874270177935518815265738049224573505381516441", + "57982897878633836389748479999846361296323406155916672564734814105139336792326", + "5461101373327848068206149863625709449986120412484976573069494600867225573415", + "54401079502624290280637309817524422947364512646040178118146883186731670847433", + "53102394760090565318361765484915161408407391495275264713850980546504698071462", + "24501533376177415438581018233386276735001596213114459694543770889792806631869", + "72170518293491644299982561780267540456189083097892772096830683423147466350620", + "89507430817958911598180398286809748833831052705273225052362178213089962642044", + "67727286488218425278181697875293999012012205750711984730448971351278910880253", + "111984454683772058542342557774797911429133885429421697069813212466318625115156", + "42436203951095614276310175924323536573731986909545123056564849774774169323368", + "85023143561303097272838976016423923190713891008789243794345887371857933417910", + "99962596389093098242681956517398169865641769947647874231354223362282205536340", + "4270535965963330775428152393255854474388157601236085526291615686178712188684", + "100168155884200604754471294981242410393814206647200645914158150624040943080154", + "9991161355592366583927099508561253591100964250276828785969078804632480435554", + "12314720405934725856472482624757170035114847372996256646716937313000588318203", + "2860919010955558408902310701877023431625693793673332335478827641334278686496", + "53094136923778396041833543082867956503544790133841216723133125587353218061827", + "45746601333313207603396211822734047207695070342325060667493306720808686166843", + "58889503653460048861316482416593039235957417643084033605562781818588299363408", + "19368273464556807576443231344257895007603950181611406270234178574102198049241", + "78437754394508682181120265468852233510477922885972762279767165050640422908939", + "107538822353976920407659621462926481071876578481681250153246538133147091592488", + "81016917794819082013368717221409367332826911122547583627440080895211636369050", + "94293980226690299092075171178403633264221836625859365988598967109306027221531", + "104532237909964133266639106750455032124167279431562592209984567674658989713190", + "102950073621149083428450437087243856943209426516709316481928340843275371462474", + "6207133171417225337016777381163053708908918883458415563002474230906668287644", + "53700790273498931152022815278706540759909711478884140534791079723526570596577", + "70115235540639500263001553659924939690859425790641278583800508331421213921461", + "35543200975794353588671421892926038694759482084523519733723837344262948638759", + "87352361273830059962387057433686873189979881697522907386537051414764832172457", + "7638629750848859240414806726354174351530887514426388188836129131290143265737", + "6516500991100747974194383587733989479753199121089574498737264556690984433230", + "93253296820582360795148765795065795381150137981997115109302523734642323873758", + "12449016597987910792497122276112041776099425301434980259388955793910933741083", + "11271285254221084100339796453752441804606125007367969431803009806036452833376", + "65829413880709257096044183138202605328645291488368914113133511052795333207246", + "28977904135508914161376386492741539135190407185163903874658869603086213454138", + "25836751905377616080744783025854541008462131129032624784576753428459625661668", + "67180466814834338156096152655854391237210342648669413756773929230094046403193", + "99357718082860025927471361993254462596480088012760268171607745179113742355191", + "71955653087845635064868533213226682826487548825435565236859397491549375786842", + "36297888985448358751250303659804599846791541289095708937632688923150803732077", + "100695121743117099387138389582703227077322918542033961629411067185278558763932", + "52162983126768334363716226677678035098080091988154254090178342535424805338565", + "112708429459258541488478246774539856801569052293461484378174484054096804735367", + "6386940711335736617244249800843112627661703411239408108695797540986788303958", + "48667387465383679028757190831127811623386562948341819793981442700703531129212", + "98215133989567460358501006150820012098364412504237534897797904556278505940724", + "77914337789836865570785786657698936879706644099756179733695564224308773670876", + "100314242064051268461604597834245157603560021911340348660139774644451738907842", + "92879867477996008917340699058326590131009703424452440666887051426021661821602", + "99484689145824940566079253082487092284723654220927015492765678371484126993578", + "55338944734571646593272291826201840015142400248235325107497286768141895185337", + "89826434292930901862075608993436828951224280168302092068798800553885757762928", + "33740109116378228749257439646234270163722585879874698746225292557855187850594", + "100356465946439001515953663863857685534425581725095420766368764978292427052708", + "81039394128577152210104571162034485951807254911082897846587060509332682379842", + "8408001468728275572399671384230777274726355120930410580597806906081473572834", + "10908895775073442916551780239275092031518888963057215550848907527664597344536", + "84854642649047683943166963643528804747997917768241541006172310483130917139714", + "33057615236450367976028992204116567940277523026857601485825454840800733335275", + "84705360793393705597425798431296817504392775934169299899880924245986783457718", + "111525682337395407150935900613453144787831145518929570787046943285397888693020", + "105402484238252043386406911631640919028148671900230248753956083168227090236594", + "70647607073050492724378996153615617582748975980544650427971195959951966195543", + "66521794811092307186268561977757872649616489656369434186016615885501699943928", + "89597831476817284710027736327994254225523609056361102418859489827421817774092", + "44604079989059949810225055984527460558032314898040234301558288230903056056928", + "110906681986217791515164760429651240169704675531605153783110893850933566462598", + "95605426720075704009708031938371632287665713591343546809539080823718941837468", + "43398017903547626946267019207185022673547202566576083953106515696551664433428", + "60883525320865361397118947610586986350422623916272247377418475239685689025023", + "105013515056650599904740120254050683007636634057992254769196256228963989758384", + "32970019925085424528938038041082657559781113875649582716431251558142614988993", + "47152734265221658771537186547896388953873827616302729821741905644792654885212", + "10001610022538043596518167287631681217109070720896899004297617607149737011860", + "86184537192912747434336926622761274738006624813378474991310593685521681282478", + "5358504471205796191359974070296605502493139653740431802490387627691657510322", + "83019212589565586195475052280463738452376535486172402079583211203400216456992", + "77312752118832772627173761036118263107052792662245258723454628828356346552872", + "91168167042411679201023714451010680219591301896110952914192246461237354981878", + "22932757472394911110965504071941120916104593208650355772387363295265959734953", + "115556511265393988531138660976576937508980119423457984460560732355986628567729", + "49471586771056006153882338624844003952601160760394299194484706708275122110249", + "40437284636905544491914836688765577730310598705029996999052422836776316633143", + "72670924227959953093823635758133023387589265147796294862753188605738013306166", + "76217708915337615135870563303026608590541334136059805638260396806525183027158", + "111382703162449060635417094044983829969538219785638291828194112078925781095548", + "71412195454643078215201625799979658826539129274678134190054591601317598249139", + "109427188924527536161388844770403365839616648247890550908426860021567063950012", + "34454801564526576746496304309335628982206605439276368979136436152558472936330", + "16909116389666417078832685940824942416785511928990223451431211956701429161798", + "87698582301117846663147606779269880643388131451192642717957297114727730507100", + "43592905395241141792523085541682153713270987086400852743794878114759318992839", + "35184881368193554939773858899269834363473610511261389836413145556903303508884", + "20220176479835329664361860803150382635023778080712173078993999986143667000970", + "16016175334500266720236929020842862694644806123842897753176802503629958457499", + "102801360790614342848922227882473633660570608752016158214990663013058048355226", + "58431985744980537888010270219770316522367177923668906666628944289651836422428", + "113151842259347069612843052101577985618353246939906832913902457845822885426657", + "21668648605876017813903250563208915552089304347193092661525061207363925567050", + "103458678315326790746664464092071139733777152999140279888112890480728137219425", + "15046497898873536583433477709389552494193312533290755199833917193885405409120", + "102257627722241440926290718199198015612965738563678274220811766728449922160690", + "115352438831125187782321151378343525556314774435648261250884644770831391669260", + "72754165224345357763276290774245956611804378986384287501670219759415895189580", + "63726005931456256957505969253224519513310091889261588362935543718245788508457", + "44910251191483746483195517495699591749009017563959493187235656765833916481579", + "23891996609610598674739214035443938398487118816513787774310642097646987106723", + "68266911273245661253246325983957102041600367995682669862953183177017341901079", + "76174792321053692273480049383512989579457418003909718073166397476710458124125", + "47741193980648316938868907515514122407908396634142457645264132883247206333355", + "68473348894505681101767093394679965408224360400687139735774118053839909527213", + "61962461050948177191714559364559630784308260342947110988646257809326620368732", + "109729562325274107495619813763747075773585249281577287546399510824941904297909", + "85278121045714762581195625982775632570870179662735113302305732775223026440845", + "35390066325352698385900039374380681482743106636864486587171008494181912419887", + "61817986976212291111023385674831911785692691752663229372150154623715801331268", + "104234714165077845426216586074895633703167537283045981826348831938989156603755", + "93997636807741001761200701186260237871922197808951631015346841691626896732544", + "10948685650569138662147662505124157383288551691964930130973677887234145173522", + "80419721870958136651594847806145379485816582975173301021693736480838794125039", + "30773599383919394844596593330745836609535996514201436551409942197904827833532", + "40006530683475617958269827175640823237905182350116335160529910058104695590290", + "53849083177701012677475696718832279545668013005495554861802582918816713436455", + "95062237045823435960704034970581429750768877035581485426250629888695567087980", + "66565540519856756044007830722509397433296158097795398649671945575310058673004", + "39910363287325882412565859791023302366163357027308058559734685947857918538423", + "100815578824152841371671582238880601229587082377654179508910110650249629797310", + "60044329725468581040651033165515865473651351328741547772936320556187068085715", + "107441649315090941799812354769686631343966197022610469971649947922005943294627", + "5420203213397319930360262451591483749541054436628730884965825787226514268456", + "79585000017390150979950952749344164240760428925339239295394732518310958149575", + "89480796618561168258046443591555412691805195353504281175317787258023352728850", + "75037195320414958249842856145783252179990471454671744930888469370195821105735", + "65766498003253658061204236689716157588363836833499059332956339571362302226956", + "114762279852430786779099679169231341750181664569709199004559936775015990441490", + "50051880330277542189027601672807972182905492084169218833523433588740583180287", + "37996097415291066390258091736392940373514369166754297151185763737393838492432", + "62331102659092603468993012258473653222062664522783032836120274183826356567333", + "51692730657084392082330891620940978627212406377981169456802474380362701895582", + "111028881613454007057478165478909084922629661509351112415149062759630943602221", + "78149070343913994174633022395370974896836526242393742991700142705465522394529", + "10304839652382864223365413862325260732385458467314371939325634836577168445257", + "72521233370857443499470980698659506422624493121069688547587420249462139567486", + "114957718573641314614026631676136179454763280757663675235443335936702914145984", + "20689504506796055625163882195238611576705359891216904935059102451468001008254", + "554589963636248486584305117640692170193922996101985470491449219568595439251", + "64871221219644051384069730546034243411449442047187300401570233079245744891736", + "50586518593293896659897980968470618799519050664592829618180035470611324252338", + "19717124532419724483984803632312259298765659984327821525416679282428215186251", + "22562694164111251845384808896156304616355277198956316500309259843686643229628", + "51125264080386233104180456617957528157930327534338850308651690670883500460220", + "374340456899941854719739759392094674445269077109061426513720694124205662498", + "52538748706636200788049368975247774959339216114060527728059633691695500867966", + "33770322910019572260472350939958958287221433992449045075563915890242061272315", + "965534793006240744780482282382415853268386714713034818677993718493886390048", + "83902059269517575542001470122915769599929870377644672915056065158067237659001", + "54375593449838212717956792827813290169046354991295381708082156142791765436986", + "17420649344075512221387251100364985687006164972804173854699920954044400010000", + "74518494131489310311353579115350638439647803086046611566609640243763096050725", + "28374065878646213296858599426330774017872696614359698141919542590347811111512", + "30758218608091659106461649222808638483013860783527871337597522166292465352218", + "35843639259905122085584547456558463243612763457594040538567538344953469172026", + "52929326380918711676851214279593897811317324422293900643096498444224459844557", + "14616845223833807134733223894180176216871022135762440273494335773116505423539", + "42473140559320482613645994604530844722244857545886887399757773750565944039844", + "69819310414707620797348683070854363770428466915113011098105646854801597032594", + "56835281031690316643215962958272171067530513585378185566333365248441117645733", + "23588242194293587675223132834161092830894990128308214792256090492047707235649", + "84583123918412912762643134957836889219032119926164397061106474584409131503686", + "65145076675255995691686715098764150982016729771212182560522187586131502437269", + "19891926584061921708574808237380626403529652809168185542944606417865203890913", + "80271903429617696818560549855658385467833969902706569264310959391178200051867", + "28403239590581348651418868157536093184233111654668794397435824758130907593957", + "46842532816204932482654365318010615652607796125623392516870612584008877559021", + "113799478533654745789404356170561708569557912461575923985299474316830917576218", + "22204092650669188080428834926348346893141843565768467443817642005190061938534", + "85073583308415162873330650849457267649067476895673752854621131078817434114283", + "54387469193842630440271885538882808959845473434650182285977367017730998271563", + "24845907658939965648076968540982236998396386353405369089334752455410210457170", + "7843650733535794317512162496151154461668526314956360144464708872605590141728", + "30444065430454221503165776166096724198402072784554113203617623082626758982642", + "52773436799266363904529174477358630044232608139712289586307297317202109807558", + "61271831955088839873570916762791904000517501748802934616044626950730196585295", + "75202083776185890391598549034260320636936474502595321868782806602616015374763", + "35114637603570773235686342746137658551930444862719508680393551330993193572056" + ], + "proofParams": [ + "11", + "6", + "30", + "6", + "8", + "0", + "3", + "3", + "3", + "3", + "3", + "3", + "2" + ], + "proof": [ + "114466098897597402921659719709029092930640158257605074943353303056672207405056", + "110716645003116774241504247235358442981402102604932742519169372952660021346304", + "64129366726357284689725737553456410958830515816794986629944529799175703887872", + "1780736778964192366546933766518918945947503627722816931995060120033865240166", + "2287089742226975924720501489434571104340803709409031654827394060964237519911", + "2586870648411840282288346400780155287784653597845275189722207879579091056698", + "2237650286063529741562129108954136266859535902083769633630357699741510752465", + "2043599315485679511955295551648588971389256465202336760150479451513582699043", + "2074630453024902369311214052034490492356579366365547032549078403776288837141", + "1140656450332239236517458398648072920690300180154294115530233270343527102776", + "339074222333523841283795216614182875876567909518507289961249286850086248655", + "397612820379595263384513675320147679697063149209120136968689786663601998732", + "890252942442315641916806609943362398057137084160327008582850126123841401069", + "609984464738082880334611966620647569135958421218326394134583119697808559914", + "1315494620912915069821324580527981973536790070056752449795197986617000006593", + "300624682652420252863564071043178809198031830122192328689349574956699676204", + "2547705600302086972022371031867119775466913383806980188921824164790232255719", + "623968920639319688882054495152447806025106048605522081878646795082871233811", + "1342177322901655332420562622691591392100100357148928145984151097058460708456", + "1714310403566504166231006079116003353569451879132185283707149313962609876392", + "2384595626292489060015207031317576770881100017446242792162316344528486902408", + "798304122166842829400797224542975534200929668532793061160733421682444396210", + "1055898699579750344145349456166146455290839986524719611646020071822400593596", + "2106021294731348329796292813965827701086038850334716537993958891180283658428", + "3296008873334817469179037044706997522914968805013614651032973348184455104000", + "3393693580643468873375475045386983520167790590680569130291671550778441705245", + "1374958250610270833469389232367579565620344953523669070672691865909525150916", + "2033105341143767278693368855018816898192858298082858649706032497751322924566", + "2514511612464884054370475396567544217887199705287220059560404728822444531848", + "309568055189030799994555222321220489927345566596823577367934927586105675605", + "3155501599354225066276754398978302095167427731419388469587427183198207398474", + "2656150356188972846960571629459199996640225430750462664456641936306473772083", + "3002952853075238617498841689553174289777123809888559050666588767964108716174", + "2401588011544100652139717765280181652305423904897482498333064231968693043456", + "1448207903822279301028230625066893131135296078454443896749810480627349468761", + "2591024233552006128634714126288321372673604343299380691839946937566925638049", + "2277042679282650429443892868304432861123594667376439215008158766165142712810", + "3108615648705123739133811065006363776749141611349849118233607639636660146491", + "3208093766812089849667839652230094271894102105033344716083192125025859338204", + "608528274072603959469416940210315473891123684740014978236855472909806957944", + "3298939945715304707173420951719416013698528318625782392714877188608250949187", + "3275205846218065313217085795462882008036317144702328631195675136989799675439", + "345508629977459705991119225641468263978323220379348297669105721123687589080", + "2536042613536253158955590271951576629017139519184134774086208866232742416853", + "2694637163239942934607258341075305656853919338256229864591757671027336076286", + "1074368344267201973711028061049445307215469701340903831420234935824024905175", + "875615142492322680358457282959757539415656147279929670707959297448362324540", + "2531875903907314731070409126074381837519311237054850501685223269871983628565", + "2672147300369737509950383946064752099814716857222678888178233438056099736727", + "2962771202700555703235902399460329895428299987695770127591978435511838111600", + "3229109229822013103050274057929724829014237369630772200476097356857734093942", + "2250554918483567429604919561558977125285526842489201840494998341168825267673", + "2793705494310526480239233428934475641435813542091073292381694887369871279919", + "1656713118779711244553065463729036163916320605097804459171533970380038897075", + "886492290345721437532011422603961944542837706582786887370632279245166618233", + "1367377859354333541354447704196826274360151157117558262060563051738196377402", + "1188504623500152324201960526724977241284016448226340302395821720436364489426", + "807854943593010869142066858421593959004435827970153626426452912143086361300", + "3500017114531146492696497599766693166416200594438158317617506647186663850751", + "3530464620049927299046312009098297609559866228957579780342355263505477175624", + "822561139464231521349523157789141232840158037074717141358974119231458315650", + "3087074144855237577633029689493800193934285802798230089509832229447743356880", + "315541335858046413794984848129208947387790442101552659771723676899082165378", + "2445932542062636594368430143120274868180773580880954952240478338934741426718", + "3617725292111359580607169479864228741005107534403183965572919080548698282087", + "3464251623134423241162623947703706712200431383602916190750321547584100708563", + "1527640583408586094989756445886355511416052487144469141266737674524422481532", + "461828297422470533508875213004476311295539176138857727105016913916259711768", + "2085121452202452539790974378150421625098051301789815177217711239601904634184", + "2378020496680010987245421404981988059806479971652338478997644650306826580234", + "1136047246650769120415923373706032384183115264985707709314699644325731193391", + "231010202702853859109104016474419986209039972298236694758326085815768530920", + "882537367671996391506707821730010491500807865388204172263010289778089117827", + "2139727862971999167830636948895550347965912488943502872589135750611121770185", + "3124116267396097260599734771831091478433568020641476820981119105165027949766", + "2640384779739586724998828109631238584637414781555444871880788198580126048224", + "2179084900609767280526640663460518140594545583147266604039131376170526866893", + "1403197673234752833648926575384585960957958668844551808674151774599378375897", + "1031114182116295901493289954330033244373023488565828292467411049577762695799", + "1115214429995841024624021598768389172056365957840873903115161567587317935727", + "50780786031480959585217312990383185749191035970916938425693718821240197323", + "2953199238676428053891391485168521715953626127276685517387917680234113898440", + "613320407673747600347955292759584283841441051181579809119850122967160520684", + "1321169910290529179697914368866654874739694985839088465466821144941742255120", + "2236096579860672254748720579254076347690568662325186460983272659163638333300", + "101944269337106642419120194352917002857388120856412179311619228582462893373", + "242269019568367280995791662601930980790400909342390385873337615809214119658", + "581308931129551104196989200532582295554358606780892198277803168521360361487", + "1077257893117634415574759251652424300998499350408993216844412045127139877370", + "636756659785510421333017080501180227063005553791690309941584290265286937935", + "1782304250066487741430333731698634719256517643637302451760635809688936266257", + "2742651612103736258341417729537631897542093136382519760985404838981036287647", + "3458241115538719194599112388660823820438391086090365840132123434754256029571", + "545197563298764457141268927983294832908519891187114813350922140214244156249", + "164612847557993611929293986361124121794877712522527151108550814901554167639", + "80773937600924086333051291094307972324777976036726003177111375547372551633", + "47746428608120739003605180505081237583912534196552862646513940009789405346", + "152376451464186164357695627937906280967666130583040007548565820511548790588", + "2653775720728649822133650450616960578424495196876562007045306467825811108998", + "154734234232965298521835958727543006982267795949628615592119138226649820267", + "2561984113586956550352533579856887800600393864605381829360681963437262965241", + "1102483782255053166587835643926787692076343188274618769380612516608136448028", + "3196014386669841661669453388666491847881661405818117399213152875589274945412", + "1588529672341049774682719042467102448987108904301428178961311159175987487389", + "683386397753749661788800333274925718748905511853156081994006176672886995263", + "3002678417463615849264322606972421968569730920039291900546707887522364222776", + "48919524436562190028140035911590886515984527035053072226036461832106534874", + "3256406038022885444964669879736292830652929100649755669588010721114629698269", + "1836164388715795169779033713623846150464282965250135199411793361864963242044", + "357924121265152026326762576222965667068008736313964740044973401660315437990", + "1947530766974849665185712725893506855908410771016127355313101728771506319294", + "1123636673850296741808787653065875762505313881779513735319538357072059649262", + "3594396813994374989075738662740139052747006534705533963005742981091063678316", + "262833848576365474048963861655732483143805086759927007494847530433992728170", + "2525098986371802718062444273269658397687761209862853305668821930156589747763", + "2648851971556407268158720272208799555696071918411960630658772141756647470702", + "2100715748494862746819614427284717757671032062065143829846978682953274263862", + "2678493305112811208449429197453282948254201968744433869201219705682808703899", + "3001631168883389093205744077121773208867495805595165376180278456211441810184", + "2324242827323406479748995512063753274148793138587004684164085588417341509915", + "1447676751552581968352111265960695373649675196657380608952218480704841146819", + "2178886336940609347303889904972839947046009549450321568097607011510712576668", + "2234067831497937710941817116533343585893374151153025757541401495722178211489", + "918221792333127379183843712796031695432894838807885567908582069384023576487", + "140270815896309935020944850747940708677572655589967112506838310548714718939", + "2806797282996898755342966790542066112510357362659707932787988296264906010535", + "1358375331019612182750542255536316280261876788381430058885632704295537469567", + "1465712594359052727506132584734827107839500839740856874346817351384763116658", + "804393091662873225670703920869287571870590456942136605267038116014297825400", + "1662022290065488508550436593351221727641467406401235686054897646348570024633", + "1381894516573892069285096455642992759315065740643506718117627097974442041027", + "2741302113247263858636115172188320719169913667564061242305687276471791559550", + "1144939958714813237586805856274334706130349798462862848079341429660760871699", + "2067139946891237797209344517323490639392711955265534508500884672176008685015", + "307420211528759774429880373497457973180822178394753353611506939957421014891", + "2727929680807976904656108441783507559535104636010644047270048324440989396490", + "1756598284694415638071487709456172519834776433594461484795316246221868396696", + "1769916796563616575007407741935603198625541525933937096592753201491843595872", + "1571998726982824575544537434870288309596408876051985252364787741187832414012", + "1389558229730844955689307769808670327149031562203675737026324745675708989610", + "948087640971613048828021593943917548909449788294087593749555835766117544905", + "1631859661329868053334272264597967122910342845253985727140564546477821645712", + "701237868128463201185314325651909343591236936177537576029978874378851171212", + "2120840038324686973997782655694643852169610389604755704995021790200760135950", + "780526219815191278580026415720505815103737369600870849256166967706319189755", + "1778064243733844391424608134323765255641254228098139795349757407847292798773", + "1784180863289380024820884994058437942740823129838946455670224321601770147602", + "2978934091907874888367278339333780396850852892600401485026076897170461243710", + "48262780358557252293175936449118085322942815524354237839997486279622624164", + "1124294080344185063684336585477010620330484046265659492435527420177653457686", + "520331025447559557154182181908235392625106671591546756014944246524736836636", + "688156699203391958432900851827650087806799977770677962658358699821580640596", + "840567957635654092070516455074281231439745730239598469415101421865619789173", + "2832015331455065123333398324340822922190108739915143460919659230524234078335", + "826436606623713497883320293489419467168311962873185252850858105123097896536", + "805685400632413357965757429143291791690403433412372137936520102113863801210", + "424027858543446814101585605690606648035222881601047496930864206897840194031", + "2152149031132795148493642030800746506307052054141596107183925485724105785946", + "3461500347791799900919391300761019953044183698735303809843060116621324152769", + "931440117998439434700788473811388456990892587933519418854800291164365685441", + "3577327278059728717360276541380259470488734382512522841252030322613072399478", + "2780797077016848210429513778813120316334437025362968067746114157624030752655", + "2956712611342719319932107565991121685233091466189363557057688162206780966454", + "2204969127722700121313626030250502630198775138262071470763623888519596448443", + "2370809556076311507591074961001732323131649704079015600677082198959774126503", + "2008192185569340415118180586376392634404314682678450270778422562978621384032", + "1126427564679229113132734816287849194847096541477318427616033389189036753633", + "2682435341959735706632977415560041740453091023004368591221814358308588695059", + "3080582156863580945788078225325516185726619659278163704178463946150047375399", + "3362478257277704449834711148720867819479104539459472339013094129591010229936", + "1912624143965032793300369372847646346753867714083649895258005526023094363498", + "1097536063799575781881494747309887422983667510377066328603324307205643176407", + "823470899908696214910483264727384453403728948544678957583102933009985286449", + "3401507251079791503997115209038170664018965661819428525271315943189277020591", + "2321476154905675435335469889143995786686673559002994737558474898570458035288", + "2476164294215428860198935220776460415299410996469465025619544327536247676775", + "2889006939357850739569630286376393390187807424637404657918889089420753586078", + "1548370397392878456812252708315008453454420233580826493753247412956426128933", + "1242519865848635983196056687589083399756647227263943909323394230758328625613", + "1308531695293773768331887177612084441330926982637778035147839649737448438530", + "595057818360555994493802658203209284025711707579401242577281663291337213555", + "3477218626515298856332639230622521298249676860148105592807306688679143940620", + "756457905069894146392028720718964803403476880813417563347350542897085502942", + "92715595982005253164894866075054944731178655512334191836614802690530203297", + "3093830016820757542377726612287556953368871478981039695499325360817990771214", + "2701910353920756930182170760936032480207242372165200186120149628439847831074", + "2318782132784713472824964695756598062763270928886365368846447400386154741525", + "330097604209073765914394138722404126689149004335249327934169769655604409953", + "969946812618629783071696238356673123224113110145812489345149134570617493302", + "2907907264668575270660534757373337815361698700386168564992528573131793389460", + "2911131517779489429507604400694025480838527939286034904072929457970431097133", + "358132840025826923555803886693541437320753360712160218768824920757071917417", + "858663374635700781770504604836248356396208276256789188289786888527724655624", + "2199297879977222304601423019671004822458525991606660722509541892048575033843", + "3136631345480349701314498279358706574695948897818261699430376081131948510824", + "3480326506526158260077487696040350943799691056953038916304925833798225565539", + "1647554536321279847947190462009898915960741253196980999129816155634219399382", + "33838048675682845360369147990842320388133226725834829652260604138885511905280", + "61233825820586960745294803953852818660002315554434681293120199779693543555072", + "28819940002741502193476169419002567039693771744067573579449401568957367844864", + "80334937416197318986141012895190850104615851090450353689348348080612117053440", + "50776663726994031486074073604860097130829416064433693601453197531283640549376", + "66804643741021140784247841965831856220514900209404592576696934854484346011648", + "28990216158062484468568057560523359698235479204062426835973190366731146625024", + "904535691816312598455373741803380142176926790077828477872769401483708512529", + "1335831800872017820784915409781985602132412411337145888929198640384375428719", + "476549055490480680466068931306534360876571015350891464543514317847846694199", + "54405268569973518217619946306987681174926392554757702381566814925506523286", + "1056986537013328329681132492959010692930982761526794828025595924132894079852", + "3603611086035460641978376957640001376908837655399388810053386805079234195663", + "1405282392436199965025810386194039295830272912086180912974509381008018923980", + "1843248558264485048698564311514031849235812305431151804018468771642601775083", + "2694056386875780343176089284128399270791852766403609506993516323028368979155", + "1900627617374749500810144478016915940662633499485022067135739129553340980824", + "3149778270588408477154042379324252680277784103180649160987503457468040564555", + "1738535262972492359267869878898366179806853831018728569108124395778807388616", + "841779056093625457168581633403059096263111335546887887339154646331872619597", + "312622465460065409112453735074540014568623946627856007772144513957164841741", + "2053983738177825717023224052544293048926759842516304000976025655621319052835", + "1446174358594057658024402003740236537423263134131479591001554582225534936969", + "206767050398819590865573933224538252272090055221483092345159236255836074549", + "3202529844546733368616555737130117853220208751518368376595503673633587992345", + "3258293595154503702772823195085875638526659782306818636414055997377513623843", + "3285059450287569453735804999646691721357939589213174514711268108402852515020", + "1894560051670429228986755830550676633208783850738132126859196157031527929841", + "2021054969185862312769211215986019938360089621046232036005950854295109164808", + "1504391100943426170151587529030877453828710488961303810839100041499553994562", + "493154860649035921074911688964217174986845890154580101507566332909406366189", + "1084559767842711658637670387988763004761967473031179479375277400298921510959", + "2464394063668846014943520830415570105051634180295799013221548721535824134176", + "477939712280075106931391187255812683606664691478237114446709869335959571040", + "3327057078560308040146985239150025041742428165678708272794740488791550562583", + "1786787329586402422556475824400541534152729163927351937890189079428868641726", + "3563094182677914195699364232043545525662590149915790515002561034811154081399", + "3211547051901369957020123947552706459565654592447995868367140047555303010139", + "1357370798398993956253926390289004909220269169202194239788702199745449718019", + "1894540864975518827965382541396544839059218678745822357814695844190916962493", + "3151276694371467594003842433644580866128844490977572929851191514490105756626", + "1801554093996699168265288629256535195790872956717412028240877306011508105062", + "2789406417183310762708700553125860036262823670027495053898461708088704587983", + "1267182925998277512766292054036545867763917324264751863032784921716311132401", + "67825830138012047671275945682026375204934514777726590672552476853528661279", + "40563763010091068255531133778634157504659080580856717983594500489084341292", + "3484532553611563472345570494629615859267843567271297058295062938643449513727", + "1362556539031316842981828527727104695716970042398559511360010670723382607470", + "3339370454068581545302112647339229865554164642063375965027186031436528340705", + "1083873784271977990260858695102844391849364903290542064049592188374167327952", + "1389886340583614945397945181868749175525649759142173838725524012007930328049", + "2779039954984693039614213732983524221548661566426957220308156855285970041152", + "2615720890799765497185636470580929509338617148225884004161451582335961637407", + "1286027833445993400796556597917545724482496114672231786175031013816681242500", + "13284724375107692207277927753512328181659991785529369467837660726700818820", + "1029930772741369357258147304903488159288618667661271548212919109701505657170", + "1620160803552609054595924914223128745119435233869402130349914423988789961336", + "3212123579990287633959090220143158644050612673554632900509540269427971790054", + "2766016988042823859052302655697089704134661116433613842045689084955275511570", + "2282262457415722050040986728295429461747243470640709563116740634322459440496", + "2487213028621769438053346157168724058046825161102488003489544399973389413590", + "2001870532431647985206957011652312954479697730683049492306386502942285127248", + "1742437806487018452426425321372372009896726992194427141808437023845567669069", + "2480029152074651456733187163571619505193787422365341254849805107424358923590", + "1257811644455240100623886062452056382061030525515497844499537408519901360839", + "3587660042432691383556822678509367253676301967102955966278764436257580378091", + "1036097199191453306438477076820796104136587426912040093325405575095150526720", + "1922129753175897456162426791013373504500081362932830230426994440682956720243", + "986174543655472670397311518917567728685407770211106079902654438195965004558", + "2726764680405384018253398441808554239902159600596421714270824585816884226675", + "459607181319645804948665331438728552787280770553034255008831187621543022375", + "5122894908359966063365751743241561245605455810076508980447074811081", + "83718749466962388620911615421148385298650014273112149469944142395096897198986", + "43711605704822398324241292148449209614402636105982424406443823254517295079588", + "65500429363734838827157394117012489860186086168422119287569807678264450414218", + "33537051029132212527094391704322616216212784863734218771553272009255589966823", + "112675869663977562049684123786204722284980489543422233833560800265679453780591", + "19106865631520460071229802252978009784582162662152718781881240968429180429970", + "33831626081108025405067279443211659438246666358324228021544366300727074493006", + "23723224571929310735813411906537454118952746963183976722269309406316137248548", + "106470200134999127433670842910184766606739713772093434507902029486334029833878", + "14545826288328346327953146493603897272528887949671468600883506225946551838876", + "53002610724952530313262994986622261394657249910689791526629463550407527676660", + "48384023345459032411282022257215617161214633896796740585781143199455905581712", + "35673629172361436349247031907115104555634548306062162653876938015825379972948", + "51088912636636397565993393840403918769892580606452224352254172689704533927149", + "95680208397649814826778374465369434470136582992927992299429079164898776944205", + "36858470188984309647705060111549224959739505071502776214320283058449701572372", + "40830941715535670092733035876626691569910407068707341797890725745943223109978", + "11232834818206279374577291173061663555236957387943784868731786124835850959544", + "88272970895927443614280188735300548788191382678030807157818510431133135666336", + "36736603234748438347480202075174247342675537696720368250297333844948261900824", + "75616778840879027174451981039486953840519716840250161647827727285117310936807", + "58031978260407270142230446396235762254529832577126248315964063019978997539314", + "60557900304514990719057254891179518044689179467556838799930436479867209905243", + "78631734937232927166027959597071502656760473528802871267742619872161859409204", + "23285337143129722152072598240933982098993035529789768740813863854530756331637", + "68200638364156541796644976607479443711071780661233297145797255339769642277530", + "14307015834338446644259588385916232386681250759634915141053997056327374548973", + "112719093765128945850437472969864814218711249974781318227452309308038502144370", + "24643628569962052617539958716950596732612952910988347189532899559436622286567", + "27606017883093531545731974566710596383790207294254519715401465877979385292859", + "94751873871174573795876561420309055968321646850374828404681608610085650725371", + "80908248952234935298643164912785220466334954603037034673461821250520759984350", + "27652952113126783942387844436282820153206618568253353333643746642252812450792", + "27943567263356048480887597870648279456768260888326451604891014595921415839767", + "33684066256731503613161616246244683940130357348486207340361264868247566992628", + "78468371288213674859446236515672688741463822953694453091298105537484566046664", + "64114248988195124801942626614523395276613396420945133508411020972430676309311", + "110227974979953002518127061226863241272696148968557389403526057193228839855565", + "91711550354482965795314108343944793685427394272962475998560699912773788097232", + "38936477686205790176194093691408215722623544322446430426551302252301218678893", + "5945370887744678956062776804595660457048733638966958580225149533330171036189", + "104489668759339440608638534195644107637528629062045167684643002321400515511702", + "27785915197642349144353067128356622170191836754140686023805641478129604107696", + "105705723774489535413388557501104011432650936812063078372753606113474223043672", + "65838548966405103034336953845062472074701760207825385990690915500025153263588", + "82475318371639166174398190818611121152695163296707070374415903524047680391539", + "47128383456361497970610568260424702841772577391578739416360536899494886002806", + "4529681166212240359323236008953476124662488412181034535072831604694714601174", + "744980919727796616079546926248375347022766328755313479155547101585922063154", + "4198780618612501878719986408788629051760360219465199976154609259083268846721", + "71216608987664173085813616361210502538017162449802886776073006379364194016878", + "84615003215733932053916728412529520363110902180545043978686686492736840650205", + "33843343793197617505447576767028770290632809183688593336492847611148934068899", + "69523355675795506066195831463501277218517053538178374118007715608711960525066", + "70120549592585058929526162507092489656021799999938874772315008536871107394570", + "33947188661904171072709483794382097880989335982627767088011488698402839670711", + "26602964741052060438595533248405705993970545077606550827816165516060869653799", + "88828255283001875391087831546685812974115887858425595959051092877883146913291", + "71890783684334222172710977479990620202453473677471549651135237657843168433292", + "42825086741826667034750533239354998130344619959120556617244628889219739672251", + "66620768634717683446438775615818150050641030544391099193640110107270895454458", + "84996429229274412460027540575465661856667554578449483868216320175839806195012", + "53693039866835650921391975343695369753148993666420211489575548457871160270516", + "17771831976972655551871336978925064161516676839461699562486468908495921284485", + "18598158870303205016599028244184643704663282771387848273727715699545805357533", + "22603100858811009017407062648760290651275831692075970365836296365751778836743", + "29041569994034576141924479338282412397023286704282632940033653588077763332494", + "27947383386651487205732730993980520873202503283402661209481610067116813654177", + "33943903214336270789250426047094010253280994870680798836263831543772386246519", + "39079831878151192754459594274380646495990099321610798612726219045094445806165", + "72880935233777993086753102413958527232347045824026823128098391517127299491786", + "105353200216332217751925392387707370441281489716372886111825059236469991982889", + "36971021860660551869895771272555791166645906669401869570081381919597683241612", + "35505081497938917724987499104474188641484133761483010556860613659536121392675", + "20802356340404360106876947201820277354367072984867808044904771426359676806867", + "716455942994242721466281753274692511151551884634528527251984483345858431978", + "44632355576691192172532478481808022957105840786505689092245286360536167862836", + "83776751524024614822539636578374999281114485928264503936490383713799448289897", + "32717774063052543329479846720482763958932143981318227319753254552343824838894", + "70512951009823879740332711005947246598396469789713979413548021236194040247845", + "68437099114543490227591381128072981566525408688162808082536274631277998166869", + "113509052059337784260125424997552337603248109670184509288591649173701187464353", + "9695612962063646261387126421026269613170360811660486047250348630043212608536", + "66514054106373819005200463012324936097175828474366340293794866273942491648287", + "72448942975306440065608409600193202802254245948075487380376748889017710538538", + "54485319747357578381976620682370562646291146906097780364027171961488617007582", + "80285319983166218001325805221698229145190321279538983258234772235838093032061", + "101203592895805960625180366363589038819263216819596938950396845347290164318056", + "115481350630409366120220452121520908863047909800664671801561593962401009331077", + "74438738833804372089676842471028790139658180985885115554842556654668052469383", + "38433369308175658950629098098641798723723273336843197329449635131176045924611", + "13529759111194759370093691938159083518181921332139108410431085159839832393870", + "35467026098268967052702463613555407439189798426065178763600221684296048373621", + "98528752210974460366146830585974554883204698887084464027639616967312681739247", + "90337387788097239360510222133066023718764166765637863849230632839120175298855", + "55439791072001510379101981094763023368089864386324728632572478417532207087220", + "101695869175450871442749413345459359669989074127078717160832983448640264206276", + "41978042015795360227569591786924992760146467725682030208371802862283796399057", + "50443401543122174088163388989962169352887262352362265992548036352189822240932", + "85490144258825235538717912742830630617753851714236232987112852036753946552584", + "46549608081954226070337000736633576324829636115622779142725596659788075154162", + "40212410027108081002148963864219063633213703344689647143748641477980737975066", + "31010266524091581391347900258750298269965975462810434632210118634741420035816", + "15570975741206013202703645472489813028234611105130464962077760152009058876232", + "9529896527850213794149811723566820750198005202139671842537171593567850617759", + "18946759728494821653697715776657346490328496472732993992754285333578947794536", + "74890877435746196118373136834314561954517187147789133354737992087121153124205", + "47881759218698537841953911213824888724891157122579275164567503560568158304167", + "78517067881815479360345869123677526747148663658781262598427308203436376861088", + "10141087486947210756937204786716762812278232805665687497435959757921350291325", + "66815115718016017409432833517224851283814862704808484745336603562995571084354", + "101432570211964534330515438975033574653700973111791924467224620583506410626291", + "93264420025797271932721798945123457876169615449505548439917065299804903793714", + "3709108657508524580516963046209208524883380466392737649823365877039465506667", + "55648290236406947524537146947465131201329205317823063795888113720627903501198", + "32760360351098980211452001826162388397765967152869503041418530570654466140719", + "105344161979320749940314286561612691390715348309361756623117528356563526685789", + "56911312277369349664808468685946335944868920859712047819145208192878954780728", + "13659425608505718503703269583400463017791679607413981031391316066102348221127", + "104483316977280435356440319408559879392032867569332920549044554014091951683676", + "52489163980213729615478573444472480025433353447272689825745216122864327189353", + "106613916633718244382524605373263906549194296544380547971860117033473388867514", + "50206425143956471327757572314197325435285172917111865592634856798946895425853", + "5850130021942245828090309861139022524376474313240207619232546494259819577034", + "85424744940116999111634385388386899553627117182435911524425188756627203031717", + "75169739890999371678924968048245925898479436416301436834596127406260645251533", + "69708466396593342910902678088616989190405778106966160600698203859540835865838", + "111788492647834739739306191904649971498572930193482137088010470726656748772563", + "48144433719264070519699847046590347927703082856091681467250593030684023677081", + "18550453799722885219238599120686787032996105073860408933631159819349246593538", + "101838942571427185130222850891529400626762461263489576940506617419418292954853", + "24530231394997732949908155650418251547160056233844996340620479432380196725639", + "97639523467915967504256308598234451280268002395351415371529414308425042097947", + "42047221623489365487971716772496658336169407072475831181669667670242875170930", + "97383763206491521779987607633615498300006773376772517118663248138642777166176", + "109534771444315142328573602230855319248749298834745690944355013248566266527992", + "83612355577269523099257266318843667189555876476647762967781509440483584201395", + "39999229784552194167662980536828179105342264641335367270069886610964140271986", + "54829232723420664062545955558903399490749051750165603166253185514200764475540", + "60824020928240671218908339932942492615097332113553200994868964876256818888040", + "99619363728425470103413527625506745828782803218975101467156479806365826064101", + "48416062327805944141859960121958528425490201704511568702557591124927802970624", + "93167341193231308852123581154103444249900647189226594277253127451096348364783", + "35953184085559623233575562911099117662979709098355782402117009127049335417365", + "91323591838543204011386233139477432779998591121533913929126149135110431644401", + "9121567185578066390894084778299093886721109104415789559770692926973623387861", + "110050184962029748724614114155590646297360986134507612998864903487979295813318", + "28009779013825302757940164086446577295912751579517499263287349588680273182622", + "40542864334231448402505396000703497635146524672261829869663983316436374404682", + "30364998160924260158230332091356595856011621361119586163347252431785537729969", + "42165311846331008082335672439965592296522039381104153423505701970824708238968", + "82949382124157260164221988634853072015870009303291077395047308700593940105746", + "23661978819064130033390493418630066505420956422873364375973771557094118908986", + "71439357325074695200577969890670085443155534688980716736156657507462000617874", + "65222403890941215470196284322642737895031492927489322557676579172454723167419", + "23884502676228836782994213160292595875441702183755228978516899252873753375293", + "39734889793047810692407388906487802189542193453784059461473107986407220636587", + "80537316903822935583701552055479621707315142291808595634286840610880861487789", + "40004355866152635278238516559579643159588366469491689793660350673850509056941", + "50408340914521576937831518392871761508257903377343918339690709824609005338624" + ], + "taskMetadata": [ + "287", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "33", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "20", + "3485280386001712778192330279103973322645241679001461923469191557000342180556", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "31", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "386", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "372", + "770346231394331402493200980986217737662224545740427952627288191358999988146", + "1", + "1", + "0", + "145", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "31", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "33", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "27", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "34", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "33", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "73", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "27", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "371", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "56", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "34", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "35", + "3485280386001712778192330279103973322645241679001461923469191557000342180556", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "34", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "189", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "49", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "45", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "22", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "37", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "63", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "398", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "31", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "28", + "3132276987043003322156864789671024834394494565216642852233970862560717996714", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "74", + "3485280386001712778192330279103973322645241679001461923469191557000342180556", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "370", + "770346231394331402493200980986217737662224545740427952627288191358999988146", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "383", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "40", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "22", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "159", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "35", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "41", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "366", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "31", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "24", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "62", + "3485280386001712778192330279103973322645241679001461923469191557000342180556", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "33", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "25", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "368", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "46", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "229", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "35", + "3174901404014912024702042974619036870715605532092680335571201877913899936957", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "23", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "41", + "3485280386001712778192330279103973322645241679001461923469191557000342180556", + "1", + "1", + "0", + "19", + "16830627573509542901909952446321116535677491650708854009406762893086223513", + "2", + "2", + "1", + "0", + "2", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "401", + "3114724292040200590153042023978438629733352741898912919152162079752811928849", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "20", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0", + "15", + "3383082961563516565935611087683915026448707331436034043529592588079494402084", + "1", + "1", + "0" + ], + "cairoAuxInput": [ + "22", + "0", + "65535", + "42800643258479064999893963318903811951182475189843316", + "1", + "5", + "731", + "2266515", + "2266515", + "2275839", + "2275839", + "2313321", + "2374143", + "2473930", + "2898431", + "3739191", + "5519871", + "5592285", + "1", + "290341444919459839", + "316", + "1325", + "3738486017942147354074018955379605676380083248664771915059705441906271431260", + "2266520", + "13", + "17547433874568682364848743965628382726429958981359604444957274631418163566655", + "2266535", + "13", + "7749116299797804088782267083740692628522862646799994425166213362944845351795", + "2266550", + "31", + "87554665547788902652191211055552226292573802503575884354337098466019513989161", + "2266583", + "13", + "16423204365463446208451886498635606282964612473735287676559025469370460789388", + "2266598", + "13", + "97660122090897676532976515536327685597178575392752118881746790001570319873489", + "2266613", + "21", + "15965293420646717632864890657656682147622030860431407741801362099169557217709", + "2266636", + "13", + "77829889301625120538273005884313576598117954809598182291464062324272311851508", + "2266651", + "13", + "11778056442410921545249586642918560827771268787305038501308366172627797709355", + "2266666", + "13", + "18364277121799742307672296674198834436703612301135900164520182929833498436739", + "2266681", + "13", + "21735447457064466173789256559509900293066787207553930468556444172373225281461", + "2266696", + "13", + "22523711334875090006439121766082922691595913204702125885692194992296419047826", + "2266711", + "13", + "83624106647297961694100343609754693980591162537481165480406799232614728629864", + "2266726", + "18", + "12486902211487510464343379655038142220436001470959615777475506675720761639871", + "2266746", + "13", + "20368200422104918220519150850184338115948143567048556895605142949756303382836", + "2266761", + "21", + "113854322277280286702186143613114340856969339550867337189315522099690118807628", + "2266784", + "13", + "31870597192008675990789996732130802915269720314152591261375941749709282920042", + "2266799", + "29", + "78382287317814472613239610149858545458010980340439738349488415526720261028545", + "2266830", + "384", + "9604218879067086476450192001546736143005731221600403399601510368417734636675", + "2267216", + "13", + "108197861132473313249010672006165508360866429075008462995213606270743445529443", + "2267231", + "13", + "66455774903168871171775447035719286712818684437227643871113694350175053599259", + "2267246", + "13", + "113089238278051186666329417209709318846936850786968743510017013481312171697258", + "2267261", + "13", + "67300239502169829984827395910149621987908120813874487937762978716235919128774", + "2267276", + "13", + "1319479363738867415310423366591370060174080372736046678750889716055912908869", + "2267291", + "13", + "50341686347463363975540907088317675866497103246666224706270212848355710053249", + "2267306", + "23", + "53385008667300485454352502235295700900313479021440159070204738203587876213815", + "2267331", + "13", + "47952981617598173204861359590160150882829120273191290014690019036497533355420", + "2267346", + "13", + "29519829429459552726331414080679705228047802739300994349547441016589236612958", + "2267361", + "13", + "4062667582948901981125064593866651847854399257395388836917295081179780010419", + "2267376", + "13", + "77552672658804527886622009595958277477338765289709038331221320726845995570224", + "2267391", + "370", + "87176638373429881563771645808207478092744372113238562113310463087785928676223", + "2267763", + "141", + "48064734020692671281681583947507149069905407499460852865177568341956674539391", + "2267904", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2267908", + "29", + "55020604747999751144766410071495837706391593304816802067600654139344476472302", + "2267939", + "29", + "38069407101166142589186488872691045214678860535725877323685482716309627272853", + "2267968", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2267972", + "13", + "44970084016831525541570776319152382257812079308583480796258135444484613981097", + "2267987", + "13", + "59603688867327028912595477755667343640430387301033490625265021919473611285520", + "2268002", + "21", + "112822960997405385250880865172546852662002745233424121099627244148901664382691", + "2268025", + "21", + "59628663938955621477784530808098673749845708264989579564619840394146696195260", + "2268048", + "13", + "17949273684339190294337900335309548739518897736989935008854829935178883751151", + "2268063", + "13", + "59090163270784393647497955222477046385041081282189003095794136150866230106173", + "2268078", + "13", + "49994288545631855436389578568567951181692086323179687017564411955572764850227", + "2268093", + "13", + "107755674082549605593455841646298997364609393127720581007320654455074001117114", + "2268108", + "13", + "53375535463579479009722567978732540420534839369019031140437462362571150012504", + "2268123", + "13", + "78178855365907429141169985361665480054207121267550887149338497257672211414532", + "2268138", + "13", + "46952556118908061533885795492790521753380889087260133576836576454813203516133", + "2268153", + "25", + "65505401367081327828932196628708715608735259056446170881570707614857075765429", + "2268180", + "13", + "66026361140859557541008850650466709875963212091612367158332178247107839518916", + "2268195", + "13", + "107829965356734395629855344211653560164573781413614607235772505599388207683848", + "2268210", + "13", + "47788005912333847330029912808563183895034631365400945745335507500311468346122", + "2268225", + "13", + "67097593983398640255167993896281494296807532312522342136901066105309779400809", + "2268240", + "13", + "66420507535419775976095280336359771823704045946479200814130315195703991328481", + "2268255", + "13", + "16101592567572099802258242269752106492460917275051456854102468577257503200525", + "2268270", + "13", + "8216914045633627635302660948386070992614456000204188124777614757064223091991", + "2268285", + "32", + "8249043304272555286383677937581365286849505296414458278799771542306309708354", + "2268319", + "31", + "14448283915147148090721060764299709837384068077654347287803008805520651873069", + "2268352", + "13", + "63620408241887794436708548307677866819562529926322073154982043971282555238076", + "2268367", + "13", + "40775361516480445645928872142071563084052839066150511676312787604993166027176", + "2268382", + "71", + "81428569813509542871211713748051351028867604297100493265050464642642328771229", + "2268455", + "25", + "88754086850511571257566892242699603077236826049312766737019092497484382382654", + "2268482", + "369", + "23654506707858200740506342004476864923902189622928950125779369066913145575662", + "2268853", + "13", + "96208148133995054905102420138122451420246586398511887337527574742531702470486", + "2268868", + "13", + "113580635962155504213985295208618498406180863096226059830568771794861181155798", + "2268883", + "13", + "15131752458185413449864157052139300410518252387356086659475433480661225043965", + "2268898", + "52", + "23292176179045539781094344551380243030756494413337668722244515255672054637467", + "2268950", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2268954", + "13", + "57153597448868926539855853259434541268978238846106320683353613318997514641125", + "2268969", + "21", + "101934626186394811002215974973967070319928197907754643548771079104417124673451", + "2268992", + "13", + "90273910915094742302208054546284628459686672579135471102191495914048843751896", + "2269007", + "15", + "10517329873685287928347917452554263006484835250651675277402969825090693879091", + "2269022", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269026", + "13", + "32026386706763484826260746686598106487693280486851488027571476178437691385322", + "2269041", + "13", + "23773726363363889882063090755216308036304380843201433744947905016392994838657", + "2269056", + "13", + "41030362719810092683936274861450690350552465887466419308301904892257547233654", + "2269071", + "23", + "43941438731016487879152402389159872199639416703899443666740619174832009465853", + "2269096", + "32", + "64262148212514546925252206696334335492506587371076276693676160603339172930660", + "2269130", + "13", + "68341019389705627980778368317494788023562860879287409751129335977589469383175", + "2269145", + "13", + "105387488867899480423644778850592712967009719216306825976651608464991419450128", + "2269160", + "33", + "13591654946129562002126815849765202989478154191387850999585354603681987556608", + "2269195", + "13", + "34270444613361640342413800364934734339012567552276261799984462745479619954700", + "2269210", + "15", + "41505602055864495605599765308553890615017909984116535819894217270687541833396", + "2269225", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269229", + "13", + "3769287855047212670746572370221712130308489579424507215803811578866267898712", + "2269244", + "13", + "31370787985741923543987162524256894942054258596652034598712511104865600444974", + "2269259", + "32", + "34630032254591326189593478112278114576012885618625550621676339357910707072768", + "2269293", + "185", + "83385977172841354803010250811967014891455960772752491520365105313848269196944", + "2269478", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269482", + "47", + "40040710529486463528160309423888679749598092331568072034784758397540908659408", + "2269531", + "13", + "71612927899092120281646356542123617181923889912794580826450400800692036713006", + "2269546", + "13", + "44012142378419477750713609346157284295753679742209888754526411900039665857693", + "2269561", + "13", + "101843670418999456948427896406373492501821426286997839388750200399233238851189", + "2269576", + "13", + "28069551324574210136584999023693559816928302893113954505255164861429813301816", + "2269591", + "13", + "60175915174506209947472820473705896360935259759680169086237455133563322456952", + "2269606", + "13", + "41096248539080902012335908903629976797268443829389275819032147119815537030757", + "2269621", + "13", + "110172376562109234563576542816780235176526300459897105622376991879209519467060", + "2269636", + "13", + "69579800812617228639975727002282320280970416517447717937145151344094549941734", + "2269651", + "13", + "62386842416018343607951302144487056964043593374773699385206155027294300711440", + "2269666", + "43", + "20871429405776545914229403370773660140457373936402646322219872837579579821238", + "2269711", + "18", + "81863837939287035754254393824982882478413491085191273481277469436776945463741", + "2269729", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269733", + "13", + "33524573947235248159031667742931922584539051986897345494862764207129288050319", + "2269748", + "13", + "69521000597239388942372657320674767194907555617754681109956726791473658443605", + "2269763", + "23", + "19333004966186931025290210878917055376746563238947430820528204421600490397764", + "2269788", + "33", + "114538966562508480487306343703514606823959763866639996944378894505183253199316", + "2269821", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269825", + "13", + "23236918250172311602781477328388532201735037001805541327865365168585411214842", + "2269840", + "13", + "105851611282041282513707883601256324522689411261384600746651542387186342808480", + "2269855", + "21", + "38197667859649411000933830685010063810574316966869325032581897279942887585954", + "2269878", + "15", + "35286812457174555875797358524458990887912628413423846628850954885701346229990", + "2269893", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2269897", + "13", + "9512427045245182242115231663553009124511054318334034076587958558290302487891", + "2269912", + "23", + "1865492192868670323762985258715873222797206408856588641103318564553555534330", + "2269937", + "61", + "66131895278688795224924961547421010783264442512377881130698816194287616015304", + "2270000", + "396", + "107740934040042529506042050940342987633499028376421113701731846542377195833346", + "2270398", + "13", + "1409894499338718311294081048510373269919784393236879434635482247077277969566", + "2270413", + "13", + "27737204604813478263586254532546870980777853392293252569614338867416992810044", + "2270428", + "13", + "79832665129243348758748415009326940971010959505579980076313438578999760992399", + "2270443", + "13", + "102478941373693375549956812878110788122021892505473864300770875588150313734259", + "2270458", + "13", + "102012951842710597862104186156947376854037776965882991185148952165890002586085", + "2270473", + "13", + "76417106370236909197698632830251002752640107513140805673821788821848914531605", + "2270488", + "13", + "22435116408947348327245372133214018721152854778436903019268345353280913011456", + "2270503", + "13", + "105705119183636876264718310030378962194781350046315627498090284580495264370027", + "2270518", + "13", + "102766566643346153656602938271234186934905554932621998168803365409410211928359", + "2270533", + "13", + "9121952504245628783421233306095476353441981972713852108173642399482807715362", + "2270548", + "27", + "73962617910028455031750644930484898213642860638335615505960304395715369766787", + "2270575", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2270579", + "13", + "8831422292954978039820857396332222926832474211950777587716620825000083972572", + "2270594", + "13", + "40572365482736356093128943044181419120902273798347181151252205407631489241195", + "2270609", + "23", + "89250748423108410433426805530288370741296549548481331392390410131674645550761", + "2270634", + "24", + "81549167029416228276298291834761499942693222494464278511836160118839531888493", + "2270658", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2270662", + "13", + "50617150871833309590669450601767195305257359442043990275346253785921825685523", + "2270677", + "13", + "33430900398633986517281079257144137252508017497740903641363497653974577820811", + "2270692", + "15", + "50230332337520685819185379138149452056832273984668817287076054372737095794497", + "2270707", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2270711", + "13", + "26060925092766365537594808786411019471359171000744630748109876443668095574495", + "2270726", + "72", + "59459343261488222241516647373960842913983844065521095207405120949305175621737", + "2270800", + "23", + "108755407944954751424523955182999093272333942296063567678673195334683898056168", + "2270825", + "13", + "22018963762857268261670859061450709880770233577299661065335739506114948260887", + "2270840", + "13", + "27410879735734622901935339387522081912852630802358973783531965565496342592994", + "2270855", + "13", + "115051908501650433486349656472921125208288198903694481169626026310325357961367", + "2270870", + "13", + "60740395827095520779518889177055275450153884591539634076336325020431564259180", + "2270885", + "13", + "107608543370604485897185172608940593045601889266102192628086906595657461680354", + "2270900", + "13", + "54301232650620405282150921550704173106940321772844823253577771145810237274572", + "2270915", + "23", + "71001026239654102627783021045192028004378429518001617729030071341791993700678", + "2270940", + "13", + "39710331032306793130081840425783792614983779976172544992206655537207962881684", + "2270955", + "368", + "86228116464310301360748609286259135771787178854372648849330443378803188365171", + "2271325", + "13", + "90934068311573248722739105736697871875321060266296858867995899289609929170760", + "2271340", + "13", + "60305257785916118467838148903191765734542105780958274452012125448613510492887", + "2271355", + "13", + "51401161016891800236336681251420895859620859407315871435682395575461292037667", + "2271370", + "13", + "114177592566358431801118905052278585803747165624180204340602079186159186337997", + "2271385", + "13", + "35661633721065798164415647656008442441357723199639894901776828568429795199717", + "2271400", + "13", + "82349699136419260729230443597024633782650419044899208188595644723534136245953", + "2271415", + "23", + "69025101069346951954891138790729467561911682541231331355337876983949834338135", + "2271440", + "13", + "43406849504705766813672330637076814332626783947908226980978492522256322052223", + "2271455", + "13", + "15440490610290693769667909648934087358334865811320491223180387657859650330565", + "2271470", + "13", + "101964713174837234807848138856280220588136366074194237516902136033462236404731", + "2271485", + "13", + "105997758417939381780729164461854539956541824706340289421408142190097348892967", + "2271500", + "13", + "28293664940003478151276898044436426309475362961994627383454087843703219197093", + "2271515", + "13", + "81086627291954452130349548412898875706733522636406240105554011765340971112443", + "2271530", + "23", + "72640942761827334315861408342746491750707228201961321011312224914716610059208", + "2271555", + "381", + "33840524889259858333414022007684051439677150456073715913529506418358116235769", + "2271938", + "13", + "105946227983176322453887267764053751256522172809891671893946446751718853485449", + "2271953", + "13", + "22595354440732576425392828562541577548198859376250894026241317624038577550319", + "2271968", + "13", + "20735080705311195214497435069522671791599589004785685625907346304577792655026", + "2271983", + "13", + "3717365762107344560916051106621169961692354235759971629760655354282473666703", + "2271998", + "13", + "68683489074338144235560823860661221782129418929397392812363463286742922180268", + "2272013", + "13", + "45258559815785269488947491982280695712012831886878261760888502847292198939068", + "2272028", + "13", + "49068331313789774651664260109136845019112371397057062280767095425530508166733", + "2272043", + "15", + "42866694272843561216655084552054463702253369532658098965305760590461982875458", + "2272058", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2272062", + "23", + "13452234504386868024300380086452624521173045180735000414201203996374969250888", + "2272087", + "21", + "2516882355477689653480682651720422432222384971628206685919721968375084071062", + "2272110", + "13", + "67717854541806545879146558135668960658860285830505493770541267993000707799711", + "2272125", + "21", + "3180885961777905706120335813868067672297872833147344016828642602716765871269", + "2272148", + "13", + "105307210864548887535573007835558722068888893367639633587387049012908019345652", + "2272163", + "13", + "12768134566470995582764057350320150021729292616888699505893840628128007306324", + "2272178", + "15", + "61703941465235564090047569048521242612613733115950745635386679977961219640467", + "2272193", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2272197", + "13", + "352304168337812887967785102338327453972413431901628724773838900526380570280", + "2272212", + "13", + "21541427396646134104803824239554169320998824022482996201192644633993070817844", + "2272227", + "13", + "108712839909786098570999032775030610237052542651863731737221776493023558897377", + "2272242", + "13", + "30842377896707169066580849364607582142751707568073630837035141746986942573021", + "2272257", + "36", + "101631606894952747928372667614118201532579869183378626517739816407383121950103", + "2272293", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2272297", + "13", + "45992099988025865683067625033591460925902090396260789334126711471367000425997", + "2272312", + "18", + "47526585918989854830900804799384412735007966826051680446979175520559887998269", + "2272330", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2272334", + "155", + "92238284230275447675689003164036098486344446477384991430151443302770981428325", + "2272489", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2272493", + "13", + "75688085463112208987088477207381799661566839388531332561869644310083419771368", + "2272508", + "13", + "38163259503195403483842107750655621268609759837719564316535701393517188341763", + "2272523", + "13", + "51766413065712307825083095337541457781748304925116889398730811632539318687662", + "2272538", + "13", + "112551939080843303612511427122817842705674423188167498554341087120877783058051", + "2272553", + "13", + "105193811535542580637141816563277261137448564736345686805730683730741937888195", + "2272568", + "33", + "51185566474189321079313199641437131414920591732012712663071165309052890118227", + "2272603", + "13", + "76805679156363176957868890394140638133137778067104912738980399695263567714328", + "2272618", + "39", + "14093333600073593206250191256484550401514721317905141272317990813291797983934", + "2272659", + "13", + "90663817623605477526523143748596942518048077680062674853633824120631801114734", + "2272674", + "13", + "92378620427750605893727407350914891874123798377571678369049494973984675668282", + "2272689", + "13", + "81462533139870796175988831623605870310507911484871454579175552094369268197623", + "2272704", + "23", + "94831642400111668134733198591158936503505226287851557955034619473829492960395", + "2272729", + "23", + "15715011832978093245173673088951410696365572592972865536997607200576513473583", + "2272754", + "13", + "37959794424869967671951520859647034208937186725511979995416396185083474107343", + "2272769", + "364", + "73570037145074924376207425203414313098792984669962494219074542839904305812896", + "2273135", + "21", + "71912149988373534823333988897472062516110733476742624890118857409811302951862", + "2273158", + "13", + "92969431474449877997398271052720817776072602622303207897078411022490784600039", + "2273173", + "13", + "48223322899725661350216931143894854270789074290575038068815920112319896331367", + "2273188", + "13", + "24239842023625090742969717664583781733191293590703146593722243108162882505419", + "2273203", + "21", + "33797590529267400952470162676299880380103524729131606187233717840791323063611", + "2273226", + "13", + "85611908204867317363822548712877315799126060413495968584985583396976699439462", + "2273241", + "13", + "78055971213963855639433611741110131187637742103309386310586422272275843159653", + "2273256", + "13", + "44190694051865475145065411445671264701129711527715868275063855205720681168689", + "2273271", + "13", + "63109263541026814562695058501020054865604595058251352380318982771988237069808", + "2273286", + "13", + "85655342575202947367370764520717270539203408476043033343200674408269517419482", + "2273301", + "13", + "29330667365919874889580466549096210989402190893561358829896558417040601140318", + "2273316", + "15", + "92933721621340465162882999919496681751235238531175328260883889634561014604041", + "2273331", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2273335", + "15", + "75157105369245749776371848651135377732836746923748035041854729254077404496747", + "2273350", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2273354", + "13", + "99115721182987437908544511893189109380896577022455105558435746207832874036961", + "2273369", + "13", + "55181072994394712004725464108442580865822629026721778724207251703051165063461", + "2273384", + "13", + "49733592482627140815925535804823062589660936915003869798979654868429388357071", + "2273399", + "13", + "83879074632355062725941412228032871981899178275860482478822445576264155966325", + "2273414", + "23", + "87026141828509190413825465867999132191037286739113986633690485453098163927336", + "2273439", + "13", + "86311137709250797179230410727173416152320919703493094786908172589923629237476", + "2273454", + "27", + "91588853178519344831378494523223543948574728059102328366124983294203037985685", + "2273481", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2273485", + "13", + "59593668697032315490297292319850195112423621694974593388044049940624855417869", + "2273500", + "13", + "48206249183093295241511205280607891755818981062481119386123186268834564027115", + "2273515", + "13", + "103884090596045256649230952255995802297388154076335965769462190868831845158956", + "2273530", + "15", + "55071995515677942005477831570690270849578796434844850529546813104988971533660", + "2273545", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2273549", + "22", + "61677704043528762498668908741230755680401772683700568567609217935818023782514", + "2273573", + "13", + "88665894235731545806950637121015068548450374559749572699273666264185932257793", + "2273588", + "13", + "42342702638299191831072664123033132552756854514857603184894032046371883700603", + "2273603", + "13", + "42616428035343920816127850359824775019056586820051892019804076622058170589491", + "2273618", + "60", + "49660383232157800684891069272942641642755493180329243823499709362831363963390", + "2273680", + "13", + "82553507209180094877025148987428519469606410378324633698936423414710482732585", + "2273695", + "13", + "89765262767149696096031027169709122177426545865308614656506108435620404257975", + "2273710", + "13", + "44117247516472028516514196015322826197928068047992230749704026425558477644612", + "2273725", + "13", + "81455047520890812473163880114381906923195178177981741856936829261230035339568", + "2273740", + "13", + "91029927454867114709944443207985795767635544697527735492257867603973629254603", + "2273755", + "13", + "64634409512883308393731056542786258701069863267512254943889811204553538330140", + "2273770", + "13", + "8916470997323035504684138105114930962163923347346480321385750229806805588686", + "2273785", + "13", + "115390033550027412757993675183284780322511226856183920035626476334524069887581", + "2273800", + "13", + "89414587084100759176733110910823765359298720486127967829372126690063379493255", + "2273815", + "13", + "94101559349895398750339966655654135139453588861464609548572231592265122222669", + "2273830", + "13", + "71895358833990320556028528261998029462372620142058487339736001137062228821962", + "2273845", + "31", + "64905071884767670368638853556324805624646874704147066334927950462141728677715", + "2273878", + "21", + "111189087266794143158150421864191886535037543331909665606147691508907076715207", + "2273901", + "13", + "552683344713332275705658562291580644656610294627976405720649299230770672476", + "2273916", + "13", + "5419504063454618218843523901623816760002091898232477461287622052497744154633", + "2273931", + "23", + "36357252912472128365648121532283241506260417763224945559430262131343665082625", + "2273956", + "13", + "52728844592367855688730073033225390296963652590724170054648368711008652429253", + "2273971", + "15", + "6513439748644590633698485335307501633364564643196625204634754513655932171130", + "2273986", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2273990", + "13", + "53664486155040811623892370859894368461765217414215090858245043609980714971614", + "2274005", + "13", + "80750356051770599757143477317538840431479750414049020139450031095413315493420", + "2274020", + "13", + "44170059243939309615583402817213692517473429337866964922656866918317407644883", + "2274035", + "13", + "86761180335930791761296312146191897465700311051952904315972026105382853633530", + "2274050", + "13", + "3148257962744337082464638354611990422327497099896932111625811098525137986186", + "2274065", + "13", + "41238638637924119446298556899127714478382605267193578761734383482787892434952", + "2274080", + "13", + "3827914826917535469988788169354447227672970869086890122867846023570859221257", + "2274095", + "366", + "64713531846529596169973662360823053840661115927619674642606872754470697712978", + "2274463", + "13", + "34073704140565111185233666845273346453543063974668778726888441414152868976177", + "2274478", + "42", + "9741801428700007924023553406832493590361244759989138329835076204236698573426", + "2274520", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2274524", + "13", + "33157678654524600432967932881325894506693514427078003676872947920205383816131", + "2274539", + "13", + "82274285243027927135163362250458313620077337412481259315033696816695071962966", + "2274554", + "13", + "61905219055703587310447922381444603538224067455052180693739170161646317344206", + "2274569", + "13", + "109295591946199220713406463851822499518788146799399441146461127612624918109264", + "2274584", + "13", + "9679321425811673395243733849728728609910614284480804106377304172420445162841", + "2274599", + "15", + "77400580104748839600557012666185292075103759369095124524925691511007992983385", + "2274614", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2274618", + "13", + "17096237184588200685930185547059017625148073597210419901114122531607911043328", + "2274633", + "13", + "38468640427359885474552077323549074312308474788673662403318883371618841119343", + "2274648", + "13", + "97300780751369013566574705493094200434690844456167134140578862101840669057677", + "2274663", + "13", + "54636958088154111396724725812747377193726067759113012872115294394596445183853", + "2274678", + "21", + "65098396101912539352142601547637724172446574104574279088308808851886818878174", + "2274701", + "13", + "109802353012223215534633344130642902994307831223840801331799072199894294698292", + "2274716", + "13", + "2523700439463386419856910650254922830347173429208128775446580318548709984247", + "2274731", + "13", + "3948853393212046138164091772190649816773588195037970838604236455322659667814", + "2274746", + "13", + "99701624586582659967015121878716402265831949118220456023839676146604265683365", + "2274761", + "13", + "76391199978499573397453547496444186813855042569132542395238662836767782642444", + "2274776", + "13", + "53098026581408757586483226758389788785283864033165077314484568808161625551654", + "2274791", + "21", + "31749371499604142890178874833447706424161534124574105802604183989805254590196", + "2274814", + "13", + "112164381360247602594933306593823699138443817899283537992935931075813827047855", + "2274829", + "13", + "75636609247336213688178201473074569997497991430252526973306837976687551786686", + "2274844", + "13", + "37473963826752474771999309524081310447125644757540982160355720460970669753800", + "2274859", + "225", + "94877924725905917245976254298586867589924113738102489802615448399020691187081", + "2275084", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2275088", + "13", + "21424322251915011760457304058352897466514553363086817736093030455333485033287", + "2275103", + "15", + "35304760090550459700485563552543791950577403744278669997998979886418858759901", + "2275118", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2275122", + "31", + "76690686068159581513339381992667303049520214491463793263413097445363180516689", + "2275153", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2275157", + "13", + "38071302992902672670217620456140697088438581820198908983897690272977669005669", + "2275172", + "21", + "74062772662687791403197544986696686370932855968369635839156922067251311544383", + "2275195", + "13", + "46700405563823858749014678713554494319834011121907170089010399099756454317278", + "2275210", + "13", + "8360197310869401138898747984436519789425270006761454573364425154425397294061", + "2275225", + "13", + "37345737471962928321646795650221154936533218694709409582188888245924105284562", + "2275240", + "13", + "76329176045853327397827066926153425233263539377240458185231327522368659884668", + "2275255", + "13", + "51165095216412898665266098383199195993466108420832609966696157533973658887512", + "2275270", + "39", + "8694770951800705147288602006997578261088660472545167497867993454986774215525", + "2275311", + "15", + "2232998850732757996026835613652542242994469471222165064133301466852118947076", + "2275326", + "2", + "78338746147236970124700731725183845421594913511827187288591969170390706184117", + "2275330", + "13", + "56959477025172224455209639691228449581961339654408633081171384561252864362634", + "2275345", + "13", + "10893688972514420983117987293954356290386359441336972240383861536511860934194", + "2275360", + "399", + "53274788599268239546529822773925978916092142455549074124681282311879153182890", + "2275761", + "13", + "74299798615312998618478698245393781612899652464720274055652198245543220767597", + "2275776", + "13", + "92382115381821907922215673753072855145247673959821648259633950587471687917866", + "2275791", + "18", + "30172024673412102830121284456785764211979110438579097758830557403781776009323", + "2275811", + "13", + "36936527765950551676412164956756148227556267624811854840240040265229057689385", + "2275826", + "13", + "68419931065524346375303390552415953520841885773146565506619908716585705071710", + "861188609419564084015083556068676459166478778038881359457809452673842858492", + "142169183933652432380336624393897576851073070152193201252544990504594771245", + "3469611596332664218008507347870182155450945120872578171781621929919427297542", + "1120783225105500472886960707578856680524451699826408436808377624124459660804", + "3109412906550742373552260327593879584368267517865428559029589769160129002541", + "3243015875726958762897512282413425159040780330160415570645061436015993367756", + "2818177121361950092924800583196987650373841278319041492446377342321998652588", + "3026764980178574262222400636234638800181176342699805475714570982070282949979", + "550258153495008696661163036876812516525820967976066034994164769862516405820", + "416230735957070076441464414259160370865161595055510852601185576999032668223", + "363396650917283632181085178556077467549785065665433532524390812312011986350", + "3571297215599978199753087183833552560212724085727624994174662358904076635445", + "3202180765366681681299897553177352596039525911979182989539709446744568064417", + "2816977406181882372518626780849235479682916369335124865385603133614143752342", + "406592581932948285871592003286338979441279378428577342904106294745242755237", + "2383117637623135039657023767738790009854472901781671216340466928219542250961", + "478255279029967512224971320973143919374743701172368175727298367018241621807", + "2182585426434601707205492756477582277326526101185378732600770356004041810515", + "1222019694889770534963155149230951568090687448161383130526209150939783559152", + "2680780664537925978125503409174749238058535341332208959653559871549377030307", + "374337815963302084233382772039623608873075796940464245403650215830862222434", + "1494346327877591323134473742310434385695875446731862588284394068263255564212", + "642432568764147748591929734504195578406494764698542287643097285236249754744", + "1716868821333285070508982056691099191130906481275434356227562814747464613333", + "1251883991644952235549668171896829896820163225596644480680205788613431884636", + "1893207860042646798515101002703647088433427160068190981566349510553351972841", + "1146623148113124044615500954975749825786565292091391956725728380527171218948", + "810887733765759682831659580200238018996898940356558894659319201168420184361", + "1127103456941127679640348313742637629159290150436921991829022438606530256101", + "1716777801251652087993637374734275602212701547772866985632857690318635391741", + "2123895083757203596615040341098116758704155874955022431693045405135268726534", + "196568201005436923907044163927471611657789320612771531029076553558749654538", + "2936843461702900664933903606184290556828093876295442494769142357697108416825", + "3404305683532880034723798159037615212818659428073237353220185452679443733461", + "3393082602495152474126365926446991301599644697703144825691831280418466896665", + "1698603095046899192614569727641305963107176354227883071899839179061051826667", + "581847092499259015759035618673554986643663921729966197258143128306509779030", + "6710941353317542144541092667280849039693782493897957976061487176689942739", + "3061208232461674415218178326756345732408525194477397555793889395944111543", + "78856689713439591325909351765867990632796120058252883496361430249241332229", + "2511691852597988372209628188276609157336876551967975615350141341028099961461", + "1736355849000948534762651901635784302315550284057718769860747556699991694992", + "1068766622234613034208947310823919391697612574820827082976322734521167672963", + "244963516346766472510084835312603963239931928314614553570509095465528521648", + "2180733676293685867021179332443928495123972617804499355642274335091279358424", + "542431924236813677186724418323781046190424908329918861145840794400883874426", + "2551865283700752159237246162547864255771850941426743041352579017023618739545", + "310468010165055573926005567764274404782628189118021060330211550709104940361", + "140713772188804039847396337009134767591052110641975861816054621361000993173", + "2525226834592916959442393115378999183741656091501611133029330186192942843001", + "3212375519952365594243790907169599319681444370255987881456960371115719544622", + "567216303243442533194491670074381853118278735053887913407759255942312126322", + "1149185159326395029688630904925131469865638676476950027814142188273950180807", + "821820633082175265529194850164923651608617033162160031925347151019959101338", + "2935637088003399861563444809734099112949430299124865999374825434781861830620", + "1296947871509179871850043775278632097843685580675185198753771026885640727913", + "1573379742107982990727353922328000041826221372272014138568549290151945866991", + "394263145194521198352953229125913130988676607507566550397597440847448331386", + "437636362495576215040869956166471235864907721399533097668519285634741048918", + "2132677312674762857700150415399458886863108249730954652237929114978270111666", + "1642775369794069196479402911807153843567293618805455393017044512589422690251", + "942426450007951984392192518489622693591676006189251124100410682940938152006", + "1827907891968373889853027127372552236278229476140088058599427575974162229298", + "3354654977748220898199961468885812250363595669385088829787437394585961528317", + "2414253707697157190073454073585060616611824585124165552440404689163179888552", + "1650923232610209048646048765331314451833213723963088038196918339998167602887", + "113397139624633067633156422392410986513051598787077295869474052017943647167", + "609800328691744828410932737655983509359953128502675482761115364792378307459", + "243470528834137630788812617229740872592160129672441417060836905815720263878", + "2812364936821307249109539801075390289287077005652649771139659641438528529807", + "1692248309389430937135851295194988032115171677092177489452765802698504239092", + "1434253818636229821546897896352855897794349797959770470121327018154284149800", + "2010682451246294606734765618876503210280606839741293277430270051582816002888", + "1221576437511647981962606632093295582017856636222427289286502790227498576113", + "630768165082481412967237324400121001656500607983340003935478666043973159373", + "804550778255486359721534448038497007139100824549572392219025451401366654571", + "2509405422579278993467464802987442883923997756314350093904754698655272281435", + "230322511138199514444432916410872573354392476025877843612257669508718156168", + "434096614508797479463291690518814504168086788605958962461649211197925570692", + "1501811813258361604071078006468632491988688644702953825498108954920519520008", + "2882982445519693408857052804061410678843841563008654228812807663226439561752", + "518869548748741950356062444028433245632475224810625612452721570315254285154", + "2595229702210972170795870914076768975618309054211788285044916702359112663819", + "2789475747320341346714869090990098730825471290243867544939257356032422631927", + "3021423904136100399420564756125538866649443384218345759132762767488927121901", + "3470072539146028737697831059922285349625921745686943456098631834736538513230", + "296832114912645368383858205207698130752073611255689118024692618517239185691", + "2562673875044080168939281665245533457996357295390300507103545024746030199615", + "3572176640836192239415456157280369916561273295658442093353040206706054951045", + "2848158501354991175021646799538038067563488282479904337827371395065278495157", + "102950434812874625402097083157182824861858194414063711174166419600553014181", + "1486323433493324402524888070458829882551243518422048250698374833559089260820", + "3208814801214087779688248916776721010687354077056081723931202672773878888941", + "2791567775849532297181476147696583719220230115011530058335644680117172080123", + "2235032008321774486325763532722701935219503936929081481682516227864367568407", + "592284390184751479985931280444783054260246785281850795678418559337548629734", + "390683870566096622968833817313745177669500468120625014424115528998810399779", + "3110691796330732484439006901404700651354694372816443484753104198586884384651", + "2444614225556616965677631614072556335440465173131661092997431343602506179484", + "2386506893371035367797010929557965767594569328487056274732669316394593214090", + "985718089293755807100092882514673037718074802425850404888611296905880615735", + "2365313498788565081614723939935710915555438624324335421229411011850664978462", + "2751609933031503045570717838909537391508339073565113369646306686587414634645", + "709418963298017268861363387108720702487826680412475179177944279942789785420", + "1907361680299590730675954600213074559334267264715916003088596512463555159119", + "3276563199475151306050538563091086553070251481701780021983716540769405628800", + "2972642734182643475394568567170312432365860846563755432529810857275455081499", + "425164320957393025437358755230063011507729374914138588988244646111343301823", + "3559707156732813327444472961623408136363819685273216405824028443892009501595", + "1627154000312260994431362465796048237259205663643677826240173075754304409976", + "978917089820616846266957253956461358728442465542876496262477450769874236376", + "346355236078510422426265313193171280607329136716705847231631007951611512698", + "316179610607211928380094103319534007928433340147182435947697504273517696615", + "2769473235676236857837052240478468885386654130708654974522904007205212947198", + "3273703505418872921921958863206735880229665688062763137606839754576556254611", + "3397427904428479816149340714385029180783089428338888559696506253876730991035", + "273396532134878085479258931108469249048622026285347764422481613061299287009", + "3565069599248317153452884864831279625076552078403945764722732447257084736088", + "3051414564343916789546958768334277845488736407740466494549809448179734756312", + "146750697919270022094432517700325927863514826787632368889893659520102633886", + "701885260756582344676704802559552925454358940676394084440223717957719805026", + "3428007399814096673254036282132435555425508460792469804428790971897733462163", + "914185908163270002133628759218993144034609160669792554111753479796045908313", + "524364526989685374907470318832186811437138954579977221453380381545518003033", + "1750700714903697708789718769124617152122195697123766484866944410868161971334", + "3287364644433022347116471045093230276031351368680760941129736750525087364830", + "2936398610182025614221594764943387849186676585211507577448788438498363417741", + "2353806544362665801840851354402231997471386461910141989996204623012395190376", + "1970141484971479373367527464449730593831874109262958782830543219487755255549", + "2393001591091529634760775424274881106661161797787191264296704494135080081377", + "2986606227259797722728369872804687298312253404217711972276159885672395255781", + "1895946695404106706947665326066559408208472176175703435285956512475957975543", + "1762356880044076889133856391675955384742710633798060761092994744648803681186", + "2376332339438019949540406736683284669215436558764141646234289425872250407714", + "1454976756676506843834296852446961771834473533454679073022417832857844894280", + "3548717794036887389548126075656668467057503009362313380257306181680385432581", + "965241988315227716419528016626328013623255115148047367598661016235428881472", + "364880470834340305656935466216573841491934395424487640998741517728075702652", + "2943398669550548190119897431262450183350472258799776593046925981023716929613", + "1448893857877452099597797155990678455277492286196553328412559163460378406221", + "1967481703172034532302291358157585036772430714320826461895477504253467787953", + "1325116985943935753797887026630510021999397105461424798371959688253221720342", + "2244622584920201730469439979893779654797150697429908221750550695114727636643", + "169421573908055569991679575627836830771160548739798159322462977095419291543", + "3095353763021763132566808185927306376406441767197745234247623641668407026312", + "1637340732530826646685902483519187879128294395545641724746044080108537320120", + "2294638457073272537380020652695805717451239479365560694926997691483900522709", + "1511366086802150243381238347922537557119352659921740484743601427611619799947", + "449428874493014357689284337690118381073239027368218521143371134362111769967", + "789682299596422945430069482574964319996794394882071176174058195011249469236", + "1084646862036354820409677700650699471864689661540217570329038731766739745205", + "78313880568815415355689662768930383042413140407006907408827845898228459940", + "356730105053361007857946113733839271044570452187014785515057265402328900429", + "234447037302476071968955219443368291760842844044519645486061976938132001423", + "2864422421311223063065427107781164541105240179822943356994920660882030317191", + "3220645513991770454830495359216702225738943217482751372374718117330072393321", + "35463109005973856944267069961705373986481909202559901998341156287817035506", + "952685587725119719066600350420803913063772382660689573594377138248265145726", + "752278194749177501493207399775926786061969166389064447953421142385745746087", + "2407348891063562262340882487501047709565400595257319006697201502933032707705", + "2463236356334325311251324372658459484411355441347448855372618996173032798473", + "2238179254064346364750464242776610666087953652801062085815768413875346396670", + "2802067085290870597935376309647815417818438178673940519081066667085272619330", + "2850335204360184195160225792945229847649912882393119826243003484121732080190", + "2470906391011157074848813029116011314321612957249816861338213895656078721145", + "2719124002389172942986323146717035094528812523569546471352767152752445448963", + "2231066334653800932432384670741847975321040198568834250178859804516478952571", + "2007545335999051836581333921231488913131319511359925956916354095167897717684", + "900055562911287563940939510518487860351444667545109216940154217563401258097", + "1785540044869890181738962662522696257112879586388985307150812891597163215144", + "3124957575510209676082035971129521944842511675997179494828222629358951850767", + "1043583892633525799267826910378029686330928692101917134824866886797301795924", + "2263814851238579887064085298532078321704597461027488639412693726621149012246", + "2178509090720733389462854288103494638309930461144580510806584326405126010226", + "3476125633826865086547635951618454636451132068386227939577574613425245274771", + "2259455312626966012641202975060147344918171603610064951002792385026849505887", + "305098219340569262959057929565627812075087945751515521330521567108712996106", + "2181302674128260211904148775356825065078036339592813338196413555567742282640", + "760001455233186214410668552162505595305171111386683529356117224501683716324", + "354000225697404900870934738845677552563144002135569724070635649184053068105", + "399746424720372601138503667692569207016506368222915655998246787269616563724", + "554038204075908614213636945466743711617750620995687318831362470141508850409", + "2414771763935056185515481317306102708097824540261617925672175647015584206638", + "436746505235351055124662611865059320594057790450596556503388308755572767601", + "1904032220774100883797625565070536195320261418193481759584640157146933348823", + "1585439592880267412357132988830450467294429187320155238313804981684103525304", + "2322641174567695905841903688399071847554604969491382105191878122061642897018", + "602944564805727049733612211740339068742069094439594360678132608096168984979", + "1208816517344716362456642101212950321451690046312184637589966461797871634826", + "1163748913684498566654974106370875829814517662801941919875773020671871445098", + "959518410079127715364330421000746491444338089403401618253019546230069982226", + "1675448091199059377170355681736783139463972613557485608633727295912202124848", + "1338461125234499703535531840041244336562142530765501780376258549778937873027", + "316789915981552919902716897538992166283892819738045579523670056652962656888", + "227955266610905211997334709807725722601588305008304119214249131018436323179", + "3381709505301028886192008685347707064024982525465981014487000424583724835047", + "451365838752100251651348038508237755501866172396086100168483912659280171734", + "1699997412555572818497550806208645583147667168198229131308436528170087009843", + "1465618277854710037531614366862433171917180117646667450615728687783059195833", + "381563838882669571134823269935860235474773812088273508885326290803258788424", + "3229122275928244842779644396992588751080818603473878466826718848082184225800", + "545387606087798164201110498513880963313000432429739921745585781892827620714", + "1208843514159268800663356459448970743482977805309097336706069141333928090126", + "3081663276582045868670977015875591027712331446847140634196640892417602385042", + "2291459491084933902041971665587536796091610110151808783511318573418867613127", + "2579771028898170514367854798207663546250691197248404002132166532149500283094", + "1777677994552518087374208961183375546840369438269188915624159194157076605380", + "422750871133655539833057120264959405545699402290245738869892411959027543551", + "492105516878092234407177319016174343957353422311138711424918171234565348986", + "1997967498961771614767095518974654922072224379745382308582938497617164686599", + "2304519903845617059363343833017194483031025019549672838855236609160222467365", + "2037374818970872092183633157023568593809011066091700956119322729105523014752", + "636153306624412577699280395923794564102367218463095219467229164563422015965", + "1328970312319045443911038331054000465835381334923381537091318109029345297339", + "1082674288667004001861638703121367025882049837457398286907762890864425846595", + "1543133337879949191106127951281603263108678831179403122875709477973408634234", + "1905375318811423424712042847444525894516840487996533927079091730368193537367", + "2651452647531898083081421692466881636074162574420661632112604368377034534873", + "3439901802466664016217956018725281603223385619234730842239164643504294950421", + "1443707951733771578508504623874685583067806190341928981999870884162098791029", + "19187465678615367566037675296367650342991516934889422972543839982073838308", + "3159344563370380045122321632113041403581194950834353484256587676167443492473", + "2535058710022946254196420242835973894386237482165006464554303013112854234308", + "2533404330028318305658063438235289234738359608848155038189233299207833719466", + "247140142821206022719057061597808887064858561859040104053312898890139793605", + "2515475874044065763107644236201597744513003147172500758001764952901826639170", + "1606182728937939913503915284073016241541643250868645854306908600376258372854", + "2704345336818944808163488926211595770342366650429972372904237916877697933890", + "3477809458907892176598592002154905922508759789345810763617372614186434974879", + "1353070205347713666351222548360697785337466176163739008008203029676702241524", + "2486995756785466441560055616765927902119197147714703044730735680601235679713", + "2676016451894542161844447636669903736203432411684743089788676004126118646443", + "2398895504226657284425306915928410731335098952170094535121452722159706389076", + "2239569092251890704279258123611921328787842267278251340748069435550379098577", + "2564330015787539727359700428301176920917076956693456991714848982708804202178", + "2892003336524304503545781706362133757665371608867888384068674117354306183774", + "1903443365794668136223397001294311391096789080380048487334795513758317962655", + "1845213504315532531064618105258155515949624940429872146623399030317040750435", + "1572059801848264322896597464575753794067171900058472370000596282550420744260", + "6799394487666764881370838689361824361195279802524726680585941417312696717", + "3497800705422481130531985782551507934273110167710848792228344934912929059019", + "2039451191166655550961667769072671543028963574744944718127079086545241018123", + "1381611106704896200142046525539531778217780460040076466592167235185869223523", + "2284837010474970189156574090064312845595668863684423526506998525924184226942", + "2853634638693036507172406509231762001156732526154224301004576497686958171868", + "115361031826947783113569769012489635432051339124039379484672548872245117930", + "2758790354713409492048663080335963047613400294462365114741343950961217313373", + "1418033626146774244049004361471532687712701849587621784444624364295939734899", + "795261739013585270722925143244842683567622304320596485343541001696326805409", + "975036563637557276193061080456064217187689026982310633242626933360145174991", + "1341234347475160929733826826982973681419938456208862179841623721756763932164", + "2451440061706370067883702393073771679325794890860375459204301869186893679177", + "1980903426900734452211358520187861857298342051445852122163213552218694767781", + "2122646717105342807380734101698698825216226769742570741618932185473597891170", + "1446307280231779270014643473172919715425826105025476020078029270709450229973", + "2432030101786106351553013637665908340613427075909648499685419582078117461484", + "240863509881275778911612615140219342484299816835792356948243889225183584998", + "2640497825282391992894113737542622435936690904631354045597848233846740849201", + "2957842877858826718564636415880893029786492524571917343268496216484818447454", + "1107572147290276598511260800766004476775289192116241104664234707914144984522", + "2929022399969869417658883061182255351433026349027286013934562886835852304805", + "2015954564455252396117910517671968966657174893041698274583685548761989465869", + "1047232942496770226131072810890531616863788923606886694941294090055331083297", + "2603165995764421054266947249597916356455949374049327099629110196805599690398", + "3178438030933303030296314146514319337448377010888123585240676253016848544924", + "1205036124728126013443049262820495401935766458617781953075081357123366373358", + "2859071470903123215941379173616378765201138164489966743921998749898784038260", + "495629542948242330406793497348190807517544509817118954026760747106255957843", + "2485968859119873746753392015904479404142774373000270829706421244984290479229", + "1109938482118692492079335381688463364857692544498421523494146971183482279398", + "3467942464842524535447312618038774425601167550490936041206414140186281753555", + "1697094864697730934551685518599365314517885702791790177430086252698604132625", + "1182522281365162709665580610038546439203976792105772581138557260282413339226", + "3602750309865719399531612416079109940347494444518133603094383879808771533878", + "726162074880131088492127584761223503250140802961950104590801495971920783324", + "2702711139218570391989114447285447716528174571087566071101996482939011620583", + "626918669206429324146316130074740537497468312715039913892232997294678254482", + "1173634494310687204996944643080826184642119267303996441290549321256778832310", + "2236028653577525715587031077010201854858546916782669302107650836994224782362", + "1406284570482579351411295180877941322895051278168578202813022614699763019785", + "3582714780704727321154655511991682460660998075499719278312356603861359304241", + "745754906463186079309916658460224416697349781327698908552453469527113060685", + "3108484778555354241102246010985306823216416374250779070070282861250540745099", + "1473460922097070038404187709358028262948785219277892941528673113402833339413", + "1933051635790941272072407214641350282116556087285958257450309399223640754222", + "2214807174148262592184483089027274211735313220687115252715771700415773617091", + "2685995859199255735908931833227218111970218952013763995869390604684794213360", + "2076946837981690174016457284072413597786014029624352945870476579904117265731", + "1411592527736154033597614685133849488044445632571645914052068241835307426655", + "9144483735458468465869145251434357970770374538461244223904262638033354716", + "3046516396230573134330664409547084681796979465193022532488546214762559533560", + "1269880941960518141121487029271360252283761921819689106740884103406851081193", + "167919751045922404470403821095219172832068346192445578106780616576745571952", + "490473839282914456610657040790181292799816203427869870111950927042219165359", + "1872638411447472972998138987397795894653212492570434463817786355427301454595", + "1093199526301354028293336415723351778627940319301628190945691077485785004611", + "1520936286506615456350667809541660910065200949163459142701762137750817293073", + "2790679280848501832107568777301296835751977659482291965921382563508358074274", + "675473802100924139654691630254806397954815518786006019121910233568774810804", + "2433396182903790226479160672278353366013121312445713562886171704351781750097", + "3260013426325476537931435767983411651603999651030224847777480176107129898714", + "1438148345761987421561558574735843211494706875722043389711513221682081904215", + "624154737344416215382306902613934981314994424462002321816823740770873052810", + "3364301920688053143551586712567939689977855041388070008552185235325830012062", + "2742607410429140355505366222756016022624428305509523620471032129641760085291", + "834240928133332873967572763960120336410554032725539634170571207479303927637", + "2693551910222869100808470627750063997576571726544082775086617714497310627108", + "2496672517668546063801485485101257007469619195579455116580093831122412148295", + "649544699826039218830738029380235641854027202144223059213775638936251543855", + "1290615906997290748208255360740731454289981570772397658879970024524871460003", + "632567800935459049740744098083221187821104059314788313978689913263252688789", + "2348437863095261407316568167910979152453013572595655851042083255625006891624", + "2481215200769461327932558612643415039838457081027256604870638707666156202850", + "57122707881135124965534576605147904075123889890659190204392608475906841103", + "2439476559823258978320004142231553407228843241022947558491415430683059942123", + "2561322912744615171166894324106518420053898199929890610436084715445762908107", + "3232402799020273123701672899620163879959024531795856118904701543579107478288", + "438963245466416667030274468984203196494549069586215159473149318689786606805" + ], + "cairoVerifierId": "7" +} diff --git a/src/error.rs b/src/error.rs index 31e4cdf..fc5277e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -19,6 +19,9 @@ pub enum CoreError { #[error("transaction not succeed {0}")] TransactionNotSucceed(String), + #[error("flow not finished {0}")] + FlowNotFinished(String), + #[error("not found")] NotFound, diff --git a/tests/flow_test.rs b/tests/flow_test.rs index cd5b8dd..bbdb425 100644 --- a/tests/flow_test.rs +++ b/tests/flow_test.rs @@ -1,12 +1,18 @@ #[cfg(test)] mod tests { use std::collections::HashMap; + use std::fs; use aptos_sdk::types::LocalAccount; use aptos_testcontainer::test_utils::aptos_container_test_utils::{lazy_aptos_container, run}; use log::info; use test_log::test; + use tokio::time::Instant; use verifier_onchain_services::config::{AppConfig, EnvConfig}; + use verifier_onchain_services::contracts_caller::gps::types::verify_proof_and_register::{ + VerifyProofAndRegisterData, VerifyProofAndRegisterDataJson, + }; + use verifier_onchain_services::contracts_caller::gps::verify_proof_and_register::verify_proof_and_register; use verifier_onchain_services::contracts_caller::verify_fri::sample_verify_fri_input::sample_verify_fri_input; use verifier_onchain_services::contracts_caller::verify_fri::verify_fri::verify_fri; use verifier_onchain_services::contracts_caller::verify_merkle::sample_verify_merkle_input::sample_verify_merkle_input; @@ -23,8 +29,8 @@ mod tests { LocalAccount::from_private_key(module_account_private_key, 0).unwrap(); let sender_account_private_key = accounts.get(1).unwrap(); - let module_address = module_account.address().to_string(); + let config = AppConfig::from(EnvConfig { node_url, private_key: sender_account_private_key.to_string(), @@ -32,27 +38,47 @@ mod tests { chain_id: aptos_container.get_chain_id().to_string(), }); - let sequence_number = config - .client - .get_account(config.account.address()) - .await? - .into_inner() - .sequence_number; - config.account.set_sequence_number(sequence_number); - let mut named_addresses = HashMap::new(); + named_addresses.insert("lib_addr".to_string(), module_address.clone()); + named_addresses.insert("cpu_addr".to_string(), module_address.clone()); named_addresses.insert("verifier_addr".to_string(), module_address.clone()); - named_addresses.insert("lib_addr".to_string(), module_address); + named_addresses.insert( + "cpu_constraint_poly_addr".to_string(), + module_address.clone(), + ); + + let now = Instant::now(); aptos_container .upload_contract( "./contracts/navori", module_account_private_key, &named_addresses, - Some(vec!["libs", "verifier"]), + Some(vec!["libs", "cpu", "cpu-constraint-poly", "verifier"]), false, ) .await .unwrap(); + info!("upload_contract: {:.2?}", now.elapsed()); + + let now = Instant::now(); + aptos_container + .run_script( + "./contracts/navori", + sender_account_private_key, + &named_addresses, + &vec!["verifier"], + ) + .await + .unwrap(); + info!("run_script: {:.2?}", now.elapsed()); + + let sequence_number = config + .client + .get_account(config.account.address()) + .await? + .into_inner() + .sequence_number; + config.account.set_sequence_number(sequence_number); for i in 1..4 { let (merkle_view, initial_merkle_queue, height, expected_root) = @@ -97,4 +123,93 @@ mod tests { .await .unwrap() } + + #[test(tokio::test)] + pub async fn verify_proof_and_register_test() { + run(2, |accounts| { + Box::pin(async move { + let aptos_container = lazy_aptos_container().await.unwrap(); + let node_url = aptos_container.get_node_url(); + let module_account_private_key = accounts.first().unwrap(); + let module_account = + LocalAccount::from_private_key(module_account_private_key, 0).unwrap(); + + let sender_account_private_key = accounts.get(1).unwrap(); + + let module_address = module_account.address().to_string(); + + let config = AppConfig::from(EnvConfig { + node_url, + private_key: sender_account_private_key.to_string(), + module_address: module_address.clone(), + chain_id: aptos_container.get_chain_id().to_string(), + }); + + let mut named_addresses = HashMap::new(); + named_addresses + .insert("lib_addr".to_string(), module_account.address().to_string()); + named_addresses + .insert("cpu_addr".to_string(), module_account.address().to_string()); + named_addresses.insert( + "verifier_addr".to_string(), + module_account.address().to_string(), + ); + named_addresses.insert( + "cpu_constraint_poly_addr".to_string(), + module_account.address().to_string(), + ); + + let now = Instant::now(); + aptos_container + .upload_contract( + "./contracts/navori", + module_account_private_key, + &named_addresses, + Some(vec!["libs", "cpu", "cpu-constraint-poly", "verifier"]), + false, + ) + .await + .unwrap(); + info!("upload_contract: {:.2?}", now.elapsed()); + + let now = Instant::now(); + aptos_container + .run_script( + "./contracts/navori", + sender_account_private_key, + &named_addresses, + &vec!["verifier"], + ) + .await + .unwrap(); + info!("run_script: {:.2?}", now.elapsed()); + + let sequence_number = config + .client + .get_account(config.account.address()) + .await? + .into_inner() + .sequence_number; + config.account.set_sequence_number(sequence_number); + + verify_proof_and_register(&config, &sample_vpar_data(1).unwrap()) + .await + .unwrap(); + Ok(()) + }) + }) + .await + .unwrap() + } + + fn sample_vpar_data(test_num: isize) -> anyhow::Result { + let data = serde_json::from_str::( + fs::read_to_string(format!( + "src/data_samples/gps/verify_proof_and_register_{}.json", + test_num + ))? + .as_str(), + )?; + Ok(VerifyProofAndRegisterData::from(data)) + } } diff --git a/tests/memory_page_test.rs b/tests/memory_page_test.rs index f31a3d5..c40dc23 100644 --- a/tests/memory_page_test.rs +++ b/tests/memory_page_test.rs @@ -4,6 +4,7 @@ mod tests { use aptos_sdk::types::LocalAccount; use aptos_testcontainer::test_utils::aptos_container_test_utils::{lazy_aptos_container, run}; + use log::info; use test_log::test; use verifier_onchain_services::config::{AppConfig, EnvConfig}; @@ -31,36 +32,56 @@ mod tests { chain_id: aptos_container.get_chain_id().to_string(), }); - let sequence_number = config - .client - .get_account(config.account.address()) - .await? - .into_inner() - .sequence_number; - config.account.set_sequence_number(sequence_number); - let mut named_addresses = HashMap::new(); + named_addresses.insert("lib_addr".to_string(), module_address.clone()); + named_addresses.insert("cpu_addr".to_string(), module_address.clone()); + named_addresses.insert( + "cpu_constraint_poly_addr".to_string(), + module_address.clone(), + ); named_addresses.insert("verifier_addr".to_string(), module_address.clone()); - named_addresses.insert("lib_addr".to_string(), module_address); + aptos_container .upload_contract( "./contracts/navori", module_account_private_key, &named_addresses, - Some(vec!["libs", "verifier"]), + Some(vec!["libs", "cpu", "cpu-constraint-poly", "verifier"]), false, ) .await .unwrap(); + aptos_container + .run_script( + "./contracts/navori", + sender_account_private_key, + &named_addresses, + &vec!["verifier"], + ) + .await + .unwrap(); + let sequence_number = config + .client + .get_account(config.account.address()) + .await? + .into_inner() + .sequence_number; + config.account.set_sequence_number(sequence_number); + + info!("Registering continuous page batch"); let register_continuous_page_batch_input = sample_register_continuous_page_batch()?; register_continuous_page_batch(&config, register_continuous_page_batch_input) .await .unwrap(); + info!("Registering continuous memory page"); let register_continuous_page_input = sample_register_continuous_page()?; - register_continuous_memory_page(&config, register_continuous_page_input).await?; + register_continuous_memory_page(&config, register_continuous_page_input) + .await + .unwrap(); + info!("Registering large data continuous page batch"); let large_data_register_continuous_page_batch_input = sample_large_data_register_continuous_page_batch()?; register_continuous_page_batch( @@ -69,6 +90,7 @@ mod tests { ) .await .unwrap(); + Ok(()) }) })