diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 0cfe5073..75794795 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -117,10 +117,10 @@ jobs: include: - type: wasm target: wasm32-unknown-unknown - exclude: scroll-engine,scroll-wire,scroll-bridge,scroll-network,rollup-node-manager + exclude: scroll-engine,scroll-wire,scroll-bridge,scroll-network,rollup-node-manager,scroll-indexer,scroll-l1,scroll-pipeline,scroll-primitives,sequencer - type: riscv target: riscv32imac-unknown-none-elf - exclude: scroll-engine,scroll-wire,scroll-bridge,scroll-network,rollup-node-manager + exclude: scroll-engine,scroll-wire,scroll-bridge,scroll-network,rollup-node-manager,scroll-indexer,scroll-l1,scroll-pipeline,scroll-primitives,sequencer steps: - uses: actions/checkout@v4 - uses: rui314/setup-mold@v1 diff --git a/Cargo.lock b/Cargo.lock index b73db196..26815bbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -696,6 +696,7 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6b7984d7e085dec382d2c5ef022b533fcdb1fe6129200af30ebf5afddb6a361" dependencies = [ + "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck", @@ -714,11 +715,13 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d6a9fc4ed1a3c70bdb2357bec3924551c1a59f24e5a04a74472c755b37f87d" dependencies = [ + "alloy-json-abi", "const-hex", "dunce", "heck", "proc-macro2", "quote", + "serde_json", "syn 2.0.98", "syn-solidity", ] @@ -1632,6 +1635,10 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +[[package]] +name = "codec" +version = "0.0.1" + [[package]] name = "coins-bip32" version = "0.12.0" @@ -2071,6 +2078,10 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "database" +version = "0.0.1" + [[package]] name = "debug-helper" version = "0.3.13" @@ -4887,6 +4898,10 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "provider" +version = "0.0.1" + [[package]] name = "quanta" version = "0.12.5" @@ -8000,7 +8015,10 @@ dependencies = [ "scroll-alloy-network", "scroll-alloy-provider", "scroll-engine", + "scroll-indexer", + "scroll-l1", "scroll-network", + "scroll-pipeline", "scroll-wire", "secp256k1", "tokio", @@ -8387,7 +8405,10 @@ dependencies = [ "scroll-alloy-provider", "scroll-alloy-rpc-types-engine", "scroll-engine", + "scroll-indexer", + "scroll-l1", "scroll-network", + "scroll-pipeline", "scroll-wire", "secp256k1", "serde_json", @@ -8422,6 +8443,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "scroll-indexer" +version = "0.0.1" +dependencies = [ + "scroll-l1", + "scroll-primitives", +] + +[[package]] +name = "scroll-l1" +version = "0.0.1" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "futures", + "scroll-primitives", +] + [[package]] name = "scroll-network" version = "0.0.1" @@ -8448,6 +8487,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "scroll-pipeline" +version = "0.0.1" +dependencies = [ + "futures", + "scroll-alloy-rpc-types-engine", + "scroll-primitives", +] + +[[package]] +name = "scroll-primitives" +version = "0.0.1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "reth-scroll-primitives", + "scroll-alloy-consensus", +] + [[package]] name = "scroll-wire" version = "0.0.1" @@ -8577,6 +8635,18 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +[[package]] +name = "sequencer" +version = "0.0.1" +dependencies = [ + "futures", + "reth-scroll-primitives", + "scroll-alloy-rpc-types-engine", + "scroll-engine", + "scroll-primitives", + "tokio", +] + [[package]] name = "serde" version = "1.0.217" diff --git a/Cargo.toml b/Cargo.toml index 384e0718..ceddac8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,8 +11,15 @@ members = [ "crates/engine", "crates/node", "crates/network", - "crates/scroll-wire" -] + "crates/scroll-wire", + "crates/primitives", + "crates/l1", + "crates/database", + "crates/indexer", + "crates/sequencer", + "crates/pipeline", + "crates/provider", + "crates/codec"] resolver = "2" @@ -111,6 +118,7 @@ alloy-primitives = { version = "0.8.15", default-features = false } alloy-rpc-types-engine = { version = "0.11.0", default-features = false } # scroll-alloy +scroll-alloy-rpc-types-engine = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api" } scroll-alloy-provider = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api" } scroll-alloy-network = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api" } @@ -132,7 +140,11 @@ reth-scroll-primitives = { git = "https://github.com/scroll-tech/reth.git", bran # rollup node scroll-engine = { path = "crates/engine" } +scroll-indexer = { path = "crates/indexer" } +scroll-l1 = { path = "crates/l1" } scroll-network = { path = "crates/network" } +scroll-pipeline = { path = "crates/pipeline"} +scroll-primitives = { path = "crates/primitives" } scroll-wire = { path = "crates/scroll-wire" } rollup-node-manager = { path = "crates/node" } diff --git a/bin/bridge/Cargo.toml b/bin/bridge/Cargo.toml index 5d1ebb3b..d4bafd75 100644 --- a/bin/bridge/Cargo.toml +++ b/bin/bridge/Cargo.toml @@ -41,6 +41,9 @@ reth-scroll-primitives = { workspace = true } scroll-wire.workspace = true scroll-network.workspace = true scroll-engine = { workspace = true, features = ["test-utils"] } +scroll-l1.workspace = true +scroll-indexer.workspace = true +scroll-pipeline.workspace = true # rollup-node rollup-node-manager.workspace = true diff --git a/bin/bridge/src/network.rs b/bin/bridge/src/network.rs index d867f866..81e96824 100644 --- a/bin/bridge/src/network.rs +++ b/bin/bridge/src/network.rs @@ -6,10 +6,13 @@ use reth_rpc_builder::config::RethRpcServerConfig; use reth_scroll_chainspec::ScrollChainSpec; use reth_scroll_primitives::ScrollPrimitives; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use rollup_node_manager::{PoAConsensus, RollupNodeManager}; +use rollup_node_manager::{Config, PoAConsensus, RollupNodeManager}; use scroll_alloy_provider::ScrollAuthEngineApiProvider; use scroll_engine::{test_utils::NoopExecutionPayloadProvider, EngineDriver, ForkchoiceState}; +use scroll_indexer::Indexer; +use scroll_l1::L1Watcher; use scroll_network::NetworkManager as ScrollNetworkManager; +use scroll_pipeline::Pipeline; use scroll_wire::{ProtocolHandler, ScrollWireConfig}; use tracing::info; @@ -64,6 +67,7 @@ where let consensus = PoAConsensus::new(vec![]); let payload_provider = NoopExecutionPayloadProvider; + // Create the engine driver. let auth_port = ctx.config().rpc.auth_port; let auth_secret = ctx.config().rpc.auth_jwt_secret(ctx.config().datadir().jwt())?; @@ -73,13 +77,23 @@ where ); let engine = EngineDriver::new(engine_api, payload_provider); + // TODO: Provide this via config file. + // Create the node config. + let is_sequencer = false; + let block_time = 2; + let config = Config::new(is_sequencer, block_time); + let rollup_node_manager = RollupNodeManager::new( + config, scroll_network_manager, engine, + consensus, + L1Watcher, + Indexer, + Pipeline, ForkchoiceState::genesis( ctx.config().chain.chain.try_into().expect("must be a named chain"), ), - consensus, new_block_rx, ); diff --git a/crates/codec/Cargo.toml b/crates/codec/Cargo.toml new file mode 100644 index 00000000..32c16705 --- /dev/null +++ b/crates/codec/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "codec" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] + +[lints] +workspace = true diff --git a/crates/codec/src/batch.rs b/crates/codec/src/batch.rs new file mode 100644 index 00000000..2960f8bc --- /dev/null +++ b/crates/codec/src/batch.rs @@ -0,0 +1,2 @@ +#[allow(dead_code)] +struct BatchCodec; diff --git a/crates/codec/src/chunk.rs b/crates/codec/src/chunk.rs new file mode 100644 index 00000000..9854e800 --- /dev/null +++ b/crates/codec/src/chunk.rs @@ -0,0 +1,2 @@ +#[allow(dead_code)] +struct ChunkCodec; diff --git a/crates/codec/src/error.rs b/crates/codec/src/error.rs new file mode 100644 index 00000000..945e0178 --- /dev/null +++ b/crates/codec/src/error.rs @@ -0,0 +1,4 @@ +#[allow(dead_code)] +enum CodecError { + Error, +} diff --git a/crates/codec/src/lib.rs b/crates/codec/src/lib.rs new file mode 100644 index 00000000..df2c566b --- /dev/null +++ b/crates/codec/src/lib.rs @@ -0,0 +1,6 @@ +//! Codec is a library for encoding and decoding data relevant to settling the Scroll rollup to the +//! L1. + +mod batch; +mod chunk; +mod error; diff --git a/crates/database/Cargo.toml b/crates/database/Cargo.toml new file mode 100644 index 00000000..e406b8f0 --- /dev/null +++ b/crates/database/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "database" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] + +[lints] +workspace = true diff --git a/crates/database/src/lib.rs b/crates/database/src/lib.rs new file mode 100644 index 00000000..ed5b3365 --- /dev/null +++ b/crates/database/src/lib.rs @@ -0,0 +1,5 @@ +//! A database implementation for persisting data. + +/// A database implementation for persisting data. +#[derive(Debug)] +pub struct Database; diff --git a/crates/engine/Cargo.toml b/crates/engine/Cargo.toml index e78a4945..29263b8e 100644 --- a/crates/engine/Cargo.toml +++ b/crates/engine/Cargo.toml @@ -19,7 +19,7 @@ alloy-rpc-types-engine.workspace = true # scroll-alloy scroll-alloy-network.workspace = true scroll-alloy-provider.workspace = true -scroll-alloy-rpc-types-engine = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api" } +scroll-alloy-rpc-types-engine.workspace = true # reth reth-engine-primitives = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api", default-features = false, features = ["scroll"] } diff --git a/crates/indexer/Cargo.toml b/crates/indexer/Cargo.toml new file mode 100644 index 00000000..532a631d --- /dev/null +++ b/crates/indexer/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "scroll-indexer" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] +# rollup-node +scroll-l1.workspace = true +scroll-primitives.workspace = true + +[lints] +workspace = true diff --git a/crates/indexer/src/lib.rs b/crates/indexer/src/lib.rs new file mode 100644 index 00000000..ba177239 --- /dev/null +++ b/crates/indexer/src/lib.rs @@ -0,0 +1,38 @@ +//! A library responsible for indexing data relevant to the L1. + +use scroll_l1::L1Event; +use scroll_primitives::{BatchInput, L1Message}; +use std::sync::Arc; + +/// The indexer is responsible for indexing data relevant to the L1. +#[derive(Debug)] +pub struct Indexer; + +impl Indexer { + /// Handles an event from the L1. + pub async fn handle_l1_event(&mut self, event: L1Event) { + match event { + L1Event::CommitBatch(batch_input) => self.handle_batch_input(batch_input).await, + L1Event::Reorg(block_number) => self.handle_reorg(block_number).await, + L1Event::NewBlock(_block_number) => todo!(), + L1Event::Finalized(block_number) => self.handle_finalized(block_number).await, + L1Event::L1Message(l1_message) => self.handle_l1_message(l1_message).await, + } + } + + async fn handle_reorg(&self, _block_number: u64) { + todo!() + } + + async fn handle_finalized(&self, _block_number: u64) { + todo!() + } + + async fn handle_l1_message(&self, _l1_message: Arc) { + todo!() + } + + async fn handle_batch_input(&self, _batch_input: Arc) { + todo!() + } +} diff --git a/crates/l1/Cargo.toml b/crates/l1/Cargo.toml new file mode 100644 index 00000000..5b5f3433 --- /dev/null +++ b/crates/l1/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "scroll-l1" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] +# alloy +alloy-sol-types = { version = "0.8.20", features = ["json"] } +alloy-primitives.workspace = true + +# rollup-node +scroll-primitives.workspace = true + +# misc +futures.workspace = true + +[lints] +workspace = true diff --git a/crates/l1/abi/L1MessageQueue.json b/crates/l1/abi/L1MessageQueue.json new file mode 100644 index 00000000..0492def0 --- /dev/null +++ b/crates/l1/abi/L1MessageQueue.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_messenger","type":"address","internalType":"address"},{"name":"_scrollChain","type":"address","internalType":"address"},{"name":"_enforcedTxGateway","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"appendCrossDomainMessage","inputs":[{"name":"_target","type":"address","internalType":"address"},{"name":"_gasLimit","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"appendEnforcedTransaction","inputs":[{"name":"_sender","type":"address","internalType":"address"},{"name":"_target","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_gasLimit","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"calculateIntrinsicGasFee","inputs":[{"name":"_calldata","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"computeTransactionHash","inputs":[{"name":"_sender","type":"address","internalType":"address"},{"name":"_queueIndex","type":"uint256","internalType":"uint256"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_target","type":"address","internalType":"address"},{"name":"_gasLimit","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"dropCrossDomainMessage","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"enforcedTxGateway","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"estimateCrossDomainMessageFee","inputs":[{"name":"_gasLimit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"finalizePoppedCrossDomainMessage","inputs":[{"name":"_newFinalizedQueueIndexPlusOne","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"gasOracle","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getCrossDomainMessage","inputs":[{"name":"_queueIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_messenger","type":"address","internalType":"address"},{"name":"_scrollChain","type":"address","internalType":"address"},{"name":"_enforcedTxGateway","type":"address","internalType":"address"},{"name":"_gasOracle","type":"address","internalType":"address"},{"name":"_maxGasLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isMessageDropped","inputs":[{"name":"_queueIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isMessageSkipped","inputs":[{"name":"_queueIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"maxGasLimit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"messageQueue","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"messenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"nextCrossDomainMessageIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nextUnfinalizedQueueIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pendingQueueIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"popCrossDomainMessage","inputs":[{"name":"_startIndex","type":"uint256","internalType":"uint256"},{"name":"_count","type":"uint256","internalType":"uint256"},{"name":"_skippedBitmap","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resetPoppedCrossDomainMessage","inputs":[{"name":"_startIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"scrollChain","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateGasOracle","inputs":[{"name":"_newGasOracle","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateMaxGasLimit","inputs":[{"name":"_newMaxGasLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DequeueTransaction","inputs":[{"name":"startIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"skippedBitmap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DropTransaction","inputs":[{"name":"index","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FinalizedDequeuedTransaction","inputs":[{"name":"finalizedIndex","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"QueueTransaction","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"queueIndex","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"gasLimit","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ResetDequeuedTransaction","inputs":[{"name":"startIndex","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UpdateGasOracle","inputs":[{"name":"_oldGasOracle","type":"address","indexed":true,"internalType":"address"},{"name":"_newGasOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"UpdateMaxGasLimit","inputs":[{"name":"_oldMaxGasLimit","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newMaxGasLimit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ErrorZeroAddress","inputs":[]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b5060405162001a8b38038062001a8b833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b15620000835760405163a7f9319d60e01b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c05161186a620002215f395f81816102470152610d9c01525f81816102fa0152818161040b01528181610594015261097101525f81816101e501528181610b3d0152610cf9015261186a5ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80637d82191a116100f3578063bdc6f0a011610093578063e172d3a11161006e578063e172d3a1146103a8578063f2fde38b146103bb578063f7013ef6146103ce578063fd0ad31e146103e1575f80fd5b8063bdc6f0a01461036f578063d5ad4a9714610382578063d7704bae14610395575f80fd5b806391652461116100ce578063916524611461032d5780639b15978214610340578063a85006ca14610353578063ae453cd51461035c575f80fd5b80637d82191a146102e2578063897630dd146102f55780638da5cb5b1461031c575f80fd5b806355f613ce1161015e5780635e45da23116101395780635e45da23146102ab57806370cee67f146102b4578063715018a6146102c75780637a6e9333146102cf575f80fd5b806355f613ce146102725780635ad9945a146102855780635d62a8dd14610298575f80fd5b806329aa604b146101a557806338050fd4146101cb5780633cb747bf146101e05780633e6dada11461021f5780633e83496c14610242578063416bdfa114610269575b5f80fd5b6101b86101b336600461143e565b6103e9565b6040519081526020015b60405180910390f35b6101de6101d936600461143e565b610408565b005b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c2565b61023261022d36600461143e565b610549565b60405190151581526020016101c2565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6101b8606e5481565b6101de610280366004611455565b610591565b6101b86102933660046114d9565b610712565b606854610207906001600160a01b031681565b6101b8606b5481565b6101de6102c2366004611555565b610902565b6101de61095b565b6101de6102dd36600461143e565b61096e565b6102326102f036600461143e565b610b07565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610207565b6101de61033b36600461143e565b610b3a565b6101de61034e36600461156e565b610cf6565b6101b8606a5481565b6101b861036a36600461143e565b610d75565b6101de61037d3660046115c4565b610d99565b6101de61039036600461143e565b610e84565b6101b86103a336600461143e565b610eca565b6101b86103b6366004611637565b610f53565b6101de6103c9366004611555565b610fe4565b6101de6103dc366004611676565b61105a565b6069546101b8565b606981815481106103f8575f80fd5b5f91825260209091200154905081565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146104595760405162461bcd60e51b8152600401610450906116ce565b60405180910390fd5b606e54808203610467575050565b8082116104b65760405162461bcd60e51b815260206004820152601960248201527f66696e616c697a656420696e64657820746f6f20736d616c6c000000000000006044820152606401610450565b606a548211156105085760405162461bcd60e51b815260206004820152601960248201527f66696e616c697a656420696e64657820746f6f206c61726765000000000000006044820152606401610450565b606e8290556040515f19830181527fbbbf2de085aff601d965315326f9908eb5ebbb3d1b307e7e5ec42384e3320a10906020015b60405180910390a1505b50565b600881901c5f908152606d6020526040812054600160ff84161b161515801561058b5750600882901c5f908152606c6020526040902054600160ff84161b1615155b92915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146105d95760405162461bcd60e51b8152600401610450906116ce565b6101008211156106235760405162461bcd60e51b8152602060048201526015602482015274706f7020746f6f206d616e79206d6573736167657360581b6044820152606401610450565b82606a541461066b5760405162461bcd60e51b81526020600482015260146024820152730e6e8c2e4e840d2dcc8caf040dad2e6dac2e8c6d60631b6044820152606401610450565b600883901c5f818152606d6020526040902080546001851b5f190193841660ff871681811b9092179092559092919061010081860111156106c357600182015f908152606d6020526040902061010082900385901c90555b505050818301606a5560408051848152602081018490529081018290527fc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e66792679709060600160405180910390a1505050565b5f607e816107bc565b5f8161072957506001919050565b5b811561073f5760089190911c9060010161072a565b919050565b80608083106001811461077c5761075a8461071b565b60808101835360018301925084816020036008021b835280830192505061079d565b848415166001811461079057848353610795565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806107cf60018c83610744565b90506107dd60018983610744565b90506107e989826107a5565b90506107f760018b83610744565b9050600186146001811461085f5760388710600181146108445761081a8861071b565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610859565b87608001835360018301925087898437918701915b50610870565b61086d5f89355f1a84610744565b91505b5061087b8c826107a5565b90508181035f8060388310600181146108ae576108978461071b565b60f78101600882021b8517935060010191506108b9565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61090a6111b8565b606880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f9ed5ec28f252b3e7f62f1ace8e54c5ebabf4c61cc2a7c33a806365b2ff7ecc5e905f90a35050565b6109636111b8565b61096c5f611212565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109b65760405162461bcd60e51b8152600401610450906116ce565b606a548082036109c4575050565b606e54821015610a165760405162461bcd60e51b815260206004820152601860248201527f72657365742066696e616c697a6564206d6573736167657300000000000000006044820152606401610450565b808210610a5e5760405162461bcd60e51b815260206004820152601660248201527572657365742070656e64696e67206d6573736167657360501b6044820152606401610450565b600882901c5f818152606d602052604090208054600160ff861690811b5f190190911690915583830391906101008190035b83811015610ace576001929092015f818152606d60205260409020549092908015610ac4575f848152606d60205260408120555b5061010001610a90565b505050606a839055506040518281527fc079f1a662217305bfe03e0a85f03944a2ac422f5ee5431c98b9ef7d3c6226c99060200161053c565b5f606a548210610b1857505f919050565b600882901c5f908152606d6020526040902054600160ff84161b16151561058b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610b825760405162461bcd60e51b815260040161045090611703565b606e548110610bd35760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d65737361676500000000006044820152606401610450565b600881901c5f908152606d6020526040902054600160ff83161b16610c3a5760405162461bcd60e51b815260206004820152601860248201527f64726f70206e6f6e2d736b6970706564206d65737361676500000000000000006044820152606401610450565b600881901c5f908152606c6020526040902054600160ff83161b1615610ca25760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f707065640000000000000000006044820152606401610450565b600881901c5f908152606c602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610d3e5760405162461bcd60e51b815260040161045090611703565b610d49838383611263565b3373111100000000000000000000000000000000111101610d6e81865f878787611342565b5050505050565b5f60698281548110610d8957610d89611749565b905f5260205f2001549050919050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e205760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201526561746577617960d01b6064820152608401610450565b6001600160a01b0386163b15610e635760405162461bcd60e51b81526020600482015260086024820152676f6e6c7920454f4160c01b6044820152606401610450565b610e6e838383611263565b610e7c868686868686611342565b505050505050565b610e8c6111b8565b606b80549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c5910161053c565b6068545f906001600160a01b031680610ee557505f92915050565b604051636bb825d760e11b8152600481018490526001600160a01b0382169063d7704bae90602401602060405180830381865afa158015610f28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4c919061175d565b9392505050565b6068545f906001600160a01b031680610f6f575f91505061058b565b60405163e172d3a160e01b81526001600160a01b0382169063e172d3a190610f9d908790879060040161179c565b602060405180830381865afa158015610fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdc919061175d565b949350505050565b610fec6111b8565b6001600160a01b0381166110515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610450565b61054681611212565b5f54610100900460ff161580801561107857505f54600160ff909116105b806110915750303b15801561109157505f5460ff166001145b6110f45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610450565b5f805460ff191660011790558015611115575f805461ff0019166101001790555b61111d6113e6565b606880546001600160a01b038086166001600160a01b031992831617909255606b849055606580548984169083161790556066805488841690831617905560678054928716929091169190911790558015610e7c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6033546001600160a01b0316331461096c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610450565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606b548311156112c35760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d6178476173604482015264131a5b5a5d60da1b6064820152608401610450565b5f6112ce8383610f53565b90508084101561133c5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527261626f766520696e7472696e7369632067617360681b6064820152608401610450565b50505050565b6069545f6113558883888a898989610712565b606980546001810182555f919091527f7fb4302e8e91f9110a6554c2c0a24601252c2a42c2220ca988efcfe399914308018190556040519091506001600160a01b0380891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e906113d4908a9087908b908b908b906117af565b60405180910390a35050505050505050565b5f54610100900460ff1661140c5760405162461bcd60e51b8152600401610450906117e9565b61096c5f54610100900460ff166114355760405162461bcd60e51b8152600401610450906117e9565b61096c33611212565b5f6020828403121561144e575f80fd5b5035919050565b5f805f60608486031215611467575f80fd5b505081359360208301359350604090920135919050565b80356001600160a01b038116811461073f575f80fd5b5f8083601f8401126114a4575f80fd5b50813567ffffffffffffffff8111156114bb575f80fd5b6020830191508360208285010111156114d2575f80fd5b9250929050565b5f805f805f805f60c0888a0312156114ef575f80fd5b6114f88861147e565b965060208801359550604088013594506115146060890161147e565b93506080880135925060a088013567ffffffffffffffff811115611536575f80fd5b6115428a828b01611494565b989b979a50959850939692959293505050565b5f60208284031215611565575f80fd5b610f4c8261147e565b5f805f8060608587031215611581575f80fd5b61158a8561147e565b935060208501359250604085013567ffffffffffffffff8111156115ac575f80fd5b6115b887828801611494565b95989497509550505050565b5f805f805f8060a087890312156115d9575f80fd5b6115e28761147e565b95506115f06020880161147e565b94506040870135935060608701359250608087013567ffffffffffffffff811115611619575f80fd5b61162589828a01611494565b979a9699509497509295939492505050565b5f8060208385031215611648575f80fd5b823567ffffffffffffffff81111561165e575f80fd5b61166a85828601611494565b90969095509350505050565b5f805f805f60a0868803121561168a575f80fd5b6116938661147e565b94506116a16020870161147e565b93506116af6040870161147e565b92506116bd6060870161147e565b949793965091946080013592915050565b6020808252818101527f4f6e6c792063616c6c61626c6520627920746865205363726f6c6c436861696e604082015260600190565b60208082526026908201527f4f6e6c792063616c6c61626c6520627920746865204c315363726f6c6c4d657360408201526539b2b733b2b960d11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561176d575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610fdc602083018486611774565b85815267ffffffffffffffff85166020820152836040820152608060608201525f6117de608083018486611774565b979650505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220293b6f6ae4f4e900a0a2323be4613ef3d6e2f0f35eebef4f12f0b6cb4eb773b864736f6c63430008180033","sourceMap":"745:17703:158:-:0;;;3257:424;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3383:24:158;;;;:54;;-1:-1:-1;;;;;;3411:26:158;;;3383:54;:90;;;-1:-1:-1;;;;;;3441:32:158;;;3383:90;3379:146;;;3496:18;;-1:-1:-1;;;3496:18:158;;;;;;;;;;;3379:146;3535:22;:20;:22::i;:::-;-1:-1:-1;;;;;3568:22:158;;;;;3600:26;;;;;3636:38;;;745:17703;;5939:280:43;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:43;;781:2:315;5998:66:43;;;763:21:315;820:2;800:18;;;793:30;859:34;839:18;;;832:62;-1:-1:-1;;;910:18:315;;;903:37;957:19;;5998:66:43;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:43;6140:15;6125:30;;;;;;6174:28;;1129:36:315;;;6174:28:43;;1117:2:315;1102:18;6174:28:43;;;;;;;6074:139;5939:280::o;14:177:315:-;93:13;;-1:-1:-1;;;;;135:31:315;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:378::-;284:6;292;300;353:2;341:9;332:7;328:23;324:32;321:52;;;369:1;366;359:12;321:52;392:40;422:9;392:40;:::i;:::-;382:50;;451:49;496:2;485:9;481:18;451:49;:::i;:::-;441:59;;519:49;564:2;553:9;549:18;519:49;:::i;:::-;509:59;;196:378;;;;;:::o;987:184::-;745:17703:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80637d82191a116100f3578063bdc6f0a011610093578063e172d3a11161006e578063e172d3a1146103a8578063f2fde38b146103bb578063f7013ef6146103ce578063fd0ad31e146103e1575f80fd5b8063bdc6f0a01461036f578063d5ad4a9714610382578063d7704bae14610395575f80fd5b806391652461116100ce578063916524611461032d5780639b15978214610340578063a85006ca14610353578063ae453cd51461035c575f80fd5b80637d82191a146102e2578063897630dd146102f55780638da5cb5b1461031c575f80fd5b806355f613ce1161015e5780635e45da23116101395780635e45da23146102ab57806370cee67f146102b4578063715018a6146102c75780637a6e9333146102cf575f80fd5b806355f613ce146102725780635ad9945a146102855780635d62a8dd14610298575f80fd5b806329aa604b146101a557806338050fd4146101cb5780633cb747bf146101e05780633e6dada11461021f5780633e83496c14610242578063416bdfa114610269575b5f80fd5b6101b86101b336600461143e565b6103e9565b6040519081526020015b60405180910390f35b6101de6101d936600461143e565b610408565b005b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c2565b61023261022d36600461143e565b610549565b60405190151581526020016101c2565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6101b8606e5481565b6101de610280366004611455565b610591565b6101b86102933660046114d9565b610712565b606854610207906001600160a01b031681565b6101b8606b5481565b6101de6102c2366004611555565b610902565b6101de61095b565b6101de6102dd36600461143e565b61096e565b6102326102f036600461143e565b610b07565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610207565b6101de61033b36600461143e565b610b3a565b6101de61034e36600461156e565b610cf6565b6101b8606a5481565b6101b861036a36600461143e565b610d75565b6101de61037d3660046115c4565b610d99565b6101de61039036600461143e565b610e84565b6101b86103a336600461143e565b610eca565b6101b86103b6366004611637565b610f53565b6101de6103c9366004611555565b610fe4565b6101de6103dc366004611676565b61105a565b6069546101b8565b606981815481106103f8575f80fd5b5f91825260209091200154905081565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146104595760405162461bcd60e51b8152600401610450906116ce565b60405180910390fd5b606e54808203610467575050565b8082116104b65760405162461bcd60e51b815260206004820152601960248201527f66696e616c697a656420696e64657820746f6f20736d616c6c000000000000006044820152606401610450565b606a548211156105085760405162461bcd60e51b815260206004820152601960248201527f66696e616c697a656420696e64657820746f6f206c61726765000000000000006044820152606401610450565b606e8290556040515f19830181527fbbbf2de085aff601d965315326f9908eb5ebbb3d1b307e7e5ec42384e3320a10906020015b60405180910390a1505b50565b600881901c5f908152606d6020526040812054600160ff84161b161515801561058b5750600882901c5f908152606c6020526040902054600160ff84161b1615155b92915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146105d95760405162461bcd60e51b8152600401610450906116ce565b6101008211156106235760405162461bcd60e51b8152602060048201526015602482015274706f7020746f6f206d616e79206d6573736167657360581b6044820152606401610450565b82606a541461066b5760405162461bcd60e51b81526020600482015260146024820152730e6e8c2e4e840d2dcc8caf040dad2e6dac2e8c6d60631b6044820152606401610450565b600883901c5f818152606d6020526040902080546001851b5f190193841660ff871681811b9092179092559092919061010081860111156106c357600182015f908152606d6020526040902061010082900385901c90555b505050818301606a5560408051848152602081018490529081018290527fc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e66792679709060600160405180910390a1505050565b5f607e816107bc565b5f8161072957506001919050565b5b811561073f5760089190911c9060010161072a565b919050565b80608083106001811461077c5761075a8461071b565b60808101835360018301925084816020036008021b835280830192505061079d565b848415166001811461079057848353610795565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806107cf60018c83610744565b90506107dd60018983610744565b90506107e989826107a5565b90506107f760018b83610744565b9050600186146001811461085f5760388710600181146108445761081a8861071b565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610859565b87608001835360018301925087898437918701915b50610870565b61086d5f89355f1a84610744565b91505b5061087b8c826107a5565b90508181035f8060388310600181146108ae576108978461071b565b60f78101600882021b8517935060010191506108b9565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61090a6111b8565b606880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f9ed5ec28f252b3e7f62f1ace8e54c5ebabf4c61cc2a7c33a806365b2ff7ecc5e905f90a35050565b6109636111b8565b61096c5f611212565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109b65760405162461bcd60e51b8152600401610450906116ce565b606a548082036109c4575050565b606e54821015610a165760405162461bcd60e51b815260206004820152601860248201527f72657365742066696e616c697a6564206d6573736167657300000000000000006044820152606401610450565b808210610a5e5760405162461bcd60e51b815260206004820152601660248201527572657365742070656e64696e67206d6573736167657360501b6044820152606401610450565b600882901c5f818152606d602052604090208054600160ff861690811b5f190190911690915583830391906101008190035b83811015610ace576001929092015f818152606d60205260409020549092908015610ac4575f848152606d60205260408120555b5061010001610a90565b505050606a839055506040518281527fc079f1a662217305bfe03e0a85f03944a2ac422f5ee5431c98b9ef7d3c6226c99060200161053c565b5f606a548210610b1857505f919050565b600882901c5f908152606d6020526040902054600160ff84161b16151561058b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610b825760405162461bcd60e51b815260040161045090611703565b606e548110610bd35760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d65737361676500000000006044820152606401610450565b600881901c5f908152606d6020526040902054600160ff83161b16610c3a5760405162461bcd60e51b815260206004820152601860248201527f64726f70206e6f6e2d736b6970706564206d65737361676500000000000000006044820152606401610450565b600881901c5f908152606c6020526040902054600160ff83161b1615610ca25760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f707065640000000000000000006044820152606401610450565b600881901c5f908152606c602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610d3e5760405162461bcd60e51b815260040161045090611703565b610d49838383611263565b3373111100000000000000000000000000000000111101610d6e81865f878787611342565b5050505050565b5f60698281548110610d8957610d89611749565b905f5260205f2001549050919050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e205760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201526561746577617960d01b6064820152608401610450565b6001600160a01b0386163b15610e635760405162461bcd60e51b81526020600482015260086024820152676f6e6c7920454f4160c01b6044820152606401610450565b610e6e838383611263565b610e7c868686868686611342565b505050505050565b610e8c6111b8565b606b80549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c5910161053c565b6068545f906001600160a01b031680610ee557505f92915050565b604051636bb825d760e11b8152600481018490526001600160a01b0382169063d7704bae90602401602060405180830381865afa158015610f28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4c919061175d565b9392505050565b6068545f906001600160a01b031680610f6f575f91505061058b565b60405163e172d3a160e01b81526001600160a01b0382169063e172d3a190610f9d908790879060040161179c565b602060405180830381865afa158015610fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdc919061175d565b949350505050565b610fec6111b8565b6001600160a01b0381166110515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610450565b61054681611212565b5f54610100900460ff161580801561107857505f54600160ff909116105b806110915750303b15801561109157505f5460ff166001145b6110f45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610450565b5f805460ff191660011790558015611115575f805461ff0019166101001790555b61111d6113e6565b606880546001600160a01b038086166001600160a01b031992831617909255606b849055606580548984169083161790556066805488841690831617905560678054928716929091169190911790558015610e7c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6033546001600160a01b0316331461096c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610450565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606b548311156112c35760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d6178476173604482015264131a5b5a5d60da1b6064820152608401610450565b5f6112ce8383610f53565b90508084101561133c5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527261626f766520696e7472696e7369632067617360681b6064820152608401610450565b50505050565b6069545f6113558883888a898989610712565b606980546001810182555f919091527f7fb4302e8e91f9110a6554c2c0a24601252c2a42c2220ca988efcfe399914308018190556040519091506001600160a01b0380891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e906113d4908a9087908b908b908b906117af565b60405180910390a35050505050505050565b5f54610100900460ff1661140c5760405162461bcd60e51b8152600401610450906117e9565b61096c5f54610100900460ff166114355760405162461bcd60e51b8152600401610450906117e9565b61096c33611212565b5f6020828403121561144e575f80fd5b5035919050565b5f805f60608486031215611467575f80fd5b505081359360208301359350604090920135919050565b80356001600160a01b038116811461073f575f80fd5b5f8083601f8401126114a4575f80fd5b50813567ffffffffffffffff8111156114bb575f80fd5b6020830191508360208285010111156114d2575f80fd5b9250929050565b5f805f805f805f60c0888a0312156114ef575f80fd5b6114f88861147e565b965060208801359550604088013594506115146060890161147e565b93506080880135925060a088013567ffffffffffffffff811115611536575f80fd5b6115428a828b01611494565b989b979a50959850939692959293505050565b5f60208284031215611565575f80fd5b610f4c8261147e565b5f805f8060608587031215611581575f80fd5b61158a8561147e565b935060208501359250604085013567ffffffffffffffff8111156115ac575f80fd5b6115b887828801611494565b95989497509550505050565b5f805f805f8060a087890312156115d9575f80fd5b6115e28761147e565b95506115f06020880161147e565b94506040870135935060608701359250608087013567ffffffffffffffff811115611619575f80fd5b61162589828a01611494565b979a9699509497509295939492505050565b5f8060208385031215611648575f80fd5b823567ffffffffffffffff81111561165e575f80fd5b61166a85828601611494565b90969095509350505050565b5f805f805f60a0868803121561168a575f80fd5b6116938661147e565b94506116a16020870161147e565b93506116af6040870161147e565b92506116bd6060870161147e565b949793965091946080013592915050565b6020808252818101527f4f6e6c792063616c6c61626c6520627920746865205363726f6c6c436861696e604082015260600190565b60208082526026908201527f4f6e6c792063616c6c61626c6520627920746865204c315363726f6c6c4d657360408201526539b2b733b2b960d11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561176d575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610fdc602083018486611774565b85815267ffffffffffffffff85166020820152836040820152608060608201525f6117de608083018486611774565b979650505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220293b6f6ae4f4e900a0a2323be4613ef3d6e2f0f35eebef4f12f0b6cb4eb773b864736f6c63430008180033","sourceMap":"745:17703:158:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1813:29;;;;;;:::i;:::-;;:::i;:::-;;;345:25:315;;;333:2;318:18;1813:29:158;;;;;;;;14728:711;;;;;;:::i;:::-;;:::i;:::-;;993:34;;;;;;;;-1:-1:-1;;;;;545:32:315;;;527:51;;515:2;500:18;993:34:158;381:203:315;11088:220:158;;;;;;:::i;:::-;;:::i;:::-;;;754:14:315;;747:22;729:41;;717:2;702:18;11088:220:158;589:187:315;1186:42:158;;;;;2411:40;;;;;;12538:942;;;;;;:::i;:::-;;:::i;5773:5040::-;;;;;;:::i;:::-;;:::i;1724:24::-;;;;;-1:-1:-1;;;;;1724:24:158;;;1978:26;;;;;;16138:213;;;;;;:::i;:::-;;:::i;2064:101:39:-;;;:::i;13630:1056:158:-;;;;;;:::i;:::-;;:::i;10855:191::-;;;;;;:::i;:::-;;:::i;1087:36::-;;;;;1441:85:39;1513:6;;-1:-1:-1;;;;;1513:6:39;1441:85;;15481:395:158;;;;;;:::i;:::-;;:::i;11457:439::-;;;;;;:::i;:::-;;:::i;1885:32::-;;;;;;4959:133;;;;;;:::i;:::-;;:::i;11938:558::-;;;;;;:::i;:::-;;:::i;16515:231::-;;;;;;:::i;:::-;;:::i;5134:280::-;;;;;;:::i;:::-;;:::i;5456:275::-;;;;;;:::i;:::-;;:::i;2314:198:39:-;;;;;;:::i;:::-;;:::i;4224:442:158:-;;;;;;:::i;:::-;;:::i;4803:114::-;4891:12;:19;4803:114;;1813:29;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1813:29:158;:::o;14728:711::-;929:10:62;2821:11:158;-1:-1:-1;;;;;2805:27:158;;2797:72;;;;-1:-1:-1;;;2797:72:158;;;;;;;:::i;:::-;;;;;;;;;14925:25:::1;::::0;14964:66;;;14960:79:::1;;15032:7;14728:711:::0;:::o;14960:79::-:1;15089:32;15056:30;:65;15048:103;;;::::0;-1:-1:-1;;;15048:103:158;;5490:2:315;15048:103:158::1;::::0;::::1;5472:21:315::0;5529:2;5509:18;;;5502:30;5568:27;5548:18;;;5541:55;5613:18;;15048:103:158::1;5288:349:315::0;15048:103:158::1;15203:17;;15169:30;:51;;15161:89;;;::::0;-1:-1:-1;;;15161:89:158;;5844:2:315;15161:89:158::1;::::0;::::1;5826:21:315::0;5883:2;5863:18;;;5856:30;5922:27;5902:18;;;5895:55;5967:18;;15161:89:158::1;5642:349:315::0;15161:89:158::1;15261:25;:58:::0;;;15358:64:::1;::::0;-1:-1:-1;;15387:34:158;;345:25:315;;15358:64:158::1;::::0;333:2:315;318:18;15358:64:158::1;;;;;;;;14872:567;2879:1;14728:711:::0;:::o;11088:220::-;18337:1;18328:10;;;11158:4;18399:28;;;:20;:28;;;;;;18363:1;18377:4;18369:12;;18363:19;18399:35;:40;;11230:71;;;;-1:-1:-1;695:1:72;686:10;;;653:4;757:20;;;11264::158;757::72;;;;;;721:1;735:4;727:12;;721:19;757:27;:32;;11264:37:158;11223:78;11088:220;-1:-1:-1;;11088:220:158:o;12538:942::-;929:10:62;2821:11:158;-1:-1:-1;;;;;2805:27:158;;2797:72;;;;-1:-1:-1;;;2797:72:158;;;;;;;:::i;:::-;12722:3:::1;12712:6;:13;;12704:47;;;::::0;-1:-1:-1;;;12704:47:158;;6198:2:315;12704:47:158::1;::::0;::::1;6180:21:315::0;6237:2;6217:18;;;6210:30;-1:-1:-1;;;6256:18:315;;;6249:51;6317:18;;12704:47:158::1;5996:345:315::0;12704:47:158::1;12790:11;12769:17;;:32;12761:65;;;::::0;-1:-1:-1;;;12761:65:158;;6548:2:315;12761:65:158::1;::::0;::::1;6530:21:315::0;6587:2;6567:18;;;6560:30;-1:-1:-1;;;6606:18:315;;;6599:50;6666:18;;12761:65:158::1;6346:344:315::0;12761:65:158::1;13077:1;13062:16:::0;;::::1;12962:12;13141:28:::0;;;:20:::1;:28;::::0;;;;:56;;12993:1:::1;12978:11:::0;::::1;-1:-1:-1::0;;12977:17:158;13008:22;;::::1;13123:4;13109:18:::0;::::1;13173:24:::0;;::::1;13141:56:::0;;::::1;::::0;;;13008:22;;12977:17;13062:16;13233:3:::1;13215:15:::0;;::::1;:21;13211:127;;;13286:1;13277:10:::0;::::1;13256:32;::::0;;;:20:::1;:32;::::0;;;;13310:3:::1;:12:::0;;::::1;13291:32:::0;;::::1;13256:67:::0;;13211:127:::1;-1:-1:-1::0;;;13372:20:158;;::::1;13352:17;:40:::0;13418:55:::1;::::0;;6897:25:315;;;6953:2;6938:18;;6931:34;;;6981:18;;;6974:34;;;13418:55:158::1;::::0;6885:2:315;6870:18;13418:55:158::1;;;;;;;12538:942:::0;;;:::o;5773:5040::-;6001:7;6455:4;6001:7;6514:317;;;6544:3;6572:1;6566:86;;-1:-1:-1;6607:1:158;;6514:317;-1:-1:-1;6514:317:158:o;6566:86::-;6669:148;6694:8;;6669:148;;6794:1;6790:9;;;;;6762:1;6753:11;6669:148;;;6514:317;;;:::o;6985:868::-;7063:4;7097:3;7091:10;;7123:1;7118:398;;;;7613:17;7628:1;7613:17;:::i;:::-;7673:4;7668:3;7664:14;7659:3;7651:28;7716:1;7711:3;7707:11;7700:18;;7777:1;7770:3;7766:2;7762:12;7759:1;7755:20;7751:28;7746:3;7739:41;7817:3;7812;7808:13;7801:20;;;7084:755;;7118:398;7169:7;7165:1;7158:9;7154:23;7203:1;7198:110;;;;7435:1;7430:3;7422:15;7147:312;;7198:110;7281:4;7276:3;7268:18;7147:312;;7496:1;7491:3;7487:11;7480:18;;7084:755;;6985:868;;;;;:::o;7867:278::-;7931:4;7998;7931;7985:18;8086:2;8082:10;;;;8051:1;8042:11;;8070:23;-1:-1:-1;8117:14:158;;;7867:278::o;:::-;8281:1;8274:4;8268:11;8264:19;8307:9;8336:39;8373:1;8360:11;8355:3;8336:39;:::i;:::-;8329:46;;8395:37;8430:1;8419:9;8414:3;8395:37;:::i;:::-;8388:44;;8452:27;8471:7;8466:3;8452:27;:::i;:::-;8445:34;;8499;8531:1;8523:6;8518:3;8499:34;:::i;:::-;8492:41;;8571:1;8557:12;8554:19;8591:1;8586:140;;;;8789:2;8775:12;8772:20;8814:1;8809:290;;;;9222:28;9237:12;9222:28;:::i;:::-;9294:9;9288:4;9284:20;9279:3;9271:34;9342:1;9337:3;9333:11;9326:18;;9409:12;9396:9;9392:2;9388:18;9385:1;9381:26;9377:45;9372:3;9365:58;9460:9;9455:3;9451:19;9444:26;;;9523:12;9509;9504:3;9491:45;9564:22;;;;8765:839;;8809:290;8912:12;8906:4;8902:23;8897:3;8889:37;8963:1;8958:3;8954:11;8947:18;;9018:12;9004;8999:3;8986:45;9059:22;;;;8765:839;;8547:1071;;8586:140;8649:63;8710:1;8694:12;8681:26;8678:1;8673:35;8668:3;8649:63;:::i;:::-;8642:70;;8547:1071;;9638:27;9657:7;9652:3;9638:27;:::i;:::-;9631:34;;9707:9;9702:3;9698:19;9730:9;9752:15;9803:2;9790:11;9787:19;9824:1;9819:169;;;;10121:27;10136:11;10121:27;:::i;:::-;10227:4;10223:20;;10288:1;10273:17;;10269:29;10324:22;;;-1:-1:-1;10195:1:158;10180:17;;-1:-1:-1;9780:580:158;;9819:169;9929:11;9923:4;9919:22;9910:31;;9973:1;9958:16;;9780:580;;10417:15;10403:11;10400:1;10396:19;10392:41;10385:5;10382:52;10373:61;;10479:1;10466:11;10462:19;10447:34;;10519:11;10516:1;10512:19;10494:37;;10612:9;10606:16;10594:10;10590:33;10582:5;10569:10;10564:3;10560:20;10556:32;10553:71;10544:80;;10665:11;10654:9;10650:27;10637:40;;;10708:5;10697:9;10690:24;;;10765:9;10760:3;10756:19;10745:9;10735:41;10727:49;;;;10802:4;10795:11;;;;5773:5040;;;;;;;;;:::o;16138:213::-;1334:13:39;:11;:13::i;:::-;16239:9:158::1;::::0;;-1:-1:-1;;;;;16258:25:158;;::::1;-1:-1:-1::0;;;;;;16258:25:158;::::1;::::0;::::1;::::0;;;16299:45:::1;::::0;16239:9;::::1;::::0;16258:25;16239:9;;16299:45:::1;::::0;16215:21:::1;::::0;16299:45:::1;16205:146;16138:213:::0;:::o;2064:101:39:-;1334:13;:11;:13::i;:::-;2128:30:::1;2155:1;2128:18;:30::i;:::-;2064:101::o:0;13630:1056:158:-;929:10:62;2821:11:158;-1:-1:-1;;;;;2805:27:158;;2797:72;;;;-1:-1:-1;;;2797:72:158;;;;;;;:::i;:::-;13768:17:::1;::::0;13799:38;;;13795:51:::1;;13839:7;14728:711:::0;:::o;13795:51::-:1;13879:25;;13864:11;:40;;13856:77;;;::::0;-1:-1:-1;;;13856:77:158;;7221:2:315;13856:77:158::1;::::0;::::1;7203:21:315::0;7260:2;7240:18;;;7233:30;7299:26;7279:18;;;7272:54;7343:18;;13856:77:158::1;7019:348:315::0;13856:77:158::1;13965:23;13951:11;:37;13943:72;;;::::0;-1:-1:-1;;;13943:72:158;;7574:2:315;13943:72:158::1;::::0;::::1;7556:21:315::0;7613:2;7593:18;;;7586:30;-1:-1:-1;;;7632:18:315;;;7625:52;7694:18;;13943:72:158::1;7372:346:315::0;13943:72:158::1;14149:1;14134:16:::0;;::::1;14050:13;14213:28:::0;;;:20:::1;:28;::::0;;;;:49;;14261:1:::1;14195:4;14181:18:::0;::::1;14246:11:::0;;::::1;-1:-1:-1::0;;14245:17:158;14213:49;;::::1;::::0;;;14066:37;;::::1;::::0;14134:16;14303:3:::1;:12:::0;;::::1;14329:247;14355:5;14336:16;:24;14329:247;;;14390:1;14380:11:::0;;;::::1;14409:14;14426:28:::0;;;:20:::1;:28;::::0;;;;;14380:11;;-1:-1:-1;14476:10:158;;14472:48:::1;;14519:1;14488:28:::0;;;:20:::1;:28;::::0;;;;:32;14472:48:::1;-1:-1:-1::0;14558:3:158::1;14538:23;14329:247;;;-1:-1:-1::0;;;14596:17:158::1;:31:::0;;;-1:-1:-1;14642:37:158::1;::::0;345:25:315;;;14642:37:158::1;::::0;333:2:315;318:18;14642:37:158::1;199:177:315::0;10855:191:158;10925:4;10960:17;;10945:11;:32;10941:50;;-1:-1:-1;10986:5:158;;10855:191;-1:-1:-1;10855:191:158:o;10941:50::-;18337:1;18328:10;;;18295:4;18399:28;;;:20;:28;;;;;;18363:1;18377:4;18369:12;;18363:19;18399:35;:40;;11009:30;18230:216;15481:395;929:10:62;2684:9:158;-1:-1:-1;;;;;2668:25:158;;2660:76;;;;-1:-1:-1;;;2660:76:158;;;;;;;:::i;:::-;15579:25:::1;;15570:6;:34;15562:74;;;::::0;-1:-1:-1;;;15562:74:158;;8332:2:315;15562:74:158::1;::::0;::::1;8314:21:315::0;8371:2;8351:18;;;8344:30;8410:29;8390:18;;;8383:57;8457:18;;15562:74:158::1;8130:351:315::0;15562:74:158::1;18337:1:::0;18328:10;;;18295:4;18399:28;;;:20;:28;;;;;;18363:1;18377:4;18369:12;;18363:19;18399:35;15647:62:::1;;;::::0;-1:-1:-1;;;15647:62:158;;8688:2:315;15647:62:158::1;::::0;::::1;8670:21:315::0;8727:2;8707:18;;;8700:30;8766:26;8746:18;;;8739:54;8810:18;;15647:62:158::1;8486:348:315::0;15647:62:158::1;695:1:72::0;686:10;;;653:4;757:20;;;15728::158::1;757::72::0;;;;;;721:1;735:4;727:12;;721:19;757:27;:32;15719:69:158::1;;;::::0;-1:-1:-1;;;15719:69:158;;9041:2:315;15719:69:158::1;::::0;::::1;9023:21:315::0;9080:2;9060:18;;;9053:30;9119:25;9099:18;;;9092:53;9162:18;;15719:69:158::1;8839:347:315::0;15719:69:158::1;1228:1:72::0;1219:10;;;1202:14;1283:20;;;15798::158::1;1283::72::0;;;;;:28;;1254:1;1268:4;1260:12;;1254:19;1283:28;;;15846:23:158::1;::::0;345:25:315;;;15846:23:158::1;::::0;333:2:315;318:18;15846:23:158::1;;;;;;;15481:395:::0;:::o;11457:439::-;929:10:62;2684:9:158;-1:-1:-1;;;;;2668:25:158;;2660:76;;;;-1:-1:-1;;;2660:76:158;;;;;;;:::i;:::-;11651:35:::1;11669:9;11680:5;;11651:17;:35::i;:::-;929:10:62::0;187:42:210;659:27;11833:56:158::1;659:27:210::0;11860:7:158;11755:15:::1;11872:9:::0;11883:5;;11833:17:::1;:56::i;:::-;11611:285;11457:439:::0;;;;:::o;4959:133::-;5034:7;5060:12;5073:11;5060:25;;;;;;;;:::i;:::-;;;;;;;;;5053:32;;4959:133;;;:::o;11938:558::-;929:10:62;12162:17:158;-1:-1:-1;;;;;12146:33:158;;12138:84;;;;-1:-1:-1;;;12138:84:158;;9525:2:315;12138:84:158;;;9507:21:315;9564:2;9544:18;;;9537:30;9603:34;9583:18;;;9576:62;-1:-1:-1;;;9654:18:315;;;9647:36;9700:19;;12138:84:158;9323:402:315;12138:84:158;-1:-1:-1;;;;;12304:19:158;;;:24;12296:45;;;;-1:-1:-1;;;12296:45:158;;9932:2:315;12296:45:158;;;9914:21:315;9971:1;9951:18;;;9944:29;-1:-1:-1;;;9989:18:315;;;9982:38;10037:18;;12296:45:158;9730:331:315;12296:45:158;12382:35;12400:9;12411:5;;12382:17;:35::i;:::-;12428:61;12446:7;12455;12464:6;12472:9;12483:5;;12428:17;:61::i;:::-;11938:558;;;;;;:::o;16515:231::-;1334:13:39;:11;:13::i;:::-;16622:11:158::1;::::0;;16643:29;;;;16688:51:::1;::::0;;10240:25:315;;;10296:2;10281:18;;10274:34;;;16688:51:158::1;::::0;10213:18:315;16688:51:158::1;10066:248:315::0;5134:280:158;5269:9;;5232:7;;-1:-1:-1;;;;;5269:9:158;;5288:35;;-1:-1:-1;5322:1:158;;5134:280;-1:-1:-1;;5134:280:158:o;5288:35::-;5340:67;;-1:-1:-1;;;5340:67:158;;;;;345:25:315;;;-1:-1:-1;;;;;5340:56:158;;;;;318:18:315;;5340:67:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5333:74;5134:280;-1:-1:-1;;;5134:280:158:o;5456:275::-;5591:9;;5554:7;;-1:-1:-1;;;;;5591:9:158;;5610:35;;5644:1;5637:8;;;;;5610:35;5662:62;;-1:-1:-1;;;5662:62:158;;-1:-1:-1;;;;;5662:51:158;;;;;:62;;5714:9;;;;5662:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5655:69;5456:275;-1:-1:-1;;;;5456:275:158:o;2314:198:39:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2402:22:39;::::1;2394:73;;;::::0;-1:-1:-1;;;2394:73:39;;11230:2:315;2394:73:39::1;::::0;::::1;11212:21:315::0;11269:2;11249:18;;;11242:30;11308:34;11288:18;;;11281:62;-1:-1:-1;;;11359:18:315;;;11352:36;11405:19;;2394:73:39::1;11028:402:315::0;2394:73:39::1;2477:28;2496:8;2477:18;:28::i;4224:442:158:-:0;3279:19:43;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:43;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:43;1713:19:61;:23;;;3387:66:43;;-1:-1:-1;3436:12:43;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:43;;11637:2:315;3325:201:43;;;11619:21:315;11676:2;11656:18;;;11649:30;11715:34;11695:18;;;11688:62;-1:-1:-1;;;11766:18:315;;;11759:44;11820:19;;3325:201:43;11435:410:315;3325:201:43;3536:12;:16;;-1:-1:-1;;3536:16:43;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:43;;;;;3562:65;4433:35:158::1;:33;:35::i;:::-;4478:9;:22:::0;;-1:-1:-1;;;;;4478:22:158;;::::1;-1:-1:-1::0;;;;;;4478:22:158;;::::1;;::::0;;;4510:11:::1;:26:::0;;;4547:11:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;4581:13:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;4619:19:::1;:40:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;3647:99:43;;;;3697:5;3681:21;;-1:-1:-1;;3681:21:43;;;3721:14;;-1:-1:-1;12002:36:315;;3721:14:43;;11990:2:315;11975:18;3721:14:43;;;;;;;3269:483;4224:442:158;;;;;:::o;1599:130:39:-;1513:6;;-1:-1:-1;;;;;1513:6:39;929:10:62;1662:23:39;1654:68;;;;-1:-1:-1;;;1654:68:39;;12251:2:315;1654:68:39;;;12233:21:315;;;12270:18;;;12263:30;12329:34;12309:18;;;12302:62;12381:18;;1654:68:39;12049:356:315;2666:187:39;2758:6;;;-1:-1:-1;;;;;2774:17:39;;;-1:-1:-1;;;;;;2774:17:39;;;;;;;2806:40;;2758:6;;;2774:17;2758:6;;2806:40;;2739:16;;2806:40;2729:124;2666:187;:::o;17767:401:158:-;17884:11;;17871:9;:24;;17863:74;;;;-1:-1:-1;;;17863:74:158;;12612:2:315;17863:74:158;;;12594:21:315;12651:2;12631:18;;;12624:30;12690:34;12670:18;;;12663:62;-1:-1:-1;;;12741:18:315;;;12734:35;12786:19;;17863:74:158;12410:401:315;17863:74:158;18004:20;18027:35;18052:9;;18027:24;:35::i;:::-;18004:58;;18093:12;18080:9;:25;;18072:89;;;;-1:-1:-1;;;18072:89:158;;13018:2:315;18072:89:158;;;13000:21:315;13057:2;13037:18;;;13030:30;13096:34;13076:18;;;13069:62;-1:-1:-1;;;13147:18:315;;;13140:49;13206:19;;18072:89:158;12816:415:315;18072:89:158;17853:315;17767:401;;;:::o;17236:525::-;17477:12;:19;17455;17522:79;17545:7;17477:19;17567:6;17575:7;17584:9;17595:5;;17522:22;:79::i;:::-;17611:12;:24;;;;;;;-1:-1:-1;17611:24:158;;;;;;;;;17673:81;;17506:95;;-1:-1:-1;;;;;;17673:81:158;;;;;;;;;;;;17708:6;;17723:11;;17737:9;;17748:5;;;;17673:81;:::i;:::-;;;;;;;;17409:352;;17236:525;;;;;;:::o;1003:95:39:-;5374:13:43;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:43;;;;;;;:::i;:::-;1065:26:39::1;5374:13:43::0;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:43;;;;;;;:::i;:::-;1176:32:39::1;929:10:62::0;1176:18:39::1;:32::i;14:180:315:-:0;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:315;;14:180;-1:-1:-1;14:180:315:o;963:316::-;1040:6;1048;1056;1109:2;1097:9;1088:7;1084:23;1080:32;1077:52;;;1125:1;1122;1115:12;1077:52;-1:-1:-1;;1148:23:315;;;1218:2;1203:18;;1190:32;;-1:-1:-1;1269:2:315;1254:18;;;1241:32;;963:316;-1:-1:-1;963:316:315:o;1284:173::-;1352:20;;-1:-1:-1;;;;;1401:31:315;;1391:42;;1381:70;;1447:1;1444;1437:12;1462:347;1513:8;1523:6;1577:3;1570:4;1562:6;1558:17;1554:27;1544:55;;1595:1;1592;1585:12;1544:55;-1:-1:-1;1618:20:315;;1661:18;1650:30;;1647:50;;;1693:1;1690;1683:12;1647:50;1730:4;1722:6;1718:17;1706:29;;1782:3;1775:4;1766:6;1758;1754:19;1750:30;1747:39;1744:59;;;1799:1;1796;1789:12;1744:59;1462:347;;;;;:::o;1814:764::-;1929:6;1937;1945;1953;1961;1969;1977;2030:3;2018:9;2009:7;2005:23;2001:33;1998:53;;;2047:1;2044;2037:12;1998:53;2070:29;2089:9;2070:29;:::i;:::-;2060:39;;2146:2;2135:9;2131:18;2118:32;2108:42;;2197:2;2186:9;2182:18;2169:32;2159:42;;2220:38;2254:2;2243:9;2239:18;2220:38;:::i;:::-;2210:48;;2305:3;2294:9;2290:19;2277:33;2267:43;;2361:3;2350:9;2346:19;2333:33;2389:18;2381:6;2378:30;2375:50;;;2421:1;2418;2411:12;2375:50;2460:58;2510:7;2501:6;2490:9;2486:22;2460:58;:::i;:::-;1814:764;;;;-1:-1:-1;1814:764:315;;-1:-1:-1;1814:764:315;;;;2434:84;;-1:-1:-1;;;1814:764:315:o;2583:186::-;2642:6;2695:2;2683:9;2674:7;2670:23;2666:32;2663:52;;;2711:1;2708;2701:12;2663:52;2734:29;2753:9;2734:29;:::i;2774:551::-;2862:6;2870;2878;2886;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;2978:29;2997:9;2978:29;:::i;:::-;2968:39;;3054:2;3043:9;3039:18;3026:32;3016:42;;3109:2;3098:9;3094:18;3081:32;3136:18;3128:6;3125:30;3122:50;;;3168:1;3165;3158:12;3122:50;3207:58;3257:7;3248:6;3237:9;3233:22;3207:58;:::i;:::-;2774:551;;;;-1:-1:-1;3284:8:315;-1:-1:-1;;;;2774:551:315:o;3330:695::-;3436:6;3444;3452;3460;3468;3476;3529:3;3517:9;3508:7;3504:23;3500:33;3497:53;;;3546:1;3543;3536:12;3497:53;3569:29;3588:9;3569:29;:::i;:::-;3559:39;;3617:38;3651:2;3640:9;3636:18;3617:38;:::i;:::-;3607:48;;3702:2;3691:9;3687:18;3674:32;3664:42;;3753:2;3742:9;3738:18;3725:32;3715:42;;3808:3;3797:9;3793:19;3780:33;3836:18;3828:6;3825:30;3822:50;;;3868:1;3865;3858:12;3822:50;3907:58;3957:7;3948:6;3937:9;3933:22;3907:58;:::i;:::-;3330:695;;;;-1:-1:-1;3330:695:315;;-1:-1:-1;3330:695:315;;3984:8;;3330:695;-1:-1:-1;;;3330:695:315:o;4030:409::-;4100:6;4108;4161:2;4149:9;4140:7;4136:23;4132:32;4129:52;;;4177:1;4174;4167:12;4129:52;4217:9;4204:23;4250:18;4242:6;4239:30;4236:50;;;4282:1;4279;4272:12;4236:50;4321:58;4371:7;4362:6;4351:9;4347:22;4321:58;:::i;:::-;4398:8;;4295:84;;-1:-1:-1;4030:409:315;-1:-1:-1;;;;4030:409:315:o;4444:478::-;4539:6;4547;4555;4563;4571;4624:3;4612:9;4603:7;4599:23;4595:33;4592:53;;;4641:1;4638;4631:12;4592:53;4664:29;4683:9;4664:29;:::i;:::-;4654:39;;4712:38;4746:2;4735:9;4731:18;4712:38;:::i;:::-;4702:48;;4769:38;4803:2;4792:9;4788:18;4769:38;:::i;:::-;4759:48;;4826:38;4860:2;4849:9;4845:18;4826:38;:::i;:::-;4444:478;;;;-1:-1:-1;4444:478:315;;4911:3;4896:19;4883:33;;4444:478;-1:-1:-1;;4444:478:315:o;4927:356::-;5129:2;5111:21;;;5148:18;;;5141:30;5207:34;5202:2;5187:18;;5180:62;5274:2;5259:18;;4927:356::o;7723:402::-;7925:2;7907:21;;;7964:2;7944:18;;;7937:30;8003:34;7998:2;7983:18;;7976:62;-1:-1:-1;;;8069:2:315;8054:18;;8047:36;8115:3;8100:19;;7723:402::o;9191:127::-;9252:10;9247:3;9243:20;9240:1;9233:31;9283:4;9280:1;9273:15;9307:4;9304:1;9297:15;10319:184;10389:6;10442:2;10430:9;10421:7;10417:23;10413:32;10410:52;;;10458:1;10455;10448:12;10410:52;-1:-1:-1;10481:16:315;;10319:184;-1:-1:-1;10319:184:315:o;10508:266::-;10596:6;10591:3;10584:19;10648:6;10641:5;10634:4;10629:3;10625:14;10612:43;-1:-1:-1;10700:1:315;10675:16;;;10693:4;10671:27;;;10664:38;;;;10756:2;10735:15;;;-1:-1:-1;;10731:29:315;10722:39;;;10718:50;;10508:266::o;10779:244::-;10936:2;10925:9;10918:21;10899:4;10956:61;11013:2;11002:9;10998:18;10990:6;10982;10956:61;:::i;13236:482::-;13475:6;13464:9;13457:25;13530:18;13522:6;13518:31;13513:2;13502:9;13498:18;13491:59;13586:6;13581:2;13570:9;13566:18;13559:34;13629:3;13624:2;13613:9;13609:18;13602:31;13438:4;13650:62;13707:3;13696:9;13692:19;13684:6;13676;13650:62;:::i;:::-;13642:70;13236:482;-1:-1:-1;;;;;;;13236:482:315:o;13723:407::-;13925:2;13907:21;;;13964:2;13944:18;;;13937:30;14003:34;13998:2;13983:18;;13976:62;-1:-1:-1;;;14069:2:315;14054:18;;14047:41;14120:3;14105:19;;13723:407::o","linkReferences":{},"immutableReferences":{"88728":[{"start":485,"length":32},{"start":2877,"length":32},{"start":3321,"length":32}],"88731":[{"start":762,"length":32},{"start":1035,"length":32},{"start":1428,"length":32},{"start":2417,"length":32}],"88734":[{"start":583,"length":32},{"start":3484,"length":32}]}},"methodIdentifiers":{"appendCrossDomainMessage(address,uint256,bytes)":"9b159782","appendEnforcedTransaction(address,address,uint256,uint256,bytes)":"bdc6f0a0","calculateIntrinsicGasFee(bytes)":"e172d3a1","computeTransactionHash(address,uint256,uint256,address,uint256,bytes)":"5ad9945a","dropCrossDomainMessage(uint256)":"91652461","enforcedTxGateway()":"3e83496c","estimateCrossDomainMessageFee(uint256)":"d7704bae","finalizePoppedCrossDomainMessage(uint256)":"38050fd4","gasOracle()":"5d62a8dd","getCrossDomainMessage(uint256)":"ae453cd5","initialize(address,address,address,address,uint256)":"f7013ef6","isMessageDropped(uint256)":"3e6dada1","isMessageSkipped(uint256)":"7d82191a","maxGasLimit()":"5e45da23","messageQueue(uint256)":"29aa604b","messenger()":"3cb747bf","nextCrossDomainMessageIndex()":"fd0ad31e","nextUnfinalizedQueueIndex()":"416bdfa1","owner()":"8da5cb5b","pendingQueueIndex()":"a85006ca","popCrossDomainMessage(uint256,uint256,uint256)":"55f613ce","renounceOwnership()":"715018a6","resetPoppedCrossDomainMessage(uint256)":"7a6e9333","scrollChain()":"897630dd","transferOwnership(address)":"f2fde38b","updateGasOracle(address)":"70cee67f","updateMaxGasLimit(uint256)":"d5ad4a97"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_scrollChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"skippedBitmap\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"DropTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"finalizedIndex\",\"type\":\"uint256\"}],\"name\":\"FinalizedDequeuedTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"}],\"name\":\"ResetDequeuedTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"dropCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enforcedTxGateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newFinalizedQueueIndexPlusOne\",\"type\":\"uint256\"}],\"name\":\"finalizePoppedCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasOracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_scrollChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_gasOracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"isMessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"isMessageSkipped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextUnfinalizedQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_skippedBitmap\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"}],\"name\":\"resetPoppedCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scrollChain\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"updateGasOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ErrorZeroAddress()\":[{\"details\":\"Thrown when the given address is `address(0)`.\"}]},\"events\":{\"DequeueTransaction(uint256,uint256,uint256)\":{\"params\":{\"count\":\"The number of messages popped.\",\"skippedBitmap\":\"A bitmap indicates whether a message is skipped.\",\"startIndex\":\"The start index of messages popped.\"}},\"DropTransaction(uint256)\":{\"params\":{\"index\":\"The index of message dropped.\"}},\"FinalizedDequeuedTransaction(uint256)\":{\"params\":{\"finalizedIndex\":\"The last index of messages finalized.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"QueueTransaction(address,address,uint256,uint64,uint256,bytes)\":{\"params\":{\"data\":\"The calldata of the transaction.\",\"gasLimit\":\"Gas limit required to complete the message relay on L2.\",\"queueIndex\":\"The index of this transaction in the queue.\",\"sender\":\"The address of account who initiates the transaction.\",\"target\":\"The address of account who will receive the transaction.\",\"value\":\"The value passed with the transaction.\"}},\"ResetDequeuedTransaction(uint256)\":{\"params\":{\"startIndex\":\"The start index of messages.\"}},\"UpdateGasOracle(address,address)\":{\"params\":{\"_newGasOracle\":\"The address of new gas oracle contract.\",\"_oldGasOracle\":\"The address of old gas oracle contract.\"}},\"UpdateMaxGasLimit(uint256,uint256)\":{\"params\":{\"_newMaxGasLimit\":\"The new max gas limit.\",\"_oldMaxGasLimit\":\"The old max gas limit.\"}}},\"kind\":\"dev\",\"methods\":{\"appendCrossDomainMessage(address,uint256,bytes)\":{\"params\":{\"data\":\"The calldata passed to target contract.\",\"gasLimit\":\"The maximum gas should be used for relay this message in L2.\",\"target\":\"The address of target contract to call in L2.\"}},\"appendEnforcedTransaction(address,address,uint256,uint256,bytes)\":{\"details\":\"The address of sender should be an EOA.\",\"params\":{\"data\":\"The calldata passed to target contract.\",\"gasLimit\":\"The maximum gas should be used for this transaction in L2.\",\"sender\":\"The address of sender who will initiate this transaction in L2.\",\"target\":\"The address of target contract to call in L2.\",\"value\":\"The value passed\"}},\"calculateIntrinsicGasFee(bytes)\":{\"params\":{\"_calldata\":\"The calldata of L1-initiated transaction.\"}},\"computeTransactionHash(address,uint256,uint256,address,uint256,bytes)\":{\"params\":{\"data\":\"The calldata passed to target address.\",\"gasLimit\":\"The gas limit provided.\",\"queueIndex\":\"The queue index of this message.\",\"sender\":\"The address of sender.\",\"target\":\"The address of target.\",\"value\":\"The amount of Ether transfer to target.\"}},\"constructor\":{\"params\":{\"_enforcedTxGateway\":\"The address of `EnforcedTxGateway` contract.\",\"_messenger\":\"The address of `L1ScrollMessenger` contract.\",\"_scrollChain\":\"The address of `ScrollChain` contract.\"}},\"estimateCrossDomainMessageFee(uint256)\":{\"params\":{\"gasLimit\":\"Gas limit required to complete the message relay on L2.\"}},\"finalizePoppedCrossDomainMessage(uint256)\":{\"params\":{\"newFinalizedQueueIndexPlusOne\":\"The index of message to finalize plus one.\"}},\"getCrossDomainMessage(uint256)\":{\"params\":{\"queueIndex\":\"The index to query.\"}},\"initialize(address,address,address,address,uint256)\":{\"details\":\"The parameters `_messenger`, `_scrollChain` and `_enforcedTxGateway` are no longer used.\",\"params\":{\"_enforcedTxGateway\":\"The address of `EnforcedTxGateway` contract.\",\"_gasOracle\":\"The address of `GasOracle` contract.\",\"_maxGasLimit\":\"The maximum gas limit allowed in single transaction.\",\"_messenger\":\"The address of `L1ScrollMessenger` contract.\",\"_scrollChain\":\"The address of `ScrollChain` contract.\"}},\"isMessageDropped(uint256)\":{\"params\":{\"queueIndex\":\"The queue index of the message to check.\"}},\"isMessageSkipped(uint256)\":{\"params\":{\"queueIndex\":\"The queue index of the message to check.\"}},\"nextCrossDomainMessageIndex()\":{\"details\":\"Also the total number of appended messages.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"popCrossDomainMessage(uint256,uint256,uint256)\":{\"details\":\"We can pop at most 256 messages each time. And if the message is not skipped, the corresponding entry will be cleared.\",\"params\":{\"count\":\"The number of messages to pop.\",\"skippedBitmap\":\"A bitmap indicates whether a message is skipped.\",\"startIndex\":\"The start index to pop.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"resetPoppedCrossDomainMessage(uint256)\":{\"details\":\"Caller should make sure `_startIndex < pendingQueueIndex` to reduce unnecessary contract call.\",\"params\":{\"startIndex\":\"The start index to reset.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateGasOracle(address)\":{\"details\":\"This function can only called by contract owner.\",\"params\":{\"_newGasOracle\":\"The address to update.\"}},\"updateMaxGasLimit(uint256)\":{\"details\":\"This function can only called by contract owner.\",\"params\":{\"_newMaxGasLimit\":\"The new max gas limit.\"}}},\"stateVariables\":{\"__enforcedTxGateway\":{\"details\":\"The storage slot used as EnforcedTxGateway contract, which is deprecated now.\"},\"__gap\":{\"details\":\"The storage slots for future usage.\"},\"__messenger\":{\"details\":\"The storage slot used as L1ScrollMessenger contract, which is deprecated now.\"},\"__scrollChain\":{\"details\":\"The storage slot used as ScrollChain contract, which is deprecated now.\"},\"droppedMessageBitmap\":{\"details\":\"The bitmap for dropped messages, where `droppedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`.\"},\"nextUnfinalizedQueueIndex\":{\"details\":\"All messages from `nextUnfinalizedQueueIndex` to `pendingQueueIndex-1` are committed but not finalized.\"},\"skippedMessageBitmap\":{\"details\":\"The bitmap for skipped messages, where `skippedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`.\"}},\"title\":\"L1MessageQueue\",\"version\":1},\"userdoc\":{\"events\":{\"DequeueTransaction(uint256,uint256,uint256)\":{\"notice\":\"Emitted when some L1 => L2 transactions are included in L1.\"},\"DropTransaction(uint256)\":{\"notice\":\"Emitted when a message is dropped from L1.\"},\"FinalizedDequeuedTransaction(uint256)\":{\"notice\":\"Emitted when some L1 => L2 transactions are finalized in L1.\"},\"QueueTransaction(address,address,uint256,uint64,uint256,bytes)\":{\"notice\":\"Emitted when a new L1 => L2 transaction is appended to the queue.\"},\"ResetDequeuedTransaction(uint256)\":{\"notice\":\"Emitted when dequeued transactions are reset.\"},\"UpdateGasOracle(address,address)\":{\"notice\":\"Emitted when owner updates gas oracle contract.\"},\"UpdateMaxGasLimit(uint256,uint256)\":{\"notice\":\"Emitted when owner updates max gas limit.\"}},\"kind\":\"user\",\"methods\":{\"appendCrossDomainMessage(address,uint256,bytes)\":{\"notice\":\"Append a L1 to L2 message into this contract.\"},\"appendEnforcedTransaction(address,address,uint256,uint256,bytes)\":{\"notice\":\"Append an enforced transaction to this contract.\"},\"calculateIntrinsicGasFee(bytes)\":{\"notice\":\"Return the amount of intrinsic gas fee should pay for cross domain message.\"},\"computeTransactionHash(address,uint256,uint256,address,uint256,bytes)\":{\"notice\":\"Return the hash of a L1 message.\"},\"constructor\":{\"notice\":\"Constructor for `L1MessageQueue` implementation contract.\"},\"dropCrossDomainMessage(uint256)\":{\"notice\":\"Drop a skipped message from the queue.\"},\"enforcedTxGateway()\":{\"notice\":\"The address EnforcedTxGateway contract.\"},\"estimateCrossDomainMessageFee(uint256)\":{\"notice\":\"Return the amount of ETH should pay for cross domain message.\"},\"finalizePoppedCrossDomainMessage(uint256)\":{\"notice\":\"Finalize status of popped messages.\"},\"gasOracle()\":{\"notice\":\"The address of GasOracle contract.\"},\"getCrossDomainMessage(uint256)\":{\"notice\":\"Return the message of in `queueIndex`.\"},\"initialize(address,address,address,address,uint256)\":{\"notice\":\"Initialize the storage of L1MessageQueue.\"},\"isMessageDropped(uint256)\":{\"notice\":\"Return whether the message is dropped.\"},\"isMessageSkipped(uint256)\":{\"notice\":\"Return whether the message is skipped.\"},\"maxGasLimit()\":{\"notice\":\"The max gas limit of L1 transactions.\"},\"messageQueue(uint256)\":{\"notice\":\"The list of queued cross domain messages.\"},\"messenger()\":{\"notice\":\"The address of L1ScrollMessenger contract.\"},\"nextCrossDomainMessageIndex()\":{\"notice\":\"Return the index of next appended message.\"},\"nextUnfinalizedQueueIndex()\":{\"notice\":\"The start index of all unfinalized messages.\"},\"pendingQueueIndex()\":{\"notice\":\"The start index of all pending inclusion messages.\"},\"popCrossDomainMessage(uint256,uint256,uint256)\":{\"notice\":\"Pop messages from queue.\"},\"resetPoppedCrossDomainMessage(uint256)\":{\"notice\":\"Reset status of popped messages.\"},\"scrollChain()\":{\"notice\":\"The address of ScrollChain contract.\"},\"updateGasOracle(address)\":{\"notice\":\"Update the address of gas oracle.\"},\"updateMaxGasLimit(uint256)\":{\"notice\":\"Update the max gas limit.\"}},\"notice\":\"This contract will hold all L1 to L2 messages. Each appended message is assigned with a unique and increasing `uint256` index.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/rollup/L1MessageQueue.sol\":\"L1MessageQueue\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=node_modules/hardhat/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/structs/BitMapsUpgradeable.sol\":{\"keccak256\":\"0x07aab61872a5dd56d876a8d8f82f4cc063e74d16ec9f1eff100fcaee423b5de9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://399cf9ed2bce652a340c0336a2a426c88ad593aa989b4bb239d0ba44385d66a4\",\"dweb:/ipfs/QmVCKpLx1qJ16iMvjA2ZLT2b9iGRq3ybVQN3RxoUgwMwxn\"]},\"src/L1/rollup/IL1MessageQueue.sol\":{\"keccak256\":\"0x12004e1269374a9b58604c84c161ae7c94de0b5b7cd2167441c2c23fc790929c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04709bb7ddff34f9bb076bc76cadc281b190e71e0913bdcf15c0934f1e5ae660\",\"dweb:/ipfs/Qmcyfkw9rFSf7rM778vRnsynohGW1A6rqAqDZJ4D7xpA74\"]},\"src/L1/rollup/IL2GasPriceOracle.sol\":{\"keccak256\":\"0x66bcc3b1d8b788bb2aa7a54bac032c1c42ea87d79199496df4e220a6d763a70e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3d64655947819c458531a47b76458c335960f089bd6dd6750934b20ca06dca6a\",\"dweb:/ipfs/QmdeKcVJDLs6T8GqfsdPvL2SWZykssf1dCg2zZg12qi97x\"]},\"src/L1/rollup/L1MessageQueue.sol\":{\"keccak256\":\"0x3990c3771cbc9ff0f96e59507c948662b2d69c976748710440d65acc8cfb7c52\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c7894e98ac255b8a8292ae304c2b1adfa62bf45c78f3118b22384347978be674\",\"dweb:/ipfs/QmYAEtFyYozsZqPYYusnVWTQn9npb8DpQBWVvSGyVLft9S\"]},\"src/libraries/common/AddressAliasHelper.sol\":{\"keccak256\":\"0x74b939036c610744839035874ae3e49bc1bb829493b89af9592bf9c95b8dd233\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://260ed26d18cfeaa7e1de6df28d365f0ae2b169d557dabcb44108d25bcbf1aef4\",\"dweb:/ipfs/QmVxUymC3t7Ukzh8sqYtkhXB6zJT3ZkZungNAvp9YTPsJ5\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_messenger","type":"address"},{"internalType":"address","name":"_scrollChain","type":"address"},{"internalType":"address","name":"_enforcedTxGateway","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"ErrorZeroAddress"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256","indexed":false},{"internalType":"uint256","name":"count","type":"uint256","indexed":false},{"internalType":"uint256","name":"skippedBitmap","type":"uint256","indexed":false}],"type":"event","name":"DequeueTransaction","anonymous":false},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256","indexed":false}],"type":"event","name":"DropTransaction","anonymous":false},{"inputs":[{"internalType":"uint256","name":"finalizedIndex","type":"uint256","indexed":false}],"type":"event","name":"FinalizedDequeuedTransaction","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false},{"internalType":"uint64","name":"queueIndex","type":"uint64","indexed":false},{"internalType":"uint256","name":"gasLimit","type":"uint256","indexed":false},{"internalType":"bytes","name":"data","type":"bytes","indexed":false}],"type":"event","name":"QueueTransaction","anonymous":false},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256","indexed":false}],"type":"event","name":"ResetDequeuedTransaction","anonymous":false},{"inputs":[{"internalType":"address","name":"_oldGasOracle","type":"address","indexed":true},{"internalType":"address","name":"_newGasOracle","type":"address","indexed":true}],"type":"event","name":"UpdateGasOracle","anonymous":false},{"inputs":[{"internalType":"uint256","name":"_oldMaxGasLimit","type":"uint256","indexed":false},{"internalType":"uint256","name":"_newMaxGasLimit","type":"uint256","indexed":false}],"type":"event","name":"UpdateMaxGasLimit","anonymous":false},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"appendCrossDomainMessage"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"appendEnforcedTransaction"},{"inputs":[{"internalType":"bytes","name":"_calldata","type":"bytes"}],"stateMutability":"view","type":"function","name":"calculateIntrinsicGasFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_queueIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"pure","type":"function","name":"computeTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"dropCrossDomainMessage"},{"inputs":[],"stateMutability":"view","type":"function","name":"enforcedTxGateway","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_gasLimit","type":"uint256"}],"stateMutability":"view","type":"function","name":"estimateCrossDomainMessageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_newFinalizedQueueIndexPlusOne","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"finalizePoppedCrossDomainMessage"},{"inputs":[],"stateMutability":"view","type":"function","name":"gasOracle","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_queueIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"getCrossDomainMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"_messenger","type":"address"},{"internalType":"address","name":"_scrollChain","type":"address"},{"internalType":"address","name":"_enforcedTxGateway","type":"address"},{"internalType":"address","name":"_gasOracle","type":"address"},{"internalType":"uint256","name":"_maxGasLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"_queueIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"isMessageDropped","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"_queueIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"isMessageSkipped","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"messageQueue","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"messenger","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextCrossDomainMessageIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextUnfinalizedQueueIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pendingQueueIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_startIndex","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_skippedBitmap","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"popCrossDomainMessage"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint256","name":"_startIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"resetPoppedCrossDomainMessage"},{"inputs":[],"stateMutability":"view","type":"function","name":"scrollChain","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"_newGasOracle","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"updateGasOracle"},{"inputs":[{"internalType":"uint256","name":"_newMaxGasLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"updateMaxGasLimit"}],"devdoc":{"kind":"dev","methods":{"appendCrossDomainMessage(address,uint256,bytes)":{"params":{"data":"The calldata passed to target contract.","gasLimit":"The maximum gas should be used for relay this message in L2.","target":"The address of target contract to call in L2."}},"appendEnforcedTransaction(address,address,uint256,uint256,bytes)":{"details":"The address of sender should be an EOA.","params":{"data":"The calldata passed to target contract.","gasLimit":"The maximum gas should be used for this transaction in L2.","sender":"The address of sender who will initiate this transaction in L2.","target":"The address of target contract to call in L2.","value":"The value passed"}},"calculateIntrinsicGasFee(bytes)":{"params":{"_calldata":"The calldata of L1-initiated transaction."}},"computeTransactionHash(address,uint256,uint256,address,uint256,bytes)":{"params":{"data":"The calldata passed to target address.","gasLimit":"The gas limit provided.","queueIndex":"The queue index of this message.","sender":"The address of sender.","target":"The address of target.","value":"The amount of Ether transfer to target."}},"constructor":{"params":{"_enforcedTxGateway":"The address of `EnforcedTxGateway` contract.","_messenger":"The address of `L1ScrollMessenger` contract.","_scrollChain":"The address of `ScrollChain` contract."}},"estimateCrossDomainMessageFee(uint256)":{"params":{"gasLimit":"Gas limit required to complete the message relay on L2."}},"finalizePoppedCrossDomainMessage(uint256)":{"params":{"newFinalizedQueueIndexPlusOne":"The index of message to finalize plus one."}},"getCrossDomainMessage(uint256)":{"params":{"queueIndex":"The index to query."}},"initialize(address,address,address,address,uint256)":{"details":"The parameters `_messenger`, `_scrollChain` and `_enforcedTxGateway` are no longer used.","params":{"_enforcedTxGateway":"The address of `EnforcedTxGateway` contract.","_gasOracle":"The address of `GasOracle` contract.","_maxGasLimit":"The maximum gas limit allowed in single transaction.","_messenger":"The address of `L1ScrollMessenger` contract.","_scrollChain":"The address of `ScrollChain` contract."}},"isMessageDropped(uint256)":{"params":{"queueIndex":"The queue index of the message to check."}},"isMessageSkipped(uint256)":{"params":{"queueIndex":"The queue index of the message to check."}},"nextCrossDomainMessageIndex()":{"details":"Also the total number of appended messages."},"owner()":{"details":"Returns the address of the current owner."},"popCrossDomainMessage(uint256,uint256,uint256)":{"details":"We can pop at most 256 messages each time. And if the message is not skipped, the corresponding entry will be cleared.","params":{"count":"The number of messages to pop.","skippedBitmap":"A bitmap indicates whether a message is skipped.","startIndex":"The start index to pop."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"resetPoppedCrossDomainMessage(uint256)":{"details":"Caller should make sure `_startIndex < pendingQueueIndex` to reduce unnecessary contract call.","params":{"startIndex":"The start index to reset."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateGasOracle(address)":{"details":"This function can only called by contract owner.","params":{"_newGasOracle":"The address to update."}},"updateMaxGasLimit(uint256)":{"details":"This function can only called by contract owner.","params":{"_newMaxGasLimit":"The new max gas limit."}}},"version":1},"userdoc":{"kind":"user","methods":{"appendCrossDomainMessage(address,uint256,bytes)":{"notice":"Append a L1 to L2 message into this contract."},"appendEnforcedTransaction(address,address,uint256,uint256,bytes)":{"notice":"Append an enforced transaction to this contract."},"calculateIntrinsicGasFee(bytes)":{"notice":"Return the amount of intrinsic gas fee should pay for cross domain message."},"computeTransactionHash(address,uint256,uint256,address,uint256,bytes)":{"notice":"Return the hash of a L1 message."},"constructor":{"notice":"Constructor for `L1MessageQueue` implementation contract."},"dropCrossDomainMessage(uint256)":{"notice":"Drop a skipped message from the queue."},"enforcedTxGateway()":{"notice":"The address EnforcedTxGateway contract."},"estimateCrossDomainMessageFee(uint256)":{"notice":"Return the amount of ETH should pay for cross domain message."},"finalizePoppedCrossDomainMessage(uint256)":{"notice":"Finalize status of popped messages."},"gasOracle()":{"notice":"The address of GasOracle contract."},"getCrossDomainMessage(uint256)":{"notice":"Return the message of in `queueIndex`."},"initialize(address,address,address,address,uint256)":{"notice":"Initialize the storage of L1MessageQueue."},"isMessageDropped(uint256)":{"notice":"Return whether the message is dropped."},"isMessageSkipped(uint256)":{"notice":"Return whether the message is skipped."},"maxGasLimit()":{"notice":"The max gas limit of L1 transactions."},"messageQueue(uint256)":{"notice":"The list of queued cross domain messages."},"messenger()":{"notice":"The address of L1ScrollMessenger contract."},"nextCrossDomainMessageIndex()":{"notice":"Return the index of next appended message."},"nextUnfinalizedQueueIndex()":{"notice":"The start index of all unfinalized messages."},"pendingQueueIndex()":{"notice":"The start index of all pending inclusion messages."},"popCrossDomainMessage(uint256,uint256,uint256)":{"notice":"Pop messages from queue."},"resetPoppedCrossDomainMessage(uint256)":{"notice":"Reset status of popped messages."},"scrollChain()":{"notice":"The address of ScrollChain contract."},"updateGasOracle(address)":{"notice":"Update the address of gas oracle."},"updateMaxGasLimit(uint256)":{"notice":"Update the max gas limit."}},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/L1/rollup/L1MessageQueue.sol":"L1MessageQueue"},"evmVersion":"cancun","libraries":{}},"sources":{"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98","urls":["bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8","dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/structs/BitMapsUpgradeable.sol":{"keccak256":"0x07aab61872a5dd56d876a8d8f82f4cc063e74d16ec9f1eff100fcaee423b5de9","urls":["bzz-raw://399cf9ed2bce652a340c0336a2a426c88ad593aa989b4bb239d0ba44385d66a4","dweb:/ipfs/QmVCKpLx1qJ16iMvjA2ZLT2b9iGRq3ybVQN3RxoUgwMwxn"],"license":"MIT"},"src/L1/rollup/IL1MessageQueue.sol":{"keccak256":"0x12004e1269374a9b58604c84c161ae7c94de0b5b7cd2167441c2c23fc790929c","urls":["bzz-raw://04709bb7ddff34f9bb076bc76cadc281b190e71e0913bdcf15c0934f1e5ae660","dweb:/ipfs/Qmcyfkw9rFSf7rM778vRnsynohGW1A6rqAqDZJ4D7xpA74"],"license":"MIT"},"src/L1/rollup/IL2GasPriceOracle.sol":{"keccak256":"0x66bcc3b1d8b788bb2aa7a54bac032c1c42ea87d79199496df4e220a6d763a70e","urls":["bzz-raw://3d64655947819c458531a47b76458c335960f089bd6dd6750934b20ca06dca6a","dweb:/ipfs/QmdeKcVJDLs6T8GqfsdPvL2SWZykssf1dCg2zZg12qi97x"],"license":"MIT"},"src/L1/rollup/L1MessageQueue.sol":{"keccak256":"0x3990c3771cbc9ff0f96e59507c948662b2d69c976748710440d65acc8cfb7c52","urls":["bzz-raw://c7894e98ac255b8a8292ae304c2b1adfa62bf45c78f3118b22384347978be674","dweb:/ipfs/QmYAEtFyYozsZqPYYusnVWTQn9npb8DpQBWVvSGyVLft9S"],"license":"MIT"},"src/libraries/common/AddressAliasHelper.sol":{"keccak256":"0x74b939036c610744839035874ae3e49bc1bb829493b89af9592bf9c95b8dd233","urls":["bzz-raw://260ed26d18cfeaa7e1de6df28d365f0ae2b169d557dabcb44108d25bcbf1aef4","dweb:/ipfs/QmVxUymC3t7Ukzh8sqYtkhXB6zJT3ZkZungNAvp9YTPsJ5"],"license":"MIT"}},"version":1},"id":158} \ No newline at end of file diff --git a/crates/l1/abi/ScrollChain.json b/crates/l1/abi/ScrollChain.json new file mode 100644 index 00000000..03004c49 --- /dev/null +++ b/crates/l1/abi/ScrollChain.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_chainId","type":"uint64","internalType":"uint64"},{"name":"_messageQueue","type":"address","internalType":"address"},{"name":"_verifier","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"addProver","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addSequencer","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"commitBatch","inputs":[{"name":"_version","type":"uint8","internalType":"uint8"},{"name":"_parentBatchHeader","type":"bytes","internalType":"bytes"},{"name":"_chunks","type":"bytes[]","internalType":"bytes[]"},{"name":"_skippedL1MessageBitmap","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"commitBatchWithBlobProof","inputs":[{"name":"_version","type":"uint8","internalType":"uint8"},{"name":"_parentBatchHeader","type":"bytes","internalType":"bytes"},{"name":"_chunks","type":"bytes[]","internalType":"bytes[]"},{"name":"_skippedL1MessageBitmap","type":"bytes","internalType":"bytes"},{"name":"_blobDataProof","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"committedBatches","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"finalizeBatchWithProof4844","inputs":[{"name":"_batchHeader","type":"bytes","internalType":"bytes"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"_postStateRoot","type":"bytes32","internalType":"bytes32"},{"name":"_withdrawRoot","type":"bytes32","internalType":"bytes32"},{"name":"_blobDataProof","type":"bytes","internalType":"bytes"},{"name":"_aggrProof","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeBundleWithProof","inputs":[{"name":"_batchHeader","type":"bytes","internalType":"bytes"},{"name":"_postStateRoot","type":"bytes32","internalType":"bytes32"},{"name":"_withdrawRoot","type":"bytes32","internalType":"bytes32"},{"name":"_aggrProof","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizedStateRoots","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"importGenesisBatch","inputs":[{"name":"_batchHeader","type":"bytes","internalType":"bytes"},{"name":"_stateRoot","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"_messageQueue","type":"address","internalType":"address"},{"name":"_verifier","type":"address","internalType":"address"},{"name":"_maxNumTxInChunk","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isBatchFinalized","inputs":[{"name":"_batchIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isProver","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSequencer","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"lastFinalizedBatchIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"layer2ChainId","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"maxNumTxInChunk","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"messageQueue","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeProver","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeSequencer","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revertBatch","inputs":[{"name":"_firstBatchHeader","type":"bytes","internalType":"bytes"},{"name":"_lastBatchHeader","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPause","inputs":[{"name":"_status","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateMaxNumTxInChunk","inputs":[{"name":"_maxNumTxInChunk","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"verifier","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"withdrawRoots","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"event","name":"CommitBatch","inputs":[{"name":"batchIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"batchHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"FinalizeBatch","inputs":[{"name":"batchIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"batchHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"withdrawRoot","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RevertBatch","inputs":[{"name":"batchIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"batchHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"UpdateMaxNumTxInChunk","inputs":[{"name":"oldMaxNumTxInChunk","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newMaxNumTxInChunk","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UpdateProver","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"UpdateSequencer","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"error","name":"ErrorAccountIsNotEOA","inputs":[]},{"type":"error","name":"ErrorBatchHeaderV0LengthTooSmall","inputs":[]},{"type":"error","name":"ErrorBatchHeaderV1LengthTooSmall","inputs":[]},{"type":"error","name":"ErrorBatchHeaderV3LengthMismatch","inputs":[]},{"type":"error","name":"ErrorBatchIsAlreadyCommitted","inputs":[]},{"type":"error","name":"ErrorBatchIsAlreadyVerified","inputs":[]},{"type":"error","name":"ErrorBatchIsEmpty","inputs":[]},{"type":"error","name":"ErrorCallPointEvaluationPrecompileFailed","inputs":[]},{"type":"error","name":"ErrorCallerIsNotProver","inputs":[]},{"type":"error","name":"ErrorCallerIsNotSequencer","inputs":[]},{"type":"error","name":"ErrorFoundMultipleBlobs","inputs":[]},{"type":"error","name":"ErrorGenesisBatchHasNonZeroField","inputs":[]},{"type":"error","name":"ErrorGenesisBatchImported","inputs":[]},{"type":"error","name":"ErrorGenesisDataHashIsZero","inputs":[]},{"type":"error","name":"ErrorGenesisParentBatchHashIsNonZero","inputs":[]},{"type":"error","name":"ErrorIncompleteL2TransactionData","inputs":[]},{"type":"error","name":"ErrorIncorrectBatchHash","inputs":[]},{"type":"error","name":"ErrorIncorrectBatchIndex","inputs":[]},{"type":"error","name":"ErrorIncorrectBatchVersion","inputs":[]},{"type":"error","name":"ErrorIncorrectBitmapLength","inputs":[]},{"type":"error","name":"ErrorIncorrectBitmapLengthV0","inputs":[]},{"type":"error","name":"ErrorIncorrectBitmapLengthV1","inputs":[]},{"type":"error","name":"ErrorIncorrectChunkLengthV1","inputs":[]},{"type":"error","name":"ErrorLastL1MessageSkipped","inputs":[]},{"type":"error","name":"ErrorNoBlobFound","inputs":[]},{"type":"error","name":"ErrorNoBlockInChunkV1","inputs":[]},{"type":"error","name":"ErrorNumTxsLessThanNumL1Msgs","inputs":[]},{"type":"error","name":"ErrorRevertFinalizedBatch","inputs":[]},{"type":"error","name":"ErrorRevertNotStartFromEnd","inputs":[]},{"type":"error","name":"ErrorRevertZeroBatches","inputs":[]},{"type":"error","name":"ErrorStateRootIsZero","inputs":[]},{"type":"error","name":"ErrorTooManyTxsInOneChunk","inputs":[]},{"type":"error","name":"ErrorUnexpectedPointEvaluationPrecompileOutput","inputs":[]},{"type":"error","name":"ErrorZeroAddress","inputs":[]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b50604051620029953803806200299583398101604081905262000033916200017a565b6001600160a01b03821615806200005157506001600160a01b038116155b15620000705760405163a7f9319d60e01b815260040160405180910390fd5b6200007a620000a0565b6001600160401b039092166080526001600160a01b0390811660a0521660c052620001cd565b5f54610100900460ff16156200010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200015c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000175575f80fd5b919050565b5f805f606084860312156200018d575f80fd5b83516001600160401b0381168114620001a4575f80fd5b9250620001b4602085016200015e565b9150620001c4604085016200015e565b90509250925092565b60805160a05160c051612765620002305f395f8181610306015281816105a30152610d1b01525f818161034501528181610f7d0152818161186901528181611a1e0152611e1c01525f81816101d8015281816105140152610c5101526127655ff3fe608060405234801561000f575f80fd5b50600436106101ba575f3560e01c80634f099e3d116100f35780638a33623111610093578063bedb86fb1161006e578063bedb86fb14610432578063ea5f084f14610445578063ef6602ba14610464578063f2fde38b1461046d575f80fd5b80638a336231146103fb5780638da5cb5b1461040e578063b571d3dd1461041f575f80fd5b80636d46e987116100ce5780636d46e987146103ab5780636df4e686146103cd578063715018a6146103e057806386b053a9146103e8575f80fd5b80634f099e3d1461037a5780635c975abb1461038d5780636989ca7c14610398575f80fd5b80631d49e4571161015e5780632571098d116101395780632571098d146102e25780632b7ac3f3146103015780633b70c18a146103405780633fdeecb214610367575f80fd5b80631d49e4571461029d5780631e228302146102b05780632362f03e146102c3575f80fd5b80630a245924116101995780630a2459241461022f578063116a1f42146102615780631325aca0146102775780631794bb3c1461028a575f80fd5b8062b0f4d7146101be57806303c7f4af146101d3578063059def6114610218575b5f80fd5b6101d16101cc366004611fb5565b610480565b005b6101fa7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610221609c5481565b60405190815260200161020f565b61025161023d366004612080565b609b6020525f908152604090205460ff1681565b604051901515815260200161020f565b61025161026f3660046120a0565b609c54101590565b6101d16102853660046121f8565b610656565b6101d1610298366004612296565b61078b565b6101d16102ab366004612080565b61090c565b6101d16102be3660046120a0565b61099a565b6102216102d13660046120a0565b609d6020525f908152604090205481565b6102216102f03660046120a0565b609e6020525f908152604090205481565b6103287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161020f565b6103287f000000000000000000000000000000000000000000000000000000000000000081565b6101d16103753660046122cf565b6109e7565b6101d1610388366004612317565b610bbe565b60655460ff16610251565b6101d16103a6366004612080565b610dfb565b6102516103b9366004612080565b609a6020525f908152604090205460ff1681565b6101d16103db366004612375565b610e51565b6101d1610fd8565b6101d16103f63660046123dc565b610feb565b6101d1610409366004612080565b611162565b6033546001600160a01b0316610328565b6101d161042d366004612080565b6111e9565b6101d16104403660046124a2565b61123f565b6102216104533660046120a0565b609f6020525f908152604090205481565b61022160975481565b6101d161047b366004612080565b611260565b335f908152609b602052604090205460ff166104af57604051637b263b1760e01b815260040160405180910390fd5b6104b76112d6565b5f805f6104c58c8c8b61131c565b9250925092505f806104d8856019015190565b90505f6104e6866039015190565b90505f609e816104f76001886124d5565b81526020019081526020015f20549050610512828c8c611385565b7f0000000000000000000000000000000000000000000000000000000000000000818e8e868f8f5f9060409261054a939291906124e8565b8860405160200161056298979695949392919061250f565b6040516020818303038152906040528051906020012093505050505f610589855160f81c90565b604051630581350960e31b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632c09a848906105e090849087908c908c90899060040161257e565b5f6040518083038186803b1580156105f6575f80fd5b505afa158015610608573d5f803e3d5ffd5b505050505f61061b866011015160c01c90565b90506106386079870182610633896009015160c01c90565b611481565b6106458185878f8f61149e565b505050505050505050505050505050565b335f908152609a602052604090205460ff1661068557604051631e6edd6f60e11b815260040160405180910390fd5b61068d6112d6565b5f805f61069b888888611528565b9250925092505f805f808c60ff166001111580156106bd575060028d60ff1611155b1561074c576106ce858b8b8b611590565b60405196810196945090925090506106e98360ff8f16611608565b60c086811b600185015281811b600985015285901b60118401526019830182905261071f8361071661160f565b60399190910152565b60598301879052610731838a8a611655565b610745836107408a60796125af565b902090565b9350610765565b60405163bacd96e960e01b815260040160405180910390fd5b61077285828b8b5f611661565b61077c86856116a4565b50505050505050505050505050565b5f54610100900460ff16158080156107a957505f54600160ff909116105b806107c25750303b1580156107c257505f5460ff166001145b61082a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561084b575f805461ff0019166101001790555b6108536116e2565b6097829055609980546001600160a01b038581166001600160a01b0319928316179092556098805492871692909116919091179055604080515f8152602081018490527f6d0f49971e462a2f78a25906f145cb29cd5e7bd01ebf681ac8f58cb814e5877a910160405180910390a18015610906575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610914611710565b6001600160a01b0381163b1561093d57604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609b6020908152604091829020805460ff1916600190811790915591519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e91015b60405180910390a250565b6109a2611710565b609780549082905560408051828152602081018490527f6d0f49971e462a2f78a25906f145cb29cd5e7bd01ebf681ac8f58cb814e5877a910160405180910390a15050565b80610a055760405163f9a9465f60e01b815260040160405180910390fd5b5f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415610a4d5760405163c22a199f60e01b815260040160405180910390fd5b5f80610a59858561176a565b5050915091505f610a6e836011015160c01c90565b600984015160c01c600185015160c01c855160f81c01010190508015610aa75760405163f4f38de560e01b815260040160405180910390fd5b505f610ab4836019015190565b03610ad2576040516303d840a960e41b815260040160405180910390fd5b5f610ade836039015190565b14610afc57604051632781461960e11b815260040160405180910390fd5b5f8080527fc5dc36ae4e7617e4c4d23ddfcde33c79e9ed64c300aed766a9288a6b9b31f63d829055609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959788490556040518291907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f908290a3604080518481525f60208201819052839290917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d91015b60405180910390a35050505050565b335f908152609b602052604090205460ff16610bed57604051637b263b1760e01b815260040160405180910390fd5b610bf56112d6565b83610c135760405163f9a9465f60e01b815260040160405180910390fd5b5f805f80610c218a8a61176a565b609c5493975091955093509150808311610c4e5760405163092d315560e41b815260040160405180910390fd5b5f7f0000000000000000000000000000000000000000000000000000000000000000610c7a83866124d5565b5f848152609e6020908152604080832054609d83529281902054905160c09590951b6001600160c01b0319169185019190915260e09290921b6001600160e01b0319166028840152602c830152604c820152606c81018b9052608c810186905260ac81018a905260cc0160405160208183030381529060405290505f610d01875160f81c90565b6040516322a262c960e01b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906322a262c990610d5890849089908e908e9089906004016125e4565b5f6040518083038186803b158015610d6e575f80fd5b505afa158015610d80573d5f803e3d5ffd5b505050609c869055505f858152609e602090815260408083208e9055609f90915290208a9055610daf8461184d565b604080518c8152602081018c9052879187917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a350505050505050505050505050565b610e03611710565b6001600160a01b0381165f818152609a60209081526040808320805460ff19169055519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161098f565b610e59611710565b5f805f610e66878761176a565b935093505092505f610e78868661176a565b509250505080831115610e9e57604051635453822b60e11b815260040160405180910390fd5b5f609d81610ead8460016125af565b81526020019081526020015f205414610ed957604051633f707d7d60e21b815260040160405180910390fd5b609c548311610efb57604051632ad7756360e11b815260040160405180910390fd5b805b838110610f53575f818152609d602052604080822080549083905590519091829184917ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb471014691a350610f4c81612637565b9050610efd565b505f610f63856009015160c01c90565b604051637a6e933360e01b815281850360048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637a6e9333906024015f604051808303815f87803b158015610fc6575f80fd5b505af115801561077c573d5f803e3d5ffd5b610fe0611710565b610fe95f6118c4565b565b335f908152609a602052604090205460ff1661101a57604051631e6edd6f60e11b815260040160405180910390fd5b6110226112d6565b60028860ff16116110465760405163bacd96e960e01b815260040160405180910390fd5b6040805160c1810190915261105e8160ff8b16611608565b5f805f61106c8b8b8b611528565b60c082901b6001880152919450925090505f8061108b838c8c8c611590565b9150915080830192506110a283828c8c6001611661565b60c081811b600988015283901b6011870152601986018290525f6110c461160f565b90506110d1818a8a611385565b60398701819052605987018690525f808d60018f516110f091906124d5565b815181106111005761110061264c565b6020908102919091018101519081015160f81c603c028101601219015190915060c01c60c081901b60798b015291506111369050565b611141888b8b611915565b60c1882061114f87826116a4565b5050505050505050505050505050505050565b61116a611710565b6001600160a01b0381163b1561119357604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609a6020908152604091829020805460ff1916600190811790915591519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161098f565b6111f1611710565b6001600160a01b0381165f818152609b60209081526040808320805460ff19169055519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e910161098f565b611247611710565b801561125857611255611922565b50565b61125561197c565b611268611710565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610821565b611255816118c4565b60655460ff1615610fe95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610821565b5f80808361133d5760405163f9a9465f60e01b815260040160405180910390fd5b611347868661176a565b505f818152609e602052604090205492955090935091501561137c5760405163092d315560e41b815260040160405180910390fd5b93509350939050565b5f80600a6001600160a01b03168585856040516020016113a793929190612660565b60408051601f19818403018152908290526113c191612679565b5f60405180830381855afa9150503d805f81146113f9576040519150601f19603f3d011682016040523d82523d5f602084013e6113fe565b606091505b509150915081611421576040516371ebedf560e01b815260040160405180910390fd5b5f818060200190518101906114369190612694565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001811461147957604051638a89514360e01b815260040160405180910390fd5b505050505050565b805f0361148d57505050565b6114995f8484846119b5565b505050565b83609c54600101146114c357604051631d17cec760e21b815260040160405180910390fd5b609c8490555f848152609e60209081526040808320859055609f90915290208190556114ee8561184d565b6040805183815260208101839052849186917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d9101610baf565b5f805f83515f0361154c57604051632974c17360e21b815260040160405180910390fd5b611556868661176a565b60019091015f818152609d60205260409020549296509450925015905061137c5760405163012137ab60e41b815260040160405180910390fd5b8251604080516020830281019091525f918291825b828110156115f1575f806115d58a84815181106115c4576115c461264c565b6020026020010151878d8c8c611a9a565b9085529a8b019a959095019450506020909101906001016115a5565b506020919091029081900320969095509350505050565b8082535050565b5f496001498161163257604051630168f63160e21b815260040160405180910390fd5b801561165157604051634c976a6160e11b815260040160405180910390fd5b5090565b80826079850137505050565b8161010060ff8601046020021461168b57604051630808452960e31b815260040160405180910390fd5b801561169d5761169d83838787611bd2565b5050505050565b5f828152609d602052604080822083905551829184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050565b5f54610100900460ff166117085760405162461bcd60e51b8152600401610821906126b6565b610fe9611be6565b6033546001600160a01b03163314610fe95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610821565b5f808080853560f81c8181810361178f576117858888611c15565b90965090506117b9565b600282116117a1576117858888611c8e565b600382106117b9576117b38888611cff565b90965090505b80862094506117cc866001015160c01c90565b93506117dc866011015160c01c90565b5f858152609d6020526040902054909350851480159061182457505f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415155b156118425760405163150e0a2160e11b815260040160405180910390fd5b505092959194509250565b801561125557604051630e0143f560e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906338050fd4906024015f604051808303815f87803b1580156118b2575f80fd5b505af115801561169d573d5f803e3d5ffd5b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040826081850137505050565b61192a6112d6565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861195f3390565b6040516001600160a01b03909116815260200160405180910390a1565b611984611d38565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361195f565b8015610906578082035f805b83811015611a91576101008185038111156119db57508084035b87600181146119ed57875193506119f2565b873593505b50604051632afb09e760e11b8152600481018590526024810182905260448101849052602097909701967f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906355f613ce906064015f604051808303815f87803b158015611a67575f80fd5b505af1158015611a79573d5f803e3d5ffd5b505050506101008401935050610100810190506119c1565b50505050505050565b60405185515f91829160208901919081908490611ab8908590611d81565b90505f5b81811015611b0d57611acf858483611de8565b92505f611add603c83612701565b611ae88760016125af565b611af291906125af565b90505f611afe82611dfc565b97909701965050600101611abc565b506020850282016040526001840193505f5b8115611b9a575f611b2f86611dfc565b905083611b4081838f8f8f8f611e0b565b94505f611b4c88611f3a565b905082811015611b6f57604051638c5a4ea360e01b815260040160405180910390fd5b9c82019c9b82019b603c97909701965f19949094019360209186039190910492909201910301611b1f565b609754811115611bbd57604051634d56f17560e01b815260040160405180910390fd5b50508190039020989197509095505050505050565b8015610906578361169d60018285856119b5565b5f54610100900460ff16611c0c5760405162461bcd60e51b8152600401610821906126b6565b610fe9336118c4565b5f816059811015611c395760405163027f9c1f60e11b815260040160405180910390fd5b6040519150808483378082016040525f611c57836009015160c01c90565b905061010060ff8201046020026059018214611c865760405163c2110c9b60e01b815260040160405180910390fd5b509250929050565b5f816079811015611cb25760405163a40ab48b60e01b815260040160405180910390fd5b6040519150808483378082016040525f611cd0836009015160c01c90565b905061010060ff8201046020026079018214611c8657604051630c1c91df60e21b815260040160405180910390fd5b5f8160c18114611d22576040516332496bf560e21b815260040160405180910390fd5b6040519150808483378082016040529250929050565b60655460ff16610fe95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610821565b5f611d8b83611f49565b9050805f03611dad57604051634dbe8cff60e01b815260040160405180910390fd5b611db8603c82612701565b611dc39060016125af565b8214611de257604051634edcb40160e11b815260040160405180910390fd5b92915050565b5f611df4848484611f55565b949350505050565b5f611de282603a015160f01c90565b5f855f03611e1a575085611f30565b7f00000000000000000000000000000000000000000000000000000000000000005f80805b89811015611efc5760ff89169150600889901c811580611e5d575082155b15611e6c578060200288013593505b600184841c165f03611eeb5760405163ae453cd560e01b8152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015611ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee19190612718565b8d52506020909b019a5b506001988901989788019701611e3f565b505060ff5f1988011681811c60011615611f2957604051632eba9e1160e21b815260040160405180910390fd5b5050879150505b9695505050505050565b5f611de2826038015160f01c90565b5f611de2825160f81c90565b5f81603c0260010184019350603a84845e5050603a01919050565b5f8083601f840112611f80575f80fd5b50813567ffffffffffffffff811115611f97575f80fd5b602083019150836020828501011115611fae575f80fd5b9250929050565b5f805f805f805f805f60c08a8c031215611fcd575f80fd5b893567ffffffffffffffff80821115611fe4575f80fd5b611ff08d838e01611f70565b909b50995060208c0135985060408c0135975060608c0135965060808c013591508082111561201d575f80fd5b6120298d838e01611f70565b909650945060a08c0135915080821115612041575f80fd5b5061204e8c828d01611f70565b915080935050809150509295985092959850929598565b80356001600160a01b038116811461207b575f80fd5b919050565b5f60208284031215612090575f80fd5b61209982612065565b9392505050565b5f602082840312156120b0575f80fd5b5035919050565b803560ff8116811461207b575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612104576121046120c7565b604052919050565b5f601f83601f84011261211d575f80fd5b8235602067ffffffffffffffff8083111561213a5761213a6120c7565b8260051b6121498382016120db565b9384528681018301938381019089861115612162575f80fd5b84890192505b858310156121eb5782358481111561217e575f80fd5b8901603f81018b1361218e575f80fd5b858101356040868211156121a4576121a46120c7565b6121b5828b01601f191689016120db565b8281528d828486010111156121c8575f80fd5b828285018a8301375f928101890192909252508352509184019190840190612168565b9998505050505050505050565b5f805f805f806080878903121561220d575f80fd5b612216876120b7565b9550602087013567ffffffffffffffff80821115612232575f80fd5b61223e8a838b01611f70565b90975095506040890135915080821115612256575f80fd5b6122628a838b0161210c565b94506060890135915080821115612277575f80fd5b5061228489828a01611f70565b979a9699509497509295939492505050565b5f805f606084860312156122a8575f80fd5b6122b184612065565b92506122bf60208501612065565b9150604084013590509250925092565b5f805f604084860312156122e1575f80fd5b833567ffffffffffffffff8111156122f7575f80fd5b61230386828701611f70565b909790965060209590950135949350505050565b5f805f805f806080878903121561232c575f80fd5b863567ffffffffffffffff80821115612343575f80fd5b61234f8a838b01611f70565b909850965060208901359550604089013594506060890135915080821115612277575f80fd5b5f805f8060408587031215612388575f80fd5b843567ffffffffffffffff8082111561239f575f80fd5b6123ab88838901611f70565b909650945060208701359150808211156123c3575f80fd5b506123d087828801611f70565b95989497509550505050565b5f805f805f805f8060a0898b0312156123f3575f80fd5b6123fc896120b7565b9750602089013567ffffffffffffffff80821115612418575f80fd5b6124248c838d01611f70565b909950975060408b013591508082111561243c575f80fd5b6124488c838d0161210c565b965060608b013591508082111561245d575f80fd5b6124698c838d01611f70565b909650945060808b0135915080821115612481575f80fd5b5061248e8b828c01611f70565b999c989b5096995094979396929594505050565b5f602082840312156124b2575f80fd5b81358015158114612099575f80fd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611de257611de26124c1565b5f80858511156124f6575f80fd5b83861115612502575f80fd5b5050820193919092039150565b67ffffffffffffffff60c01b8960c01b16815287600882015286602882015285604882015284606882015282846088830137608892019182015260a8019695505050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b858152846020820152608060408201525f61259d608083018587612556565b90508260608301529695505050505050565b80820180821115611de257611de26124c1565b5f5b838110156125dc5781810151838201526020016125c4565b50505f910152565b858152846020820152608060408201525f612603608083018587612556565b828103606084015283518082526126218160208401602088016125c2565b601f01601f191601602001979650505050505050565b5f81612645576126456124c1565b505f190190565b634e487b7160e01b5f52603260045260245ffd5b838152818360208301375f910160200190815292915050565b5f825161268a8184602087016125c2565b9190910192915050565b5f80604083850312156126a5575f80fd5b505080516020909101519092909150565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082028115828204841417611de257611de26124c1565b5f60208284031215612728575f80fd5b505191905056fea2646970667358221220236608aa40ff970704a0539b21914150c973dea193682a06175594bf2f5fc31364736f6c63430008180033","sourceMap":"991:51013:162:-:0;;;6447:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6562:27:162;;;;:54;;-1:-1:-1;;;;;;6593:23:162;;;6562:54;6558:110;;;6639:18;;-1:-1:-1;;;6639:18:162;;;;;;;;;;;6558:110;6678:22;:20;:22::i;:::-;-1:-1:-1;;;;;6711:24:162;;;;;-1:-1:-1;;;;;6745:28:162;;;;;6783:20;;;991:51013;;5939:280:43;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:43;;861:2:315;5998:66:43;;;843:21:315;900:2;880:18;;;873:30;939:34;919:18;;;912:62;-1:-1:-1;;;990:18:315;;;983:37;1037:19;;5998:66:43;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:43;6140:15;6125:30;;;;;;6174:28;;1209:36:315;;;6174:28:43;;1197:2:315;1182:18;6174:28:43;;;;;;;6074:139;5939:280::o;14:177:315:-;93:13;;-1:-1:-1;;;;;135:31:315;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:458::-;283:6;291;299;352:2;340:9;331:7;327:23;323:32;320:52;;;368:1;365;358:12;320:52;394:16;;-1:-1:-1;;;;;439:30:315;;429:41;;419:69;;484:1;481;474:12;419:69;507:5;-1:-1:-1;531:49:315;576:2;561:18;;531:49;:::i;:::-;521:59;;599:49;644:2;633:9;629:18;599:49;:::i;:::-;589:59;;196:458;;;;;:::o;1067:184::-;991:51013:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b50600436106101ba575f3560e01c80634f099e3d116100f35780638a33623111610093578063bedb86fb1161006e578063bedb86fb14610432578063ea5f084f14610445578063ef6602ba14610464578063f2fde38b1461046d575f80fd5b80638a336231146103fb5780638da5cb5b1461040e578063b571d3dd1461041f575f80fd5b80636d46e987116100ce5780636d46e987146103ab5780636df4e686146103cd578063715018a6146103e057806386b053a9146103e8575f80fd5b80634f099e3d1461037a5780635c975abb1461038d5780636989ca7c14610398575f80fd5b80631d49e4571161015e5780632571098d116101395780632571098d146102e25780632b7ac3f3146103015780633b70c18a146103405780633fdeecb214610367575f80fd5b80631d49e4571461029d5780631e228302146102b05780632362f03e146102c3575f80fd5b80630a245924116101995780630a2459241461022f578063116a1f42146102615780631325aca0146102775780631794bb3c1461028a575f80fd5b8062b0f4d7146101be57806303c7f4af146101d3578063059def6114610218575b5f80fd5b6101d16101cc366004611fb5565b610480565b005b6101fa7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610221609c5481565b60405190815260200161020f565b61025161023d366004612080565b609b6020525f908152604090205460ff1681565b604051901515815260200161020f565b61025161026f3660046120a0565b609c54101590565b6101d16102853660046121f8565b610656565b6101d1610298366004612296565b61078b565b6101d16102ab366004612080565b61090c565b6101d16102be3660046120a0565b61099a565b6102216102d13660046120a0565b609d6020525f908152604090205481565b6102216102f03660046120a0565b609e6020525f908152604090205481565b6103287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161020f565b6103287f000000000000000000000000000000000000000000000000000000000000000081565b6101d16103753660046122cf565b6109e7565b6101d1610388366004612317565b610bbe565b60655460ff16610251565b6101d16103a6366004612080565b610dfb565b6102516103b9366004612080565b609a6020525f908152604090205460ff1681565b6101d16103db366004612375565b610e51565b6101d1610fd8565b6101d16103f63660046123dc565b610feb565b6101d1610409366004612080565b611162565b6033546001600160a01b0316610328565b6101d161042d366004612080565b6111e9565b6101d16104403660046124a2565b61123f565b6102216104533660046120a0565b609f6020525f908152604090205481565b61022160975481565b6101d161047b366004612080565b611260565b335f908152609b602052604090205460ff166104af57604051637b263b1760e01b815260040160405180910390fd5b6104b76112d6565b5f805f6104c58c8c8b61131c565b9250925092505f806104d8856019015190565b90505f6104e6866039015190565b90505f609e816104f76001886124d5565b81526020019081526020015f20549050610512828c8c611385565b7f0000000000000000000000000000000000000000000000000000000000000000818e8e868f8f5f9060409261054a939291906124e8565b8860405160200161056298979695949392919061250f565b6040516020818303038152906040528051906020012093505050505f610589855160f81c90565b604051630581350960e31b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632c09a848906105e090849087908c908c90899060040161257e565b5f6040518083038186803b1580156105f6575f80fd5b505afa158015610608573d5f803e3d5ffd5b505050505f61061b866011015160c01c90565b90506106386079870182610633896009015160c01c90565b611481565b6106458185878f8f61149e565b505050505050505050505050505050565b335f908152609a602052604090205460ff1661068557604051631e6edd6f60e11b815260040160405180910390fd5b61068d6112d6565b5f805f61069b888888611528565b9250925092505f805f808c60ff166001111580156106bd575060028d60ff1611155b1561074c576106ce858b8b8b611590565b60405196810196945090925090506106e98360ff8f16611608565b60c086811b600185015281811b600985015285901b60118401526019830182905261071f8361071661160f565b60399190910152565b60598301879052610731838a8a611655565b610745836107408a60796125af565b902090565b9350610765565b60405163bacd96e960e01b815260040160405180910390fd5b61077285828b8b5f611661565b61077c86856116a4565b50505050505050505050505050565b5f54610100900460ff16158080156107a957505f54600160ff909116105b806107c25750303b1580156107c257505f5460ff166001145b61082a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561084b575f805461ff0019166101001790555b6108536116e2565b6097829055609980546001600160a01b038581166001600160a01b0319928316179092556098805492871692909116919091179055604080515f8152602081018490527f6d0f49971e462a2f78a25906f145cb29cd5e7bd01ebf681ac8f58cb814e5877a910160405180910390a18015610906575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610914611710565b6001600160a01b0381163b1561093d57604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609b6020908152604091829020805460ff1916600190811790915591519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e91015b60405180910390a250565b6109a2611710565b609780549082905560408051828152602081018490527f6d0f49971e462a2f78a25906f145cb29cd5e7bd01ebf681ac8f58cb814e5877a910160405180910390a15050565b80610a055760405163f9a9465f60e01b815260040160405180910390fd5b5f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415610a4d5760405163c22a199f60e01b815260040160405180910390fd5b5f80610a59858561176a565b5050915091505f610a6e836011015160c01c90565b600984015160c01c600185015160c01c855160f81c01010190508015610aa75760405163f4f38de560e01b815260040160405180910390fd5b505f610ab4836019015190565b03610ad2576040516303d840a960e41b815260040160405180910390fd5b5f610ade836039015190565b14610afc57604051632781461960e11b815260040160405180910390fd5b5f8080527fc5dc36ae4e7617e4c4d23ddfcde33c79e9ed64c300aed766a9288a6b9b31f63d829055609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959788490556040518291907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f908290a3604080518481525f60208201819052839290917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d91015b60405180910390a35050505050565b335f908152609b602052604090205460ff16610bed57604051637b263b1760e01b815260040160405180910390fd5b610bf56112d6565b83610c135760405163f9a9465f60e01b815260040160405180910390fd5b5f805f80610c218a8a61176a565b609c5493975091955093509150808311610c4e5760405163092d315560e41b815260040160405180910390fd5b5f7f0000000000000000000000000000000000000000000000000000000000000000610c7a83866124d5565b5f848152609e6020908152604080832054609d83529281902054905160c09590951b6001600160c01b0319169185019190915260e09290921b6001600160e01b0319166028840152602c830152604c820152606c81018b9052608c810186905260ac81018a905260cc0160405160208183030381529060405290505f610d01875160f81c90565b6040516322a262c960e01b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906322a262c990610d5890849089908e908e9089906004016125e4565b5f6040518083038186803b158015610d6e575f80fd5b505afa158015610d80573d5f803e3d5ffd5b505050609c869055505f858152609e602090815260408083208e9055609f90915290208a9055610daf8461184d565b604080518c8152602081018c9052879187917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a350505050505050505050505050565b610e03611710565b6001600160a01b0381165f818152609a60209081526040808320805460ff19169055519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161098f565b610e59611710565b5f805f610e66878761176a565b935093505092505f610e78868661176a565b509250505080831115610e9e57604051635453822b60e11b815260040160405180910390fd5b5f609d81610ead8460016125af565b81526020019081526020015f205414610ed957604051633f707d7d60e21b815260040160405180910390fd5b609c548311610efb57604051632ad7756360e11b815260040160405180910390fd5b805b838110610f53575f818152609d602052604080822080549083905590519091829184917ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb471014691a350610f4c81612637565b9050610efd565b505f610f63856009015160c01c90565b604051637a6e933360e01b815281850360048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637a6e9333906024015f604051808303815f87803b158015610fc6575f80fd5b505af115801561077c573d5f803e3d5ffd5b610fe0611710565b610fe95f6118c4565b565b335f908152609a602052604090205460ff1661101a57604051631e6edd6f60e11b815260040160405180910390fd5b6110226112d6565b60028860ff16116110465760405163bacd96e960e01b815260040160405180910390fd5b6040805160c1810190915261105e8160ff8b16611608565b5f805f61106c8b8b8b611528565b60c082901b6001880152919450925090505f8061108b838c8c8c611590565b9150915080830192506110a283828c8c6001611661565b60c081811b600988015283901b6011870152601986018290525f6110c461160f565b90506110d1818a8a611385565b60398701819052605987018690525f808d60018f516110f091906124d5565b815181106111005761110061264c565b6020908102919091018101519081015160f81c603c028101601219015190915060c01c60c081901b60798b015291506111369050565b611141888b8b611915565b60c1882061114f87826116a4565b5050505050505050505050505050505050565b61116a611710565b6001600160a01b0381163b1561119357604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609a6020908152604091829020805460ff1916600190811790915591519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161098f565b6111f1611710565b6001600160a01b0381165f818152609b60209081526040808320805460ff19169055519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e910161098f565b611247611710565b801561125857611255611922565b50565b61125561197c565b611268611710565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610821565b611255816118c4565b60655460ff1615610fe95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610821565b5f80808361133d5760405163f9a9465f60e01b815260040160405180910390fd5b611347868661176a565b505f818152609e602052604090205492955090935091501561137c5760405163092d315560e41b815260040160405180910390fd5b93509350939050565b5f80600a6001600160a01b03168585856040516020016113a793929190612660565b60408051601f19818403018152908290526113c191612679565b5f60405180830381855afa9150503d805f81146113f9576040519150601f19603f3d011682016040523d82523d5f602084013e6113fe565b606091505b509150915081611421576040516371ebedf560e01b815260040160405180910390fd5b5f818060200190518101906114369190612694565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001811461147957604051638a89514360e01b815260040160405180910390fd5b505050505050565b805f0361148d57505050565b6114995f8484846119b5565b505050565b83609c54600101146114c357604051631d17cec760e21b815260040160405180910390fd5b609c8490555f848152609e60209081526040808320859055609f90915290208190556114ee8561184d565b6040805183815260208101839052849186917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d9101610baf565b5f805f83515f0361154c57604051632974c17360e21b815260040160405180910390fd5b611556868661176a565b60019091015f818152609d60205260409020549296509450925015905061137c5760405163012137ab60e41b815260040160405180910390fd5b8251604080516020830281019091525f918291825b828110156115f1575f806115d58a84815181106115c4576115c461264c565b6020026020010151878d8c8c611a9a565b9085529a8b019a959095019450506020909101906001016115a5565b506020919091029081900320969095509350505050565b8082535050565b5f496001498161163257604051630168f63160e21b815260040160405180910390fd5b801561165157604051634c976a6160e11b815260040160405180910390fd5b5090565b80826079850137505050565b8161010060ff8601046020021461168b57604051630808452960e31b815260040160405180910390fd5b801561169d5761169d83838787611bd2565b5050505050565b5f828152609d602052604080822083905551829184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050565b5f54610100900460ff166117085760405162461bcd60e51b8152600401610821906126b6565b610fe9611be6565b6033546001600160a01b03163314610fe95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610821565b5f808080853560f81c8181810361178f576117858888611c15565b90965090506117b9565b600282116117a1576117858888611c8e565b600382106117b9576117b38888611cff565b90965090505b80862094506117cc866001015160c01c90565b93506117dc866011015160c01c90565b5f858152609d6020526040902054909350851480159061182457505f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415155b156118425760405163150e0a2160e11b815260040160405180910390fd5b505092959194509250565b801561125557604051630e0143f560e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906338050fd4906024015f604051808303815f87803b1580156118b2575f80fd5b505af115801561169d573d5f803e3d5ffd5b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040826081850137505050565b61192a6112d6565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861195f3390565b6040516001600160a01b03909116815260200160405180910390a1565b611984611d38565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361195f565b8015610906578082035f805b83811015611a91576101008185038111156119db57508084035b87600181146119ed57875193506119f2565b873593505b50604051632afb09e760e11b8152600481018590526024810182905260448101849052602097909701967f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906355f613ce906064015f604051808303815f87803b158015611a67575f80fd5b505af1158015611a79573d5f803e3d5ffd5b505050506101008401935050610100810190506119c1565b50505050505050565b60405185515f91829160208901919081908490611ab8908590611d81565b90505f5b81811015611b0d57611acf858483611de8565b92505f611add603c83612701565b611ae88760016125af565b611af291906125af565b90505f611afe82611dfc565b97909701965050600101611abc565b506020850282016040526001840193505f5b8115611b9a575f611b2f86611dfc565b905083611b4081838f8f8f8f611e0b565b94505f611b4c88611f3a565b905082811015611b6f57604051638c5a4ea360e01b815260040160405180910390fd5b9c82019c9b82019b603c97909701965f19949094019360209186039190910492909201910301611b1f565b609754811115611bbd57604051634d56f17560e01b815260040160405180910390fd5b50508190039020989197509095505050505050565b8015610906578361169d60018285856119b5565b5f54610100900460ff16611c0c5760405162461bcd60e51b8152600401610821906126b6565b610fe9336118c4565b5f816059811015611c395760405163027f9c1f60e11b815260040160405180910390fd5b6040519150808483378082016040525f611c57836009015160c01c90565b905061010060ff8201046020026059018214611c865760405163c2110c9b60e01b815260040160405180910390fd5b509250929050565b5f816079811015611cb25760405163a40ab48b60e01b815260040160405180910390fd5b6040519150808483378082016040525f611cd0836009015160c01c90565b905061010060ff8201046020026079018214611c8657604051630c1c91df60e21b815260040160405180910390fd5b5f8160c18114611d22576040516332496bf560e21b815260040160405180910390fd5b6040519150808483378082016040529250929050565b60655460ff16610fe95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610821565b5f611d8b83611f49565b9050805f03611dad57604051634dbe8cff60e01b815260040160405180910390fd5b611db8603c82612701565b611dc39060016125af565b8214611de257604051634edcb40160e11b815260040160405180910390fd5b92915050565b5f611df4848484611f55565b949350505050565b5f611de282603a015160f01c90565b5f855f03611e1a575085611f30565b7f00000000000000000000000000000000000000000000000000000000000000005f80805b89811015611efc5760ff89169150600889901c811580611e5d575082155b15611e6c578060200288013593505b600184841c165f03611eeb5760405163ae453cd560e01b8152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015611ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee19190612718565b8d52506020909b019a5b506001988901989788019701611e3f565b505060ff5f1988011681811c60011615611f2957604051632eba9e1160e21b815260040160405180910390fd5b5050879150505b9695505050505050565b5f611de2826038015160f01c90565b5f611de2825160f81c90565b5f81603c0260010184019350603a84845e5050603a01919050565b5f8083601f840112611f80575f80fd5b50813567ffffffffffffffff811115611f97575f80fd5b602083019150836020828501011115611fae575f80fd5b9250929050565b5f805f805f805f805f60c08a8c031215611fcd575f80fd5b893567ffffffffffffffff80821115611fe4575f80fd5b611ff08d838e01611f70565b909b50995060208c0135985060408c0135975060608c0135965060808c013591508082111561201d575f80fd5b6120298d838e01611f70565b909650945060a08c0135915080821115612041575f80fd5b5061204e8c828d01611f70565b915080935050809150509295985092959850929598565b80356001600160a01b038116811461207b575f80fd5b919050565b5f60208284031215612090575f80fd5b61209982612065565b9392505050565b5f602082840312156120b0575f80fd5b5035919050565b803560ff8116811461207b575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612104576121046120c7565b604052919050565b5f601f83601f84011261211d575f80fd5b8235602067ffffffffffffffff8083111561213a5761213a6120c7565b8260051b6121498382016120db565b9384528681018301938381019089861115612162575f80fd5b84890192505b858310156121eb5782358481111561217e575f80fd5b8901603f81018b1361218e575f80fd5b858101356040868211156121a4576121a46120c7565b6121b5828b01601f191689016120db565b8281528d828486010111156121c8575f80fd5b828285018a8301375f928101890192909252508352509184019190840190612168565b9998505050505050505050565b5f805f805f806080878903121561220d575f80fd5b612216876120b7565b9550602087013567ffffffffffffffff80821115612232575f80fd5b61223e8a838b01611f70565b90975095506040890135915080821115612256575f80fd5b6122628a838b0161210c565b94506060890135915080821115612277575f80fd5b5061228489828a01611f70565b979a9699509497509295939492505050565b5f805f606084860312156122a8575f80fd5b6122b184612065565b92506122bf60208501612065565b9150604084013590509250925092565b5f805f604084860312156122e1575f80fd5b833567ffffffffffffffff8111156122f7575f80fd5b61230386828701611f70565b909790965060209590950135949350505050565b5f805f805f806080878903121561232c575f80fd5b863567ffffffffffffffff80821115612343575f80fd5b61234f8a838b01611f70565b909850965060208901359550604089013594506060890135915080821115612277575f80fd5b5f805f8060408587031215612388575f80fd5b843567ffffffffffffffff8082111561239f575f80fd5b6123ab88838901611f70565b909650945060208701359150808211156123c3575f80fd5b506123d087828801611f70565b95989497509550505050565b5f805f805f805f8060a0898b0312156123f3575f80fd5b6123fc896120b7565b9750602089013567ffffffffffffffff80821115612418575f80fd5b6124248c838d01611f70565b909950975060408b013591508082111561243c575f80fd5b6124488c838d0161210c565b965060608b013591508082111561245d575f80fd5b6124698c838d01611f70565b909650945060808b0135915080821115612481575f80fd5b5061248e8b828c01611f70565b999c989b5096995094979396929594505050565b5f602082840312156124b2575f80fd5b81358015158114612099575f80fd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611de257611de26124c1565b5f80858511156124f6575f80fd5b83861115612502575f80fd5b5050820193919092039150565b67ffffffffffffffff60c01b8960c01b16815287600882015286602882015285604882015284606882015282846088830137608892019182015260a8019695505050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b858152846020820152608060408201525f61259d608083018587612556565b90508260608301529695505050505050565b80820180821115611de257611de26124c1565b5f5b838110156125dc5781810151838201526020016125c4565b50505f910152565b858152846020820152608060408201525f612603608083018587612556565b828103606084015283518082526126218160208401602088016125c2565b601f01601f191601602001979650505050505050565b5f81612645576126456124c1565b505f190190565b634e487b7160e01b5f52603260045260245ffd5b838152818360208301375f910160200190815292915050565b5f825161268a8184602087016125c2565b9190910192915050565b5f80604083850312156126a5575f80fd5b505080516020909101519092909150565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082028115828204841417611de257611de26124c1565b5f60208284031215612728575f80fd5b505191905056fea2646970667358221220236608aa40ff970704a0539b21914150c973dea193682a06175594bf2f5fc31364736f6c63430008180033","sourceMap":"991:51013:162:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19264:2047;;;;;;:::i;:::-;;:::i;:::-;;4473:37;;;;;;;;1756:18:315;1744:31;;;1726:50;;1714:2;1699:18;4473:37:162;;;;;;;;5349:47;;;;;;;;;1933:25:315;;;1921:2;1906:18;5349:47:162;1787:177:315;5269:40:162;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2503:14:315;;2496:22;2478:41;;2466:2;2451:18;5269:40:162;2338:187:315;7675:147:162;;;;;;:::i;:::-;7792:23;;-1:-1:-1;7777:38:162;;7675:147;9428:2597;;;;;;:::i;:::-;;:::i;7177:364::-;;;;;;:::i;:::-;;:::i;24426:384::-;;;;;;:::i;:::-;;:::i;25203:258::-;;;;;;:::i;:::-;;:::i;5436:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;5536:63;;;;;;:::i;:::-;;;;;;;;;;;;;;4664:33;;;;;;;;-1:-1:-1;;;;;6356:32:315;;;6338:51;;6326:2;6311:18;4664:33:162;6192:203:315;4573:37:162;;;;;8104:1285;;;;;;:::i;:::-;;:::i;21350:2081::-;;;;;;:::i;:::-;;:::i;1858:84:44:-;1928:7;;;;1858:84;;24158:156:162;;;;;;:::i;:::-;;:::i;5171:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15900:1475;;;;;;:::i;:::-;;:::i;2064:101:39:-;;;:::i;12489:3220:162:-;;;;;;:::i;:::-;;:::i;23638:397::-;;;;;;:::i;:::-;;:::i;1441:85:39:-;1513:6;;-1:-1:-1;;;;;1513:6:39;1441:85;;24927:147:162;;;;;;:::i;:::-;;:::i;25553:154::-;;;;;;:::i;:::-;;:::i;5639:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;4837:30;;;;;;2314:198:39;;;;;;:::i;:::-;;:::i;19264:2047:162:-;929:10:62;6044:22:162;;;;:8;:22;;;;;;;;6039:60;;6075:24;;-1:-1:-1;;;6075:24:162;;;;;;;;;;;6039:60;1482:19:44::1;:17;:19::i;:::-;19570:16:162::2;19588:18:::0;19608:19:::2;19631:84;19665:12;;19691:14;19631:20;:84::i;:::-;19569:146;;;;;;19763:24;19811:17:::0;19831:40:::2;19862:8;4378:2:205::0;4364:17;4358:24;;4231:167;19831:40:162::2;19811:60;;19885:26;19914:49;19954:8;3348:2:206::0;3334:17;3328:24;;3174:194;19914:49:162::2;19885:78:::0;-1:-1:-1;19977:22:162::2;20002:19;19977:22:::0;20022:15:::2;20036:1;20022:11:::0;:15:::2;:::i;:::-;20002:36;;;;;;;;;;;;19977:61;;20094:59;20118:18;20138:14;;20094:23;:59::i;:::-;20251:13;20286:14;20322;20358:13;20393:9;20424:14;;20439:1;20424:20;20441:2;20424:20;;;;;;;:::i;:::-;20466:18;20213:289;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20186:330;;;;;;20167:349;;19797:730;;;20609:20;20632:39;20662:8;2748:15:205::0;2743:3;2739:25;;2615:165;20632:39:162::2;20705:103;::::0;-1:-1:-1;;;20705:103:162;;20609:62;;-1:-1:-1;;;;;;20721:8:162::2;20705:46;::::0;::::2;::::0;:103:::2;::::0;20609:62;;20766:11;;20779:10;;;;20791:16;;20705:103:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;20889:37;20929:52;20972:8;4009:2:205::0;3995:17;3989:24;3984:3;3980:34;;3817:213;20929:52:162::2;20889:92:::0;-1:-1:-1;20991:196:162::2;4175:25:206::0;4161:40;;21087:29:162::2;21130:47;21168:8;3550:1:205::0;3536:16;3530:23;3525:3;3521:33;;3373:197;21130:47:162::2;20991:20;:196::i;:::-;21198:106;21218:29;21249:11;21262:10;21274:14;21290:13;21198:19;:106::i;:::-;19559:1752;;;;;;19264:2047:::0;;;;;;;;;:::o;9428:2597::-;929:10:62;5922:25:162;;;;:11;:25;;;;;;;;5917:66;;5956:27;;-1:-1:-1;;;5956:27:162;;;;;;;;;;;5917:66;1482:19:44::1;:17;:19::i;:::-;9659:24:162::2;9685:19:::0;9706:37:::2;9747:81;9779:18;;9811:7;9747:18;:81::i;:::-;9658:170;;;;;;9839:18;9867:16:::0;9893:17:::2;9920:37:::0;9976:8:::2;9971:13;;:1;:13;;:30;;;;;10000:1;9988:8;:13;;;;9971:30;9967:1767;;;10217:142;10250:29;10297:7;10322:23;;10217:15;:142::i;:::-;10418:4;10412:11:::0;10473:65;;::::2;::::0;10412:11;-1:-1:-1;10172:187:162;;-1:-1:-1;10172:187:162;-1:-1:-1;10704:51:162::2;10412:11:::0;10704:51:::2;::::0;::::2;:31;:51::i;:::-;6617:3:205::0;6613:21;;;6609:1;6595:16;;6588:47;7208:26;;;7204:1;7190:16;;7183:52;7810:31;;;7805:2;7791:17;;7784:58;8164:2;8150:17;;8143:36;;;11100:76:162::2;6595:16:205::0;11152:23:162::2;:21;:23::i;:::-;5130:2:206::0;5116:17;;;;5109:45;4984:186;11100:76:162::2;5513:2:206::0;5499:17;;5492:43;;;11271:72:162::2;11309:8;11319:23;;11271:37;:72::i;:::-;11435:170;11488:8:::0;11514:77:::2;11561:23:::0;1895:3:206::2;11514:77:162;:::i;:::-;9688:27:205::0;;;9452:279;11435:170:162::2;11422:183;;9967:1767;;;11695:28;;-1:-1:-1::0;;;11695:28:162::2;;;;;;;;;;;9967:1767;11785:180;11827:29;11870;11913:23;;11950:5;11785:28;:180::i;:::-;11976:42;11994:11;12007:10;11976:17;:42::i;:::-;9648:2377;;;;;;;9428:2597:::0;;;;;;:::o;7177:364::-;3279:19:43;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:43;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:43;1713:19:61;:23;;;3387:66:43;;-1:-1:-1;3436:12:43;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:43;;12427:2:315;3325:201:43;;;12409:21:315;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;-1:-1:-1;;;12556:18:315;;;12549:44;12610:19;;3325:201:43;;;;;;;;;3536:12;:16;;-1:-1:-1;;3536:16:43;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:43;;;;;3562:65;7324:35:162::1;:33;:35::i;:::-;7370:15;:34:::0;;;7414:10:::1;:22:::0;;-1:-1:-1;;;;;7414:22:162;;::::1;-1:-1:-1::0;;;;;;7414:22:162;;::::1;;::::0;;;7446:14:::1;:30:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;7492:42:::1;::::0;;-1:-1:-1;12822:25:315;;12878:2;12863:18;;12856:34;;;7492:42:162::1;::::0;12795:18:315;7492:42:162::1;;;;;;;3651:14:43::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:43;;;3721:14;;-1:-1:-1;13053:36:315;;3721:14:43;;13041:2:315;13026:18;3721:14:43;;;;;;;3647:99;3269:483;7177:364:162;;;:::o;24426:384::-;1334:13:39;:11;:13::i;:::-;-1:-1:-1;;;;;24669:20:162;::::1;;:24:::0;24665:59:::1;;24702:22;;-1:-1:-1::0;;;24702:22:162::1;;;;;;;;;;;24665:59;-1:-1:-1::0;;;;;24734:18:162;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;:25;;-1:-1:-1;;24734:25:162::1;24755:4;24734:25:::0;;::::1;::::0;;;24775:28;;2478:41:315;;;24775:28:162::1;::::0;2451:18:315;24775:28:162::1;;;;;;;;24426:384:::0;:::o;25203:258::-;1334:13:39;:11;:13::i;:::-;25319:15:162::1;::::0;;25344:34;;;;25394:60:::1;::::0;;12822:25:315;;;12878:2;12863:18;;12856:34;;;25394:60:162::1;::::0;12795:18:315;25394:60:162::1;;;;;;;25279:182;25203:258:::0;:::o;8104:1285::-;8249:10;8245:59;;8282:22;;-1:-1:-1;;;8282:22:162;;;;;;;;;;;8245:59;8408:1;8374:22;;:19;:22;;;;:36;8370:76;;8419:27;;-1:-1:-1;;;8419:27:162;;;;;;;;;;;8370:76;8458:14;8474:18;8500:30;8517:12;;8500:16;:30::i;:::-;8457:73;;;;;;8640:11;8833:50;8876:6;4009:2:205;3995:17;3989:24;3984:3;3980:34;;3817:213;8833:50:162;3550:1:205;3536:16;;3530:23;3525:3;3521:33;3135:1;3121:16;;3115:23;3110:3;3106:33;2748:15;;2743:3;2739:25;8654:96:162;:160;:229;;-1:-1:-1;8901:8:162;;8897:55;;8918:34;;-1:-1:-1;;;8918:34:162;;;;;;;;;;;8897:55;-1:-1:-1;9026:1:162;8976:38;9007:6;4378:2:205;4364:17;4358:24;;4231:167;8976:38:162;:52;8972:93;;9037:28;;-1:-1:-1;;;9037:28:162;;;;;;;;;;;8972:93;9136:1;9079:45;9117:6;3348:2:206;3334:17;3328:24;;3174:194;9079:45:162;:59;9075:110;;9147:38;;-1:-1:-1;;;9147:38:162;;;;;;;;;;;9075:110;9196:19;;;;;:32;;;9238:19;9196;9238:22;;:35;;;9196:19;9289:26;9218:10;;9196:19;9289:26;;9196:19;;9289:26;9330:52;;;12822:25:315;;;9344:1:162;12878:2:315;12863:18;;12856:34;;;9347:10:162;;9344:1;;9330:52;;12795:18:315;9330:52:162;;;;;;;;8190:1199;;8104:1285;;;:::o;21350:2081::-;929:10:62;6044:22:162;;;;:8;:22;;;;;;;;6039:60;;6075:24;;-1:-1:-1;;;6075:24:162;;;;;;;;;;;6039:60;1482:19:44::1;:17;:19::i;:::-;21581:14:162::0;21577:63:::2;;21618:22;;-1:-1:-1::0;;;21618:22:162::2;;;;;;;;;;;21577:63;21714:16;21744:18:::0;21776:19:::2;21809:37:::0;21859:30:::2;21876:12;;21859:16;:30::i;:::-;22030:23;::::0;21700:189;;-1:-1:-1;21700:189:162;;-1:-1:-1;21700:189:162;-1:-1:-1;21700:189:162;-1:-1:-1;22067:35:162;;::::2;22063:77;;22111:29;;-1:-1:-1::0;;;22111:29:162::2;;;;;;;;;;;22063:77;22151:25;22209:13;22243:34;22257:20:::0;22243:11;:34:::2;:::i;:::-;22306:41;::::0;;;:19:::2;:41;::::0;;;;;;;;22379:16:::2;:38:::0;;;;;;;22179:345;;13937:3:315;13915:16;;;;-1:-1:-1;;;;;;13911:51:315;22179:345:162;;::::2;13899:64:315::0;;;;14018:3;13996:16;;;;-1:-1:-1;;;;;;13992:43:315;13979:11;;;13972:64;14052:12;;;14045:28;14089:12;;;14082:28;14126:12;;;14119:28;;;14163:13;;;14156:29;;;14201:13;;;14194:29;;;14239:13;;22179:345:162::2;;;;;;;;;;;;22151:373;;22607:20;22630:39;22660:8;2748:15:205::0;2743:3;2739:25;;2615:165;22630:39:162::2;22859:96;::::0;-1:-1:-1;;;22859:96:162;;22607:62;;-1:-1:-1;;;;;;22875:8:162::2;22859:43;::::0;::::2;::::0;:96:::2;::::0;22607:62;;22917:11;;22930:10;;;;22942:12;;22859:96:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;23054:23:162::2;:37:::0;;;-1:-1:-1;23101:32:162::2;::::0;;;:19:::2;:32;::::0;;;;;;;:49;;;23160:13:::2;:26:::0;;;;;:42;;;23283:56:::2;23309:29:::0;23283:25:::2;:56::i;:::-;23355:69;::::0;;12822:25:315;;;12878:2;12863:18;;12856:34;;;23382:10:162;;23369:11;;23355:69:::2;::::0;12795:18:315;23355:69:162::2;;;;;;;21567:1864;;;;;;;21350:2081:::0;;;;;;:::o;24158:156::-;1334:13:39;:11;:13::i;:::-;-1:-1:-1;;;;;24230:21:162;::::1;24254:5;24230:21:::0;;;:11:::1;:21;::::0;;;;;;;:29;;-1:-1:-1;;24230:29:162::1;::::0;;24275:32;2478:41:315;;;24275:32:162::1;::::0;2451:18:315;24275:32:162::1;2338:187:315::0;15900:1475:162;1334:13:39;:11;:13::i;:::-;16031:21:162::1;16080:24:::0;16118:47:::1;16178:35;16195:17;;16178:16;:35::i;:::-;16017:196;;;;;;;16228:23;16257:34;16274:16;;16257;:34::i;:::-;16223:68;;;;;16324:15;16305:16;:34;16301:71;;;16348:24;;-1:-1:-1::0;;;16348:24:162::1;;;;;;;;;;;16301:71;16521:1;16472:16;16521:1:::0;16489:19:::1;:15:::0;16507:1:::1;16489:19;:::i;:::-;16472:37;;;;;;;;;;;;:51;16468:92;;16532:28;;-1:-1:-1::0;;;16532:28:162::1;;;;;;;;;;;16468:92;16625:23;;16605:16;:43;16601:83;;16657:27;;-1:-1:-1::0;;;16657:27:162::1;;;;;;;;;;;16601:83;16747:15:::0;16720:279:::1;16779:16;16764:11;:31;16720:279;;16826:18;16847:29:::0;;;:16:::1;:29;::::0;;;;;;;16890:42;;;;16952:36;;16847:29;;;;16864:11;;16952:36:::1;::::0;::::1;-1:-1:-1::0;16797:13:162::1;::::0;::::1;:::i;:::-;;;16720:279;;;;17078:33;17114:52;17152:13;3550:1:205::0;3536:16;3530:23;3525:3;3521:33;;3373:197;17114:52:162::1;17200:158;::::0;-1:-1:-1;;;17200:158:162;;17277:67;;::::1;17200:158;::::0;::::1;1933:25:315::0;17078:88:162;;-1:-1:-1;17216:12:162::1;-1:-1:-1::0;;;;;17200:59:162::1;::::0;::::1;::::0;1906:18:315;;17200:158:162::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;2064:101:39::0;1334:13;:11;:13::i;:::-;2128:30:::1;2155:1;2128:18;:30::i;:::-;2064:101::o:0;12489:3220:162:-;929:10:62;5922:25:162;;;;:11;:25;;;;;;;;5917:66;;5956:27;;-1:-1:-1;;;5956:27:162;;;;;;;;;;;5917:66;1482:19:44::1;:17;:19::i;:::-;12787:1:162::2;12775:8;:13;;;12771:79;;12811:28;;-1:-1:-1::0;;;12811:28:162::2;;;;;;;;;;;12771:79;13364:4;13358:11:::0;;13596:3:::2;13582:18:::0;::::2;13569:32:::0;;;13620:51:::2;13358:11:::0;13620:51:::2;::::0;::::2;:31;:51::i;:::-;13683:24;13709:19:::0;13730:37:::2;13771:81;13803:18;;13835:7;13771:18;:81::i;:::-;6617:3:205::0;6613:21;;;6609:1;6595:16;;6588:47;13682:170:162;;-1:-1:-1;13682:170:162;-1:-1:-1;13682:170:162;-1:-1:-1;13981:17:162::2;14000:37:::0;14041:126:::2;14070:29;14113:7;14134:23;;14041:15;:126::i;:::-;13980:187;;;;14234:29;14201:62;;;;14325:179;14367:29;14410;14453:23;;14490:4;14325:28;:179::i;:::-;7212:3:205::0;7208:26;;;7204:1;7190:16;;7183:52;7810:31;;;7805:2;7791:17;;7784:58;8164:2;8150:17;;8143:36;;;-1:-1:-1;14830:23:162::2;:21;:23::i;:::-;14801:52;;14863:59;14887:18;14907:14;;14863:23;:59::i;:::-;5130:2:206::0;5116:17;;5109:45;;;5513:2;5499:17;;5492:43;;;15091:26:162::2;15141:22:::0;15166:7:::2;15191:1;15174:7;:14;:18;;;;:::i;:::-;15166:27;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;4533:16:209;;;4588:15;4583:3;4579:25;4747:2;4732:18;4718:33;;-1:-1:-1;;4798:16:209;4792:23;15166:27:162;;-1:-1:-1;4787:3:209;4783:33;3019:3:207;3015:29;;;3009:3;2995:18;;2988:57;15207:66:162;-1:-1:-1;15293:72:162::2;::::0;-1:-1:-1;2861:200:207;15293:72:162::2;15375:63;15413:8;15423:14;;15375:37;:63::i;:::-;1857:3:207;9688:27:205::0;;15660:42:162::2;15678:11;15691:10;15660:17;:42::i;:::-;12761:2948;;;;;;;;;12489:3220:::0;;;;;;;;:::o;23638:397::-;1334:13:39;:11;:13::i;:::-;-1:-1:-1;;;;;23887:20:162;::::1;;:24:::0;23883:59:::1;;23920:22;;-1:-1:-1::0;;;23920:22:162::1;;;;;;;;;;;23883:59;-1:-1:-1::0;;;;;23953:21:162;::::1;;::::0;;;:11:::1;:21;::::0;;;;;;;;:28;;-1:-1:-1;;23953:28:162::1;23977:4;23953:28:::0;;::::1;::::0;;;23997:31;;2478:41:315;;;23997:31:162::1;::::0;2451:18:315;23997:31:162::1;2338:187:315::0;24927:147:162;1334:13:39;:11;:13::i;:::-;-1:-1:-1;;;;;24996:18:162;::::1;25017:5;24996:18:::0;;;:8:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;24996:26:162::1;::::0;;25038:29;2478:41:315;;;25038:29:162::1;::::0;2451:18:315;25038:29:162::1;2338:187:315::0;25553:154:162;1334:13:39;:11;:13::i;:::-;25618:7:162::1;25614:87;;;25641:8;:6;:8::i;:::-;25553:154:::0;:::o;25614:87::-:1;25680:10;:8;:10::i;2314:198:39:-:0;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2402:22:39;::::1;2394:73;;;::::0;-1:-1:-1;;;2394:73:39;;15717:2:315;2394:73:39::1;::::0;::::1;15699:21:315::0;15756:2;15736:18;;;15729:30;15795:34;15775:18;;;15768:62;-1:-1:-1;;;15846:18:315;;;15839:36;15892:19;;2394:73:39::1;15515:402:315::0;2394:73:39::1;2477:28;2496:8;2477:18;:28::i;2010:106:44:-:0;1928:7;;;;2079:9;2071:38;;;;-1:-1:-1;;;2071:38:44;;16124:2:315;2071:38:44;;;16106:21:315;16163:2;16143:18;;;16136:30;-1:-1:-1;;;16182:18:315;;;16175:46;16238:18;;2071:38:44;15922:340:315;27674:581:162;27817:16;;;27927:14;27923:63;;27964:22;;-1:-1:-1;;;27964:22:162;;;;;;;;;;;27923:63;28078:30;28095:12;;28078:16;:30::i;:::-;-1:-1:-1;28208:1:162;28164:32;;;:19;:32;;;;;;28038:70;;-1:-1:-1;28038:70:162;;-1:-1:-1;28038:70:162;-1:-1:-1;28164:46:162;28160:88;;28219:29;;-1:-1:-1;;;28219:29:162;;;;;;;;;;;28160:88;27674:581;;;;;;;:::o;29749:825::-;29939:12;29953:17;4118:4;-1:-1:-1;;;;;29974:43:162;30048:18;30068:14;;30031:52;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;30031:52:162;;;;;;;;;;29974:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29938:155;;;;30350:7;30345:63;;30366:42;;-1:-1:-1;;;30366:42:162;;;;;;;;;;;30345:63;30421:14;30450:4;30439:36;;;;;;;;;;;;:::i;:::-;30418:57;;;4324:77;30489:6;:21;30485:82;;30519:48;;-1:-1:-1;;;30519:48:162;;;;;;;;;;;30485:82;29855:719;;;29749:825;;;:::o;49158:328::-;49336:28;49368:1;49336:33;49332:46;;49158:328;;;:::o;49332:46::-;49387:92;49402:5;49409:9;49420:28;49450;49387:14;:92::i;:::-;49158:328;;;:::o;28697:827::-;29029:11;28998:23;;29024:1;28998:27;:42;28994:81;;29049:26;;-1:-1:-1;;;29049:26:162;;;;;;;;;;;28994:81;29089:23;:37;;;29194:32;;;;:19;:32;;;;;;;;:49;;;29253:13;:26;;;;;:42;;;29376:56;29402:29;29376:25;:56::i;:::-;29448:69;;;12822:25:315;;;12878:2;12863:18;;12856:34;;;29475:10:162;;29462:11;;29448:69;;12795:18:315;29448:69:162;12640:256:315;26241:641:162;26387:24;26425:19;26458:37;26568:7;:14;26586:1;26568:19;26564:51;;26596:19;;-1:-1:-1;;;26596:19:162;;;;;;;;;;;26564:51;26692:36;26709:18;;26692:16;:36::i;:::-;26777:1;26762:16;;;26802:29;;;;:16;:29;;;;;;26625:103;;-1:-1:-1;26762:16:162;-1:-1:-1;26625:103:162;-1:-1:-1;26802:34:162;;-1:-1:-1;26798:77:162;;26845:30;;-1:-1:-1;;;26845:30:162;;;;;;;;;;;34866:1579;35144:14;;35339:4;35333:11;;35411:2;35392:22;;35370:45;;35357:59;;;35047:22;;;;;35484:741;35508:13;35504:1;:17;35484:741;;;35542:34;35590:22;35673:191;35705:7;35713:1;35705:10;;;;;;;;:::i;:::-;;;;;;;35733:29;35780;35827:23;;35673:14;:191::i;:::-;36097:40;;;35983:59;;;;35906;;;;;-1:-1:-1;;36196:4:162;36174:27;;;;35523:3;;35484:741;;;-1:-1:-1;36343:4:162;36324:24;;;;36389:30;;;;36379:50;;34866:1579;;-1:-1:-1;34866:1579:162;-1:-1:-1;;;;34866:1579:162:o;5966:148:205:-;6089:8;6079;6071:27;5966:148;;:::o;31856:420:162:-;31915:26;32064:11;32112:1;32103:11;32064;32133:63;;32178:18;;-1:-1:-1;;;32178:18:162;;;;;;;;;;;32133:63;32210:25;;32206:63;;32244:25;;-1:-1:-1;;;32244:25:162;;;;;;;;;;;32206:63;31943:333;31856:420;:::o;5775:329:206:-;6044:30;5996;5952:25;5942:8;5938:40;5908:180;5775:329;;;:::o;31025:692:162:-;31377:23;31364:3;31357;31325:35;;31324:43;31371:2;31323:50;:84;31319:158;;31434:28;;-1:-1:-1;;;31434:28:162;;;;;;;;;;;31319:158;31500:13;31496:215;;;31529:171;31569:23;;31610:29;31657;31529:22;:171::i;:::-;31025:692;;;;;:::o;27078:186::-;27164:29;;;;:16;:29;;;;;;:42;;;27221:36;27196:10;;27181:11;;27221:36;;27164:29;27221:36;27078:186;;:::o;1003:95:39:-;5374:13:43;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:43;;;;;;;:::i;:::-;1065:26:39::1;:24;:26::i;1599:130::-:0;1513:6;;-1:-1:-1;;;;;1513:6:39;929:10:62;1662:23:39;1654:68;;;;-1:-1:-1;;;1654:68:39;;17905:2:315;1654:68:39;;;17887:21:315;;;17924:18;;;17917:30;17983:34;17963:18;;;17956:62;18035:18;;1654:68:39;17703:356:315;36872:1450:162;37003:16;;;;37300:33;;37295:3;37291:43;37003:16;37383:12;;;37379:351;;37433:48;37468:12;;37433:34;:48::i;:::-;37411:70;;-1:-1:-1;37411:70:162;-1:-1:-1;37379:351:162;;;37513:1;37502:7;:12;37498:232;;37552:48;37587:12;;37552:34;:48::i;37498:232::-;37632:1;37621:7;:12;37617:113;;37671:48;37706:12;;37671:34;:48::i;:::-;37649:70;;-1:-1:-1;37649:70:162;-1:-1:-1;37617:113:162;9688:27:205;;;37885:67:162;;37976:42;38009:8;3135:1:205;3121:16;3115:23;3110:3;3106:33;;2973:182;37976:42:162;37962:56;;38060:52;38103:8;4009:2:205;3995:17;3989:24;3984:3;3980:34;;3817:213;38060:52:162;38174:29;;;;:16;:29;;;;;;38028:84;;-1:-1:-1;38174:43:162;;;;;:83;;-1:-1:-1;38255:1:162;38221:22;;:19;:22;;;;:36;;38174:83;38170:146;;;38280:25;;-1:-1:-1;;;38280:25:162;;;;;;;;;;;38170:146;37150:1172;;36872:1450;;;;;;;:::o;48466:295::-;48562:32;;48558:197;;48638:92;;-1:-1:-1;;;48638:92:162;;;;;1933:25:315;;;48654:12:162;-1:-1:-1;;;;;48638:62:162;;;;1906:18:315;;48638:92:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2666:187:39;2758:6;;;-1:-1:-1;;;;;2774:17:39;;;-1:-1:-1;;;;;;2774:17:39;;;;;;;2806:40;;2758:6;;;2774:17;2758:6;;2806:40;;2739:16;;2806:40;2729:124;2666:187;:::o;3275:264:207:-;3520:2;3498:20;3492:3;3482:8;3478:18;3465:58;3275:264;;;:::o;2429:115:44:-;1482:19;:17;:19::i;:::-;2488:7:::1;:14:::0;;-1:-1:-1;;2488:14:44::1;2498:4;2488:14;::::0;;2517:20:::1;2524:12;929:10:62::0;;850:96;2524:12:44::1;2517:20;::::0;-1:-1:-1;;;;;6356:32:315;;;6338:51;;6326:2;6311:18;2517:20:44::1;;;;;;;2429:115::o:0;2676:117::-;1729:16;:14;:16::i;:::-;2734:7:::1;:15:::0;;-1:-1:-1;;2734:15:44::1;::::0;;2764:22:::1;929:10:62::0;2773:12:44::1;850:96:62::0;50846:1156:162;51039:46;;51078:7;51039:46;51140:59;;;51119:18;;51242:744;51266:28;51262:1;:32;51242:744;;;51341:3;51366:32;;;:41;-1:-1:-1;51362:129:162;;;-1:-1:-1;51440:32:162;;;51362:129;51546:10;51582:1;51577:88;;;;51736:9;51730:16;51720:26;;51539:229;;51577:88;51633:9;51620:23;51610:33;;51539:229;-1:-1:-1;51857:79:162;;-1:-1:-1;;;51857:79:162;;;;;18266:25:315;;;18307:18;;;18300:34;;;18350:18;;;18343:34;;;51817:4:162;51802:20;;;;;51873:12;-1:-1:-1;;;;;51857:51:162;;;;18239:18:315;;51857:79:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51968:3;51954:17;;;;51306:680;51301:3;51296:8;;;;51242:744;;;;51095:901;;50846:1156;;;;:::o;43105:2965::-;43516:4;43510:11;43703:13;;43329:17;;;;43594:4;43582:17;;;43510:11;;;43329:17;;43660:57;;43582:17;;43660:32;:57::i;:::-;43639:78;;43805:9;43800:404;43824:10;43820:1;:14;43800:404;;;43865:51;43895:8;43905:7;43914:1;43865:29;:51::i;:::-;43855:61;-1:-1:-1;43930:16:162;43964:37;1835:2:209;43964:1:162;:37;:::i;:::-;43949:12;:8;43960:1;43949:12;:::i;:::-;:52;;;;:::i;:::-;43930:71;;44015:29;44047:39;44077:8;44047:29;:39::i;:::-;44128:51;;;;;-1:-1:-1;;43836:3:162;;43800:404;;;;44294:4;44266:26;44262:37;44253:7;44249:51;44243:4;44236:65;44380:1;44370:8;44366:16;44354:28;;44494:33;44570:1156;44577:14;;44570:1156;;44652:29;44684:39;44714:8;44684:29;:39::i;:::-;44652:71;-1:-1:-1;44756:7:162;44787:233;44756:7;44652:71;44889:29;44936;44983:23;;44787:20;:233::i;:::-;44777:243;;45034:31;45068:41;45100:8;45068:31;:41::i;:::-;45034:75;;45153:21;45127:23;:47;45123:90;;;45183:30;;-1:-1:-1;;;45183:30:162;;;;;;;;;;;45123:90;45478:54;;;;45550;;;;1835:2:209;45656:45:162;;;;;-1:-1:-1;;45623:15:162;;;;;45307:2;45285:18;;;45284:25;;;;45255:54;;;;45393:47;;45364:76;44570:1156;;;45832:15;;45804:25;:43;45800:108;;;45870:27;;-1:-1:-1;;;45870:27:162;;;;;;;;;;;45800:108;-1:-1:-1;;46027:26:162;;;46003:51;;;43105:2965;;-1:-1:-1;43105:2965:162;;-1:-1:-1;;;;;;43105:2965:162:o;49883:460::-;50079:46;;50118:7;50079:46;50197:29;50245:91;50260:4;50197:29;50277:28;50307;50245:14;:91::i;1104:111:39:-;5374:13:43;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:43;;;;;;;:::i;:::-;1176:32:39::1;929:10:62::0;1176:18:39::1;:32::i;1656:763:205:-:0;1733:16;1786:12;1374:2;1819:34;;1815:81;;;1862:34;;-1:-1:-1;;;1862:34:205;;;;;;;;;;;1815:81;1988:4;1982:11;1970:23;;2050:6;2029:19;2019:8;2006:51;2097:6;2087:8;2083:21;2077:4;2070:35;2162:24;2189:28;2208:8;3550:1;3536:16;3530:23;3525:3;3521:33;;3373:197;2189:28;2162:55;-1:-1:-1;2322:3:205;2315;2296:22;;2295:30;2329:2;2294:37;1374:2;2266:65;2256:6;:75;2252:151;;2358:30;;-1:-1:-1;;;2358:30:205;;;;;;;;;;;2252:151;1767:652;1656:763;;;;;:::o;2178:766:206:-;2255:16;2308:12;1895:3;2341:34;;2337:81;;;2384:34;;-1:-1:-1;;;2384:34:206;;;;;;;;;;;2337:81;2510:4;2504:11;2492:23;;2572:6;2551:19;2541:8;2528:51;2619:6;2609:8;2605:21;2599:4;2592:35;2684:24;2711:47;2749:8;3550:1:205;3536:16;3530:23;3525:3;3521:33;;3373:197;2711:47:206;2684:74;-1:-1:-1;2863:3:206;2856;2837:22;;2836:30;2870:2;2835:37;1895:3;2807:65;2797:6;:75;2793:134;;2897:30;;-1:-1:-1;;;2897:30:206;;;;;;;;;;;2140:490:207;2217:16;2270:12;1857:3;2303:35;;2299:107;;2361:34;;-1:-1:-1;;;2361:34:207;;;;;;;;;;;2299:107;2497:4;2491:11;2479:23;;2559:6;2538:19;2528:8;2515:51;2606:6;2596:8;2592:21;2586:4;2579:35;2140:490;;;;;:::o;2188:106:44:-;1928:7;;;;2246:41;;;;-1:-1:-1;;;2246:41:44;;18763:2:315;2246:41:44;;;18745:21:315;18802:2;18782:18;;;18775:30;-1:-1:-1;;;18821:18:315;;;18814:50;18881:18;;2246:41:44;18561:344:315;2076:437:209;2163:18;2206:22;2219:8;2206:12;:22::i;:::-;2193:35;;2288:10;2302:1;2288:15;2284:51;;2312:23;;-1:-1:-1;;;2312:23:209;;;;;;;;;;;2284:51;2435:33;1835:2;2435:10;:33;:::i;:::-;2431:37;;:1;:37;:::i;:::-;2420:7;:48;2416:90;;2477:29;;-1:-1:-1;;;2477:29:209;;;;;;;;;;;2416:90;2076:437;;;;:::o;3204:215::-;3332:7;3358:54;3388:8;3398:6;3406:5;3358:29;:54::i;:::-;3351:61;3204:215;-1:-1:-1;;;;3204:215:209:o;4039:154::-;4106:22;4147:39;4177:8;4936:2:208;4922:17;4916:24;4911:3;4907:34;;4765:192;46681:1656:162;46936:7;46959:14;46977:1;46959:19;46955:36;;-1:-1:-1;46987:4:162;46980:11;;46955:36;47049:12;47001:29;;;47151:913;47175:14;47171:1;:18;47151:913;;;47318:4;47286:36;;;-1:-1:-1;47261:1:162;47228:34;;;47391:6;;;:18;;-1:-1:-1;47401:8:162;;47391:18;47387:197;;;47538:3;47532:4;47528:14;47496:30;47492:51;47479:65;47468:76;;47387:197;47625:1;47607:14;;;47606:20;47631:1;47605:27;47601:344;;47715:66;;-1:-1:-1;;;47715:66:162;;;;;1933:25:315;;;47699:13:162;;-1:-1:-1;;;;;47715:35:162;;;;;1906:18:315;;47715:66:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47838:19;;-1:-1:-1;47900:4:162;47890:15;;;;47601:344;-1:-1:-1;47996:1:162;47963:34;;;;48015;;;;47191:3;47151:913;;;-1:-1:-1;;48214:4:162;-1:-1:-1;;48177:33:162;;48176:42;48238:14;;;48209:1;48237:20;48236:26;48232:66;;48271:27;;-1:-1:-1;;;48271:27:162;;;;;;;;;;;48232:66;47073:1236;;48326:4;48319:11;;;46681:1656;;;;;;;;;:::o;3651:160:209:-;3720:24;3763:41;3795:8;4516:2:208;4502:17;4496:24;4491:3;4487:34;;4339:198;2719:142:209;2782:18;2819:35;2845:8;2748:15:205;2743:3;2739:25;;2615:165;3710:397:208;3838:7;3981:5;3959:20;3955:32;3952:1;3948:40;3938:8;3934:55;3922:67;;4026:2;4016:8;4008:6;4002:27;-1:-1:-1;;4064:2:208;4052:15;;3710:397;-1:-1:-1;3710:397:208:o;14:347:315:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:315;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;296:59;14:347;;;;;:::o;366:1211::-;503:6;511;519;527;535;543;551;559;567;620:3;608:9;599:7;595:23;591:33;588:53;;;637:1;634;627:12;588:53;677:9;664:23;706:18;747:2;739:6;736:14;733:34;;;763:1;760;753:12;733:34;802:58;852:7;843:6;832:9;828:22;802:58;:::i;:::-;879:8;;-1:-1:-1;776:84:315;-1:-1:-1;961:2:315;946:18;;933:32;;-1:-1:-1;1012:2:315;997:18;;984:32;;-1:-1:-1;1063:2:315;1048:18;;1035:32;;-1:-1:-1;1120:3:315;1105:19;;1092:33;;-1:-1:-1;1137:16:315;;;1134:36;;;1166:1;1163;1156:12;1134:36;1205:60;1257:7;1246:8;1235:9;1231:24;1205:60;:::i;:::-;1284:8;;-1:-1:-1;1179:86:315;-1:-1:-1;1372:3:315;1357:19;;1344:33;;-1:-1:-1;1389:16:315;;;1386:36;;;1418:1;1415;1408:12;1386:36;;1457:60;1509:7;1498:8;1487:9;1483:24;1457:60;:::i;:::-;1431:86;;1536:8;1526:18;;;1563:8;1553:18;;;366:1211;;;;;;;;;;;:::o;1969:173::-;2037:20;;-1:-1:-1;;;;;2086:31:315;;2076:42;;2066:70;;2132:1;2129;2122:12;2066:70;1969:173;;;:::o;2147:186::-;2206:6;2259:2;2247:9;2238:7;2234:23;2230:32;2227:52;;;2275:1;2272;2265:12;2227:52;2298:29;2317:9;2298:29;:::i;:::-;2288:39;2147:186;-1:-1:-1;;;2147:186:315:o;2530:180::-;2589:6;2642:2;2630:9;2621:7;2617:23;2613:32;2610:52;;;2658:1;2655;2648:12;2610:52;-1:-1:-1;2681:23:315;;2530:180;-1:-1:-1;2530:180:315:o;2715:156::-;2781:20;;2841:4;2830:16;;2820:27;;2810:55;;2861:1;2858;2851:12;2876:127;2937:10;2932:3;2928:20;2925:1;2918:31;2968:4;2965:1;2958:15;2992:4;2989:1;2982:15;3008:275;3079:2;3073:9;3144:2;3125:13;;-1:-1:-1;;3121:27:315;3109:40;;3179:18;3164:34;;3200:22;;;3161:62;3158:88;;;3226:18;;:::i;:::-;3262:2;3255:22;3008:275;;-1:-1:-1;3008:275:315:o;3288:1358::-;3340:5;3370:4;3416:3;3409:4;3401:6;3397:17;3393:27;3383:55;;3434:1;3431;3424:12;3383:55;3470:6;3457:20;3496:4;3519:18;3556:2;3552;3549:10;3546:36;;;3562:18;;:::i;:::-;3608:2;3605:1;3601:10;3631:28;3655:2;3651;3647:11;3631:28;:::i;:::-;3693:15;;;3763;;;3759:24;;;3724:12;;;;3795:15;;;3792:35;;;3823:1;3820;3813:12;3792:35;3859:2;3851:6;3847:15;3836:26;;3871:746;3887:6;3882:3;3879:15;3871:746;;;3973:3;3960:17;4009:2;3996:11;3993:19;3990:39;;;4025:1;4022;4015:12;3990:39;4052:24;;4111:2;4103:11;;4099:21;-1:-1:-1;4089:49:315;;4134:1;4131;4124:12;4089:49;4182:2;4178;4174:11;4161:25;4209:2;4234;4230;4227:10;4224:36;;;4240:18;;:::i;:::-;4288:51;4312:11;;;-1:-1:-1;;4308:25:315;4304:34;;4288:51;:::i;:::-;4368:2;4359:7;4352:19;4412:3;4407:2;4402;4398;4394:11;4390:20;4387:29;4384:49;;;4429:1;4426;4419:12;4384:49;4490:2;4485;4481;4477:11;4472:2;4463:7;4459:16;4446:47;4540:1;4517:16;;;4513:25;;4506:36;;;;-1:-1:-1;4555:20:315;;-1:-1:-1;3904:12:315;;;;4595;;;;3871:746;;;4635:5;3288:1358;-1:-1:-1;;;;;;;;;3288:1358:315:o;4651:1021::-;4791:6;4799;4807;4815;4823;4831;4884:3;4872:9;4863:7;4859:23;4855:33;4852:53;;;4901:1;4898;4891:12;4852:53;4924:27;4941:9;4924:27;:::i;:::-;4914:37;;5002:2;4991:9;4987:18;4974:32;5025:18;5066:2;5058:6;5055:14;5052:34;;;5082:1;5079;5072:12;5052:34;5121:58;5171:7;5162:6;5151:9;5147:22;5121:58;:::i;:::-;5198:8;;-1:-1:-1;5095:84:315;-1:-1:-1;5286:2:315;5271:18;;5258:32;;-1:-1:-1;5302:16:315;;;5299:36;;;5331:1;5328;5321:12;5299:36;5354:61;5407:7;5396:8;5385:9;5381:24;5354:61;:::i;:::-;5344:71;;5468:2;5457:9;5453:18;5440:32;5424:48;;5497:2;5487:8;5484:16;5481:36;;;5513:1;5510;5503:12;5481:36;;5552:60;5604:7;5593:8;5582:9;5578:24;5552:60;:::i;:::-;4651:1021;;;;-1:-1:-1;4651:1021:315;;-1:-1:-1;4651:1021:315;;5631:8;;4651:1021;-1:-1:-1;;;4651:1021:315:o;5677:328::-;5754:6;5762;5770;5823:2;5811:9;5802:7;5798:23;5794:32;5791:52;;;5839:1;5836;5829:12;5791:52;5862:29;5881:9;5862:29;:::i;:::-;5852:39;;5910:38;5944:2;5933:9;5929:18;5910:38;:::i;:::-;5900:48;;5995:2;5984:9;5980:18;5967:32;5957:42;;5677:328;;;;;:::o;6400:477::-;6479:6;6487;6495;6548:2;6536:9;6527:7;6523:23;6519:32;6516:52;;;6564:1;6561;6554:12;6516:52;6604:9;6591:23;6637:18;6629:6;6626:30;6623:50;;;6669:1;6666;6659:12;6623:50;6708:58;6758:7;6749:6;6738:9;6734:22;6708:58;:::i;:::-;6785:8;;6682:84;;-1:-1:-1;6867:2:315;6852:18;;;;6839:32;;6400:477;-1:-1:-1;;;;6400:477:315:o;6882:854::-;6990:6;6998;7006;7014;7022;7030;7083:3;7071:9;7062:7;7058:23;7054:33;7051:53;;;7100:1;7097;7090:12;7051:53;7140:9;7127:23;7169:18;7210:2;7202:6;7199:14;7196:34;;;7226:1;7223;7216:12;7196:34;7265:58;7315:7;7306:6;7295:9;7291:22;7265:58;:::i;:::-;7342:8;;-1:-1:-1;7239:84:315;-1:-1:-1;7424:2:315;7409:18;;7396:32;;-1:-1:-1;7475:2:315;7460:18;;7447:32;;-1:-1:-1;7532:2:315;7517:18;;7504:32;;-1:-1:-1;7548:16:315;;;7545:36;;;7577:1;7574;7567:12;7741:717;7831:6;7839;7847;7855;7908:2;7896:9;7887:7;7883:23;7879:32;7876:52;;;7924:1;7921;7914:12;7876:52;7964:9;7951:23;7993:18;8034:2;8026:6;8023:14;8020:34;;;8050:1;8047;8040:12;8020:34;8089:58;8139:7;8130:6;8119:9;8115:22;8089:58;:::i;:::-;8166:8;;-1:-1:-1;8063:84:315;-1:-1:-1;8254:2:315;8239:18;;8226:32;;-1:-1:-1;8270:16:315;;;8267:36;;;8299:1;8296;8289:12;8267:36;;8338:60;8390:7;8379:8;8368:9;8364:24;8338:60;:::i;:::-;7741:717;;;;-1:-1:-1;8417:8:315;-1:-1:-1;;;;7741:717:315:o;8463:1309::-;8623:6;8631;8639;8647;8655;8663;8671;8679;8732:3;8720:9;8711:7;8707:23;8703:33;8700:53;;;8749:1;8746;8739:12;8700:53;8772:27;8789:9;8772:27;:::i;:::-;8762:37;;8850:2;8839:9;8835:18;8822:32;8873:18;8914:2;8906:6;8903:14;8900:34;;;8930:1;8927;8920:12;8900:34;8969:58;9019:7;9010:6;8999:9;8995:22;8969:58;:::i;:::-;9046:8;;-1:-1:-1;8943:84:315;-1:-1:-1;9134:2:315;9119:18;;9106:32;;-1:-1:-1;9150:16:315;;;9147:36;;;9179:1;9176;9169:12;9147:36;9202:61;9255:7;9244:8;9233:9;9229:24;9202:61;:::i;:::-;9192:71;;9316:2;9305:9;9301:18;9288:32;9272:48;;9345:2;9335:8;9332:16;9329:36;;;9361:1;9358;9351:12;9329:36;9400:60;9452:7;9441:8;9430:9;9426:24;9400:60;:::i;:::-;9479:8;;-1:-1:-1;9374:86:315;-1:-1:-1;9567:3:315;9552:19;;9539:33;;-1:-1:-1;9584:16:315;;;9581:36;;;9613:1;9610;9603:12;9581:36;;9652:60;9704:7;9693:8;9682:9;9678:24;9652:60;:::i;:::-;8463:1309;;;;-1:-1:-1;8463:1309:315;;-1:-1:-1;8463:1309:315;;;;;;9731:8;-1:-1:-1;;;8463:1309:315:o;9777:273::-;9833:6;9886:2;9874:9;9865:7;9861:23;9857:32;9854:52;;;9902:1;9899;9892:12;9854:52;9941:9;9928:23;9994:5;9987:13;9980:21;9973:5;9970:32;9960:60;;10016:1;10013;10006:12;10055:127;10116:10;10111:3;10107:20;10104:1;10097:31;10147:4;10144:1;10137:15;10171:4;10168:1;10161:15;10187:128;10254:9;;;10275:11;;;10272:37;;;10289:18;;:::i;10320:331::-;10425:9;10436;10478:8;10466:10;10463:24;10460:44;;;10500:1;10497;10490:12;10460:44;10529:6;10519:8;10516:20;10513:40;;;10549:1;10546;10539:12;10513:40;-1:-1:-1;;10575:23:315;;;10620:25;;;;;-1:-1:-1;10320:331:315:o;10656:699::-;11028:18;11023:3;11019:28;11010:6;11005:3;11001:16;10997:51;10992:3;10985:64;11078:6;11074:1;11069:3;11065:11;11058:27;11115:6;11110:2;11105:3;11101:12;11094:28;11152:6;11147:2;11142:3;11138:12;11131:28;11190:6;11184:3;11179;11175:13;11168:29;11242:6;11234;11228:3;11223;11219:13;11206:43;11308:3;11268:16;;11300:12;;;11293:28;11345:3;11337:12;;10656:699;-1:-1:-1;;;;;;10656:699:315:o;11360:266::-;11448:6;11443:3;11436:19;11500:6;11493:5;11486:4;11481:3;11477:14;11464:43;-1:-1:-1;11552:1:315;11527:16;;;11545:4;11523:27;;;11516:38;;;;11608:2;11587:15;;;-1:-1:-1;;11583:29:315;11574:39;;;11570:50;;11360:266::o;11631:459::-;11872:6;11861:9;11854:25;11915:6;11910:2;11899:9;11895:18;11888:34;11958:3;11953:2;11942:9;11938:18;11931:31;11835:4;11979:62;12036:3;12025:9;12021:19;12013:6;12005;11979:62;:::i;:::-;11971:70;;12077:6;12072:2;12061:9;12057:18;12050:34;11631:459;;;;;;;;:::o;12095:125::-;12160:9;;;12181:10;;;12178:36;;;12194:18;;:::i;14263:250::-;14348:1;14358:113;14372:6;14369:1;14366:13;14358:113;;;14448:11;;;14442:18;14429:11;;;14422:39;14394:2;14387:10;14358:113;;;-1:-1:-1;;14505:1:315;14487:16;;14480:27;14263:250::o;14518:719::-;14777:6;14766:9;14759:25;14820:6;14815:2;14804:9;14800:18;14793:34;14863:3;14858:2;14847:9;14843:18;14836:31;14740:4;14890:62;14947:3;14936:9;14932:19;14924:6;14916;14890:62;:::i;:::-;15000:9;14992:6;14988:22;14983:2;14972:9;14968:18;14961:50;15040:6;15034:13;15071:6;15063;15056:22;15087:76;15156:6;15151:2;15143:6;15139:15;15134:2;15126:6;15122:15;15087:76;:::i;:::-;15221:2;15200:15;-1:-1:-1;;15196:29:315;15184:42;15228:2;15180:51;;14518:719;-1:-1:-1;;;;;;;14518:719:315:o;15242:136::-;15281:3;15309:5;15299:39;;15318:18;;:::i;:::-;-1:-1:-1;;;15354:18:315;;15242:136::o;15383:127::-;15444:10;15439:3;15435:20;15432:1;15425:31;15475:4;15472:1;15465:15;15499:4;15496:1;15489:15;16267:345;16464:6;16459:3;16452:19;16515:6;16507;16502:2;16497:3;16493:12;16480:42;16434:3;16545:16;;16563:2;16541:25;16575:13;;;16541:25;16267:345;-1:-1:-1;;16267:345:315:o;16617:287::-;16746:3;16784:6;16778:13;16800:66;16859:6;16854:3;16847:4;16839:6;16835:17;16800:66;:::i;:::-;16882:16;;;;;16617:287;-1:-1:-1;;16617:287:315:o;16909:245::-;16988:6;16996;17049:2;17037:9;17028:7;17024:23;17020:32;17017:52;;;17065:1;17062;17055:12;17017:52;-1:-1:-1;;17088:16:315;;17144:2;17129:18;;;17123:25;17088:16;;17123:25;;-1:-1:-1;16909:245:315:o;17291:407::-;17493:2;17475:21;;;17532:2;17512:18;;;17505:30;17571:34;17566:2;17551:18;;17544:62;-1:-1:-1;;;17637:2:315;17622:18;;17615:41;17688:3;17673:19;;17291:407::o;18388:168::-;18461:9;;;18492;;18509:15;;;18503:22;;18489:37;18479:71;;18530:18;;:::i;18910:184::-;18980:6;19033:2;19021:9;19012:7;19008:23;19004:32;19001:52;;;19049:1;19046;19039:12;19001:52;-1:-1:-1;19072:16:315;;18910:184;-1:-1:-1;18910:184:315:o","linkReferences":{},"immutableReferences":{"90536":[{"start":472,"length":32},{"start":1300,"length":32},{"start":3153,"length":32}],"90539":[{"start":837,"length":32},{"start":3965,"length":32},{"start":6249,"length":32},{"start":6686,"length":32},{"start":7708,"length":32}],"90542":[{"start":774,"length":32},{"start":1443,"length":32},{"start":3355,"length":32}]}},"methodIdentifiers":{"addProver(address)":"1d49e457","addSequencer(address)":"8a336231","commitBatch(uint8,bytes,bytes[],bytes)":"1325aca0","commitBatchWithBlobProof(uint8,bytes,bytes[],bytes,bytes)":"86b053a9","committedBatches(uint256)":"2362f03e","finalizeBatchWithProof4844(bytes,bytes32,bytes32,bytes32,bytes,bytes)":"00b0f4d7","finalizeBundleWithProof(bytes,bytes32,bytes32,bytes)":"4f099e3d","finalizedStateRoots(uint256)":"2571098d","importGenesisBatch(bytes,bytes32)":"3fdeecb2","initialize(address,address,uint256)":"1794bb3c","isBatchFinalized(uint256)":"116a1f42","isProver(address)":"0a245924","isSequencer(address)":"6d46e987","lastFinalizedBatchIndex()":"059def61","layer2ChainId()":"03c7f4af","maxNumTxInChunk()":"ef6602ba","messageQueue()":"3b70c18a","owner()":"8da5cb5b","paused()":"5c975abb","removeProver(address)":"b571d3dd","removeSequencer(address)":"6989ca7c","renounceOwnership()":"715018a6","revertBatch(bytes,bytes)":"6df4e686","setPause(bool)":"bedb86fb","transferOwnership(address)":"f2fde38b","updateMaxNumTxInChunk(uint256)":"1e228302","verifier()":"2b7ac3f3","withdrawRoots(uint256)":"ea5f084f"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorAccountIsNotEOA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchHeaderV0LengthTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchHeaderV1LengthTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchHeaderV3LengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchIsAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchIsAlreadyVerified\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorBatchIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallPointEvaluationPrecompileFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotProver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotSequencer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorFoundMultipleBlobs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorGenesisBatchHasNonZeroField\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorGenesisBatchImported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorGenesisDataHashIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorGenesisParentBatchHashIsNonZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncompleteL2TransactionData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchVersion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBitmapLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBitmapLengthV0\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBitmapLengthV1\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectChunkLengthV1\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorLastL1MessageSkipped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlobFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInChunkV1\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNumTxsLessThanNumL1Msgs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorRevertFinalizedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorRevertNotStartFromEnd\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorRevertZeroBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorStateRootIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorTooManyTxsInOneChunk\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnexpectedPointEvaluationPrecompileOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxNumTxInChunk\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxNumTxInChunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateProver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateSequencer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"_chunks\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"_skippedL1MessageBitmap\",\"type\":\"bytes\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"_chunks\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"_skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_blobDataProof\",\"type\":\"bytes\"}],\"name\":\"commitBatchWithBlobProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_blobDataProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatchWithProof4844\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBundleWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isProver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isSequencer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"layer2ChainId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_firstBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_lastBatchHeader\",\"type\":\"bytes\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"updateMaxNumTxInChunk\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ErrorAccountIsNotEOA()\":[{\"details\":\"Thrown when the given account is not EOA account.\"}],\"ErrorBatchHeaderV0LengthTooSmall()\":[{\"details\":\"Thrown when the length of batch header is smaller than 89\"}],\"ErrorBatchHeaderV1LengthTooSmall()\":[{\"details\":\"Thrown when the length of batch header is smaller than 121.\"}],\"ErrorBatchHeaderV3LengthMismatch()\":[{\"details\":\"Thrown when the length of batch header is not equal to 193.\"}],\"ErrorBatchIsAlreadyCommitted()\":[{\"details\":\"Thrown when committing a committed batch.\"}],\"ErrorBatchIsAlreadyVerified()\":[{\"details\":\"Thrown when finalizing a verified batch.\"}],\"ErrorBatchIsEmpty()\":[{\"details\":\"Thrown when committing empty batch (batch without chunks)\"}],\"ErrorCallPointEvaluationPrecompileFailed()\":[{\"details\":\"Thrown when call precompile failed.\"}],\"ErrorCallerIsNotProver()\":[{\"details\":\"Thrown when the caller is not prover.\"}],\"ErrorCallerIsNotSequencer()\":[{\"details\":\"Thrown when the caller is not sequencer.\"}],\"ErrorFoundMultipleBlobs()\":[{\"details\":\"Thrown when the transaction has multiple blobs.\"}],\"ErrorGenesisBatchHasNonZeroField()\":[{\"details\":\"Thrown when some fields are not zero in genesis batch.\"}],\"ErrorGenesisBatchImported()\":[{\"details\":\"Thrown when importing genesis batch twice.\"}],\"ErrorGenesisDataHashIsZero()\":[{\"details\":\"Thrown when data hash in genesis batch is zero.\"}],\"ErrorGenesisParentBatchHashIsNonZero()\":[{\"details\":\"Thrown when the parent batch hash in genesis batch is zero.\"}],\"ErrorIncompleteL2TransactionData()\":[{\"details\":\"Thrown when the l2 transaction is incomplete.\"}],\"ErrorIncorrectBatchHash()\":[{\"details\":\"Thrown when the batch hash is incorrect.\"}],\"ErrorIncorrectBatchIndex()\":[{\"details\":\"Thrown when the batch index is incorrect.\"}],\"ErrorIncorrectBatchVersion()\":[{\"details\":\"Thrown when the batch version is incorrect.\"}],\"ErrorIncorrectBitmapLength()\":[{\"details\":\"Thrown when the bitmap length is incorrect.\"}],\"ErrorIncorrectBitmapLengthV0()\":[{\"details\":\"Thrown when the length of skippedL1MessageBitmap is incorrect.\"}],\"ErrorIncorrectBitmapLengthV1()\":[{\"details\":\"Thrown when the length of skippedL1MessageBitmap is incorrect.\"}],\"ErrorIncorrectChunkLengthV1()\":[{\"details\":\"Thrown when the length of chunk is incorrect.\"}],\"ErrorLastL1MessageSkipped()\":[{\"details\":\"Thrown when the last message is skipped.\"}],\"ErrorNoBlobFound()\":[{\"details\":\"Thrown when no blob found in the transaction.\"}],\"ErrorNoBlockInChunkV1()\":[{\"details\":\"Thrown when no blocks in chunk.\"}],\"ErrorNumTxsLessThanNumL1Msgs()\":[{\"details\":\"Thrown when the number of transactions is less than number of L1 message in one block.\"}],\"ErrorRevertFinalizedBatch()\":[{\"details\":\"Thrown when reverting a finalized batch.\"}],\"ErrorRevertNotStartFromEnd()\":[{\"details\":\"Thrown when the reverted batches are not in the ending of committed batch chain.\"}],\"ErrorRevertZeroBatches()\":[{\"details\":\"Thrown when the number of batches to revert is zero.\"}],\"ErrorStateRootIsZero()\":[{\"details\":\"Thrown when the given state root is zero.\"}],\"ErrorTooManyTxsInOneChunk()\":[{\"details\":\"Thrown when a chunk contains too many transactions.\"}],\"ErrorUnexpectedPointEvaluationPrecompileOutput()\":[{\"details\":\"Thrown when the precompile output is incorrect.\"}],\"ErrorZeroAddress()\":[{\"details\":\"Thrown when the given address is `address(0)`.\"}]},\"events\":{\"CommitBatch(uint256,bytes32)\":{\"params\":{\"batchHash\":\"The hash of the batch.\",\"batchIndex\":\"The index of the batch.\"}},\"FinalizeBatch(uint256,bytes32,bytes32,bytes32)\":{\"params\":{\"batchHash\":\"The hash of the batch\",\"batchIndex\":\"The index of the batch.\",\"stateRoot\":\"The state root on layer 2 after this batch.\",\"withdrawRoot\":\"The merkle root on layer2 after this batch.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"RevertBatch(uint256,bytes32)\":{\"params\":{\"batchHash\":\"The hash of the batch\",\"batchIndex\":\"The index of the batch.\"}},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"UpdateMaxNumTxInChunk(uint256,uint256)\":{\"params\":{\"newMaxNumTxInChunk\":\"The new value of `maxNumTxInChunk`.\",\"oldMaxNumTxInChunk\":\"The old value of `maxNumTxInChunk`.\"}},\"UpdateProver(address,bool)\":{\"params\":{\"account\":\"The address of account updated.\",\"status\":\"The status of the account updated.\"}},\"UpdateSequencer(address,bool)\":{\"params\":{\"account\":\"The address of account updated.\",\"status\":\"The status of the account updated.\"}}},\"kind\":\"dev\",\"methods\":{\"addProver(address)\":{\"params\":{\"_account\":\"The address of account to add.\"}},\"addSequencer(address)\":{\"params\":{\"_account\":\"The address of account to add.\"}},\"commitBatch(uint8,bytes,bytes[],bytes)\":{\"params\":{\"chunks\":\"The list of encoded chunks, see the comments of `ChunkCodec`.\",\"parentBatchHeader\":\"The header of parent batch, see the comments of `BatchHeaderV0Codec`.\",\"skippedL1MessageBitmap\":\"The bitmap indicates whether each L1 message is skipped or not.\",\"version\":\"The version of current batch.\"}},\"commitBatchWithBlobProof(uint8,bytes,bytes[],bytes,bytes)\":{\"details\":\"This function will revert unless all V0/V1/V2 batches are finalized. This is because we start to pop L1 messages in `commitBatchWithBlobProof` but not in `commitBatch`. We also introduce `finalizedQueueIndex` in `L1MessageQueue`. If one of V0/V1/V2 batches not finalized, `L1MessageQueue.pendingQueueIndex` will not match `parentBatchHeader.totalL1MessagePopped` and thus revert.\",\"params\":{\"blobDataProof\":\"The proof for blob data.\",\"chunks\":\"The list of encoded chunks, see the comments of `ChunkCodec`.\",\"parentBatchHeader\":\"The header of parent batch, see the comments of `BatchHeaderV0Codec`.\",\"skippedL1MessageBitmap\":\"The bitmap indicates whether each L1 message is skipped or not.\",\"version\":\"The version of current batch.\"}},\"constructor\":{\"params\":{\"_chainId\":\"The chain id of L2.\",\"_messageQueue\":\"The address of `L1MessageQueue` contract.\",\"_verifier\":\"The address of zkevm verifier contract.\"}},\"finalizeBatchWithProof4844(bytes,bytes32,bytes32,bytes32,bytes,bytes)\":{\"details\":\"Memory layout of `_blobDataProof`: ```text | z | y | kzg_commitment | kzg_proof | |---------|---------|----------------|-----------| | bytes32 | bytes32 | bytes48 | bytes48 | ```\",\"params\":{\"aggrProof\":\"The aggregation proof for current batch.\",\"batchHeader\":\"The header of current batch, see the encoding in comments of `commitBatch.\",\"blobDataProof\":\"The proof for blob data.\",\"postStateRoot\":\"The state root of current batch.\",\"prevStateRoot\":\"The state root of parent batch.\",\"withdrawRoot\":\"The withdraw trie root of current batch.\"}},\"finalizeBundleWithProof(bytes,bytes32,bytes32,bytes)\":{\"params\":{\"aggrProof\":\"The aggregation proof for current bundle.\",\"batchHeader\":\"The header of last batch in current bundle, see the encoding in comments of `commitBatch.\",\"postStateRoot\":\"The state root after current bundle.\",\"withdrawRoot\":\"The withdraw trie root after current batch.\"}},\"importGenesisBatch(bytes,bytes32)\":{\"params\":{\"_batchHeader\":\"The header of the genesis batch.\",\"_stateRoot\":\"The state root of the genesis block.\"}},\"initialize(address,address,uint256)\":{\"details\":\"The parameters `_messageQueue` are no longer used.\",\"params\":{\"_maxNumTxInChunk\":\"The maximum number of transactions allowed in each chunk.\",\"_messageQueue\":\"The address of `L1MessageQueue` contract.\",\"_verifier\":\"The address of zkevm verifier contract.\"}},\"isBatchFinalized(uint256)\":{\"params\":{\"batchIndex\":\"The index of the batch.\"},\"returns\":{\"_0\":\"Whether the batch is finalized by batch index.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"removeProver(address)\":{\"params\":{\"_account\":\"The address of account to remove.\"}},\"removeSequencer(address)\":{\"params\":{\"_account\":\"The address of account to remove.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"revertBatch(bytes,bytes)\":{\"details\":\"If the owner want to revert a sequence of batches by sending multiple transactions, make sure to revert recent batches first.\",\"params\":{\"firstBatchHeader\":\"The header of first batch to revert, see the encoding in comments of `commitBatch`.\",\"lastBatchHeader\":\"The header of last batch to revert, see the encoding in comments of `commitBatch`.\"}},\"setPause(bool)\":{\"params\":{\"_status\":\"The pause status to update.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateMaxNumTxInChunk(uint256)\":{\"params\":{\"_maxNumTxInChunk\":\"The new value of `maxNumTxInChunk`.\"}}},\"stateVariables\":{\"BLS_MODULUS\":{\"details\":\"BLS Modulus value defined in EIP-4844 and the magic value returned from a successful call to the point evaluation precompile\"},\"POINT_EVALUATION_PRECOMPILE_ADDR\":{\"details\":\"Address of the point evaluation precompile used for EIP-4844 blob verification.\"},\"__messageQueue\":{\"details\":\"The storage slot used as L1MessageQueue contract, which is deprecated now.\"},\"__verifier\":{\"details\":\"The storage slot used as RollupVerifier contract, which is deprecated now.\"},\"committedBatches\":{\"params\":{\"batchIndex\":\"The index of the batch.\"},\"return\":\"The batch hash of a committed batch.\",\"returns\":{\"_0\":\"The batch hash of a committed batch.\"}},\"finalizedStateRoots\":{\"params\":{\"batchIndex\":\"The index of the batch.\"},\"return\":\"The state root of a committed batch.\",\"returns\":{\"_0\":\"The state root of a committed batch.\"}},\"lastFinalizedBatchIndex\":{\"return\":\"The latest finalized batch index.\",\"returns\":{\"_0\":\"The latest finalized batch index.\"}},\"withdrawRoots\":{\"params\":{\"batchIndex\":\"The index of the batch.\"},\"return\":\"The message root of a committed batch.\",\"returns\":{\"_0\":\"The message root of a committed batch.\"}}},\"title\":\"ScrollChain\",\"version\":1},\"userdoc\":{\"events\":{\"CommitBatch(uint256,bytes32)\":{\"notice\":\"Emitted when a new batch is committed.\"},\"FinalizeBatch(uint256,bytes32,bytes32,bytes32)\":{\"notice\":\"Emitted when a batch is finalized.\"},\"RevertBatch(uint256,bytes32)\":{\"notice\":\"revert a pending batch.\"},\"UpdateMaxNumTxInChunk(uint256,uint256)\":{\"notice\":\"Emitted when the value of `maxNumTxInChunk` is updated.\"},\"UpdateProver(address,bool)\":{\"notice\":\"Emitted when owner updates the status of prover.\"},\"UpdateSequencer(address,bool)\":{\"notice\":\"Emitted when owner updates the status of sequencer.\"}},\"kind\":\"user\",\"methods\":{\"addProver(address)\":{\"notice\":\"Add an account to the prover list.\"},\"addSequencer(address)\":{\"notice\":\"Add an account to the sequencer list.\"},\"commitBatch(uint8,bytes,bytes[],bytes)\":{\"notice\":\"Commit a batch of transactions on layer 1.\"},\"commitBatchWithBlobProof(uint8,bytes,bytes[],bytes,bytes)\":{\"notice\":\"Commit a batch of transactions on layer 1 with blob data proof.\"},\"constructor\":{\"notice\":\"Constructor for `ScrollChain` implementation contract.\"},\"finalizeBatchWithProof4844(bytes,bytes32,bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Finalize a committed batch (with blob) on layer 1.\"},\"finalizeBundleWithProof(bytes,bytes32,bytes32,bytes)\":{\"notice\":\"Finalize a list of committed batches (i.e. bundle) on layer 1.\"},\"importGenesisBatch(bytes,bytes32)\":{\"notice\":\"Import layer 2 genesis block\"},\"initialize(address,address,uint256)\":{\"notice\":\"Initialize the storage of ScrollChain.\"},\"isProver(address)\":{\"notice\":\"Whether an account is a prover.\"},\"isSequencer(address)\":{\"notice\":\"Whether an account is a sequencer.\"},\"layer2ChainId()\":{\"notice\":\"The chain id of the corresponding layer 2 chain.\"},\"maxNumTxInChunk()\":{\"notice\":\"The maximum number of transactions allowed in each chunk.\"},\"messageQueue()\":{\"notice\":\"The address of L1MessageQueue contract.\"},\"removeProver(address)\":{\"notice\":\"Add an account from the prover list.\"},\"removeSequencer(address)\":{\"notice\":\"Remove an account from the sequencer list.\"},\"revertBatch(bytes,bytes)\":{\"notice\":\"Revert pending batches.\"},\"setPause(bool)\":{\"notice\":\"Pause the contract\"},\"updateMaxNumTxInChunk(uint256)\":{\"notice\":\"Update the value of `maxNumTxInChunk`.\"},\"verifier()\":{\"notice\":\"The address of RollupVerifier.\"}},\"notice\":\"This contract maintains data for the Scroll rollup.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/rollup/ScrollChain.sol\":\"ScrollChain\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=node_modules/hardhat/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9c7d1f5e15633ab912b74c2f57e24559e66b03232300d4b27ff0f25bc452ecad\",\"dweb:/ipfs/QmYTJkc1cntYkKQ1Tu11nBcJLakiy93Tjytc4XHELo4GmR\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"src/L1/rollup/IL1MessageQueue.sol\":{\"keccak256\":\"0x12004e1269374a9b58604c84c161ae7c94de0b5b7cd2167441c2c23fc790929c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04709bb7ddff34f9bb076bc76cadc281b190e71e0913bdcf15c0934f1e5ae660\",\"dweb:/ipfs/Qmcyfkw9rFSf7rM778vRnsynohGW1A6rqAqDZJ4D7xpA74\"]},\"src/L1/rollup/IScrollChain.sol\":{\"keccak256\":\"0xa43f6c16c56914af6050cb5c4c31d3d81ed7dcffaeccabf7f123da3bb9d0fa04\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f0adaaaa4cc500aed3b74725d367f047465eb9c8d917e602d59e254d5df53ae4\",\"dweb:/ipfs/QmbgWq7jcrxnZiqyWYtyNrTEaUvQtXA9efocj9LaetBov4\"]},\"src/L1/rollup/ScrollChain.sol\":{\"keccak256\":\"0x37fe716be23bd58680b4b8148d3f9a14392966f2b63822e36dfc4f20bae4cdcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e833008facb3da42c62fde8516c2f3c275a3f706fd77fffdb8058c9e348abc9\",\"dweb:/ipfs/QmRXjQcB8KxSAb5tDJSV43VTmb96vFSPx5nPdk3819suax\"]},\"src/libraries/codec/BatchHeaderV0Codec.sol\":{\"keccak256\":\"0x31426149d733acdb945595db8e4bd88694904a50dff15afa681d4f0b0bbaac1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6904ed476707011a8c6766ddca1f251bce0b6f0b08c338f1cd270d51ee235b7\",\"dweb:/ipfs/QmV49Rt3crrC61Wt45xXhiLRx2fK1tfHw8KCe7g4SU4Ret\"]},\"src/libraries/codec/BatchHeaderV1Codec.sol\":{\"keccak256\":\"0x99d8c56b185f3774f0f88edd55c30811a2be5c8890e439107bc928cd5bd6e893\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9732edf0dad89effbe903c7a3aa5fb395c9edc14fe16b8764cc13830f6b594ee\",\"dweb:/ipfs/QmQTnZTbpF1avHfj9PUtDaGurpgkaT6PEmxUsHmG2SwNgi\"]},\"src/libraries/codec/BatchHeaderV3Codec.sol\":{\"keccak256\":\"0xba330884ea1095fea56333f7f20f2896b993963a77ba66eb403ad22e2f5776e8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://27641d2667ff0f58c638f35295b5996bd5caa30501a92fa4860a78179a00119d\",\"dweb:/ipfs/QmaaKmtTNVShdSvVBrUT1uMoZmgTbhM89mtNbJYpYs6DXZ\"]},\"src/libraries/codec/ChunkCodecV0.sol\":{\"keccak256\":\"0xe4d0e5b3136937dc7c61ae205ca8b345b22f60d10a5bea8f3d49210384c24530\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://599bc4f2f58abfae7ad238c1fb6e0e01cca587a1a853c7126c0bf629f6c201be\",\"dweb:/ipfs/QmeWH7eV8VWgkfnxd1K9DexWuofuEX7rx1WnnFHgytmX5p\"]},\"src/libraries/codec/ChunkCodecV1.sol\":{\"keccak256\":\"0x421513cdb84d736ea0ecf5fe85988c35a2a77418c518f581de74e3a97dc3abb5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e7a774b055c0a3e50b536360f01b0c3795094cb313ef8ae67d09e49b1f3272d7\",\"dweb:/ipfs/QmWcC5GkPFdGDWptnKCVLAgzR9SKQf68JAHc5YKJWf4kXY\"]},\"src/libraries/verifier/IRollupVerifier.sol\":{\"keccak256\":\"0x37127d869f15c26361903f190ec3f1880e4e913b06bdaaeeb4fd55fdf7a352ec\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1a80471581647b554af6cb434afe9ef45b9bac407a1611e04df062ce1acc4663\",\"dweb:/ipfs/QmQDrn3vxzciaKU9R3vkiizPRyyd5pTZZW2faKN29YRqFt\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint64","name":"_chainId","type":"uint64"},{"internalType":"address","name":"_messageQueue","type":"address"},{"internalType":"address","name":"_verifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"ErrorAccountIsNotEOA"},{"inputs":[],"type":"error","name":"ErrorBatchHeaderV0LengthTooSmall"},{"inputs":[],"type":"error","name":"ErrorBatchHeaderV1LengthTooSmall"},{"inputs":[],"type":"error","name":"ErrorBatchHeaderV3LengthMismatch"},{"inputs":[],"type":"error","name":"ErrorBatchIsAlreadyCommitted"},{"inputs":[],"type":"error","name":"ErrorBatchIsAlreadyVerified"},{"inputs":[],"type":"error","name":"ErrorBatchIsEmpty"},{"inputs":[],"type":"error","name":"ErrorCallPointEvaluationPrecompileFailed"},{"inputs":[],"type":"error","name":"ErrorCallerIsNotProver"},{"inputs":[],"type":"error","name":"ErrorCallerIsNotSequencer"},{"inputs":[],"type":"error","name":"ErrorFoundMultipleBlobs"},{"inputs":[],"type":"error","name":"ErrorGenesisBatchHasNonZeroField"},{"inputs":[],"type":"error","name":"ErrorGenesisBatchImported"},{"inputs":[],"type":"error","name":"ErrorGenesisDataHashIsZero"},{"inputs":[],"type":"error","name":"ErrorGenesisParentBatchHashIsNonZero"},{"inputs":[],"type":"error","name":"ErrorIncompleteL2TransactionData"},{"inputs":[],"type":"error","name":"ErrorIncorrectBatchHash"},{"inputs":[],"type":"error","name":"ErrorIncorrectBatchIndex"},{"inputs":[],"type":"error","name":"ErrorIncorrectBatchVersion"},{"inputs":[],"type":"error","name":"ErrorIncorrectBitmapLength"},{"inputs":[],"type":"error","name":"ErrorIncorrectBitmapLengthV0"},{"inputs":[],"type":"error","name":"ErrorIncorrectBitmapLengthV1"},{"inputs":[],"type":"error","name":"ErrorIncorrectChunkLengthV1"},{"inputs":[],"type":"error","name":"ErrorLastL1MessageSkipped"},{"inputs":[],"type":"error","name":"ErrorNoBlobFound"},{"inputs":[],"type":"error","name":"ErrorNoBlockInChunkV1"},{"inputs":[],"type":"error","name":"ErrorNumTxsLessThanNumL1Msgs"},{"inputs":[],"type":"error","name":"ErrorRevertFinalizedBatch"},{"inputs":[],"type":"error","name":"ErrorRevertNotStartFromEnd"},{"inputs":[],"type":"error","name":"ErrorRevertZeroBatches"},{"inputs":[],"type":"error","name":"ErrorStateRootIsZero"},{"inputs":[],"type":"error","name":"ErrorTooManyTxsInOneChunk"},{"inputs":[],"type":"error","name":"ErrorUnexpectedPointEvaluationPrecompileOutput"},{"inputs":[],"type":"error","name":"ErrorZeroAddress"},{"inputs":[{"internalType":"uint256","name":"batchIndex","type":"uint256","indexed":true},{"internalType":"bytes32","name":"batchHash","type":"bytes32","indexed":true}],"type":"event","name":"CommitBatch","anonymous":false},{"inputs":[{"internalType":"uint256","name":"batchIndex","type":"uint256","indexed":true},{"internalType":"bytes32","name":"batchHash","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"stateRoot","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"withdrawRoot","type":"bytes32","indexed":false}],"type":"event","name":"FinalizeBatch","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"batchIndex","type":"uint256","indexed":true},{"internalType":"bytes32","name":"batchHash","type":"bytes32","indexed":true}],"type":"event","name":"RevertBatch","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"oldMaxNumTxInChunk","type":"uint256","indexed":false},{"internalType":"uint256","name":"newMaxNumTxInChunk","type":"uint256","indexed":false}],"type":"event","name":"UpdateMaxNumTxInChunk","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"bool","name":"status","type":"bool","indexed":false}],"type":"event","name":"UpdateProver","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"bool","name":"status","type":"bool","indexed":false}],"type":"event","name":"UpdateSequencer","anonymous":false},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addProver"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addSequencer"},{"inputs":[{"internalType":"uint8","name":"_version","type":"uint8"},{"internalType":"bytes","name":"_parentBatchHeader","type":"bytes"},{"internalType":"bytes[]","name":"_chunks","type":"bytes[]"},{"internalType":"bytes","name":"_skippedL1MessageBitmap","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"commitBatch"},{"inputs":[{"internalType":"uint8","name":"_version","type":"uint8"},{"internalType":"bytes","name":"_parentBatchHeader","type":"bytes"},{"internalType":"bytes[]","name":"_chunks","type":"bytes[]"},{"internalType":"bytes","name":"_skippedL1MessageBitmap","type":"bytes"},{"internalType":"bytes","name":"_blobDataProof","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"commitBatchWithBlobProof"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"committedBatches","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes","name":"_batchHeader","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"_postStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"_withdrawRoot","type":"bytes32"},{"internalType":"bytes","name":"_blobDataProof","type":"bytes"},{"internalType":"bytes","name":"_aggrProof","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBatchWithProof4844"},{"inputs":[{"internalType":"bytes","name":"_batchHeader","type":"bytes"},{"internalType":"bytes32","name":"_postStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"_withdrawRoot","type":"bytes32"},{"internalType":"bytes","name":"_aggrProof","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBundleWithProof"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"finalizedStateRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes","name":"_batchHeader","type":"bytes"},{"internalType":"bytes32","name":"_stateRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"importGenesisBatch"},{"inputs":[{"internalType":"address","name":"_messageQueue","type":"address"},{"internalType":"address","name":"_verifier","type":"address"},{"internalType":"uint256","name":"_maxNumTxInChunk","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"_batchIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"isBatchFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"isProver","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"isSequencer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"lastFinalizedBatchIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"layer2ChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxNumTxInChunk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"messageQueue","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeProver"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeSequencer"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"bytes","name":"_firstBatchHeader","type":"bytes"},{"internalType":"bytes","name":"_lastBatchHeader","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"revertBatch"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setPause"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"uint256","name":"_maxNumTxInChunk","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"updateMaxNumTxInChunk"},{"inputs":[],"stateMutability":"view","type":"function","name":"verifier","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"withdrawRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]}],"devdoc":{"kind":"dev","methods":{"addProver(address)":{"params":{"_account":"The address of account to add."}},"addSequencer(address)":{"params":{"_account":"The address of account to add."}},"commitBatch(uint8,bytes,bytes[],bytes)":{"params":{"chunks":"The list of encoded chunks, see the comments of `ChunkCodec`.","parentBatchHeader":"The header of parent batch, see the comments of `BatchHeaderV0Codec`.","skippedL1MessageBitmap":"The bitmap indicates whether each L1 message is skipped or not.","version":"The version of current batch."}},"commitBatchWithBlobProof(uint8,bytes,bytes[],bytes,bytes)":{"details":"This function will revert unless all V0/V1/V2 batches are finalized. This is because we start to pop L1 messages in `commitBatchWithBlobProof` but not in `commitBatch`. We also introduce `finalizedQueueIndex` in `L1MessageQueue`. If one of V0/V1/V2 batches not finalized, `L1MessageQueue.pendingQueueIndex` will not match `parentBatchHeader.totalL1MessagePopped` and thus revert.","params":{"blobDataProof":"The proof for blob data.","chunks":"The list of encoded chunks, see the comments of `ChunkCodec`.","parentBatchHeader":"The header of parent batch, see the comments of `BatchHeaderV0Codec`.","skippedL1MessageBitmap":"The bitmap indicates whether each L1 message is skipped or not.","version":"The version of current batch."}},"constructor":{"params":{"_chainId":"The chain id of L2.","_messageQueue":"The address of `L1MessageQueue` contract.","_verifier":"The address of zkevm verifier contract."}},"finalizeBatchWithProof4844(bytes,bytes32,bytes32,bytes32,bytes,bytes)":{"details":"Memory layout of `_blobDataProof`: ```text | z | y | kzg_commitment | kzg_proof | |---------|---------|----------------|-----------| | bytes32 | bytes32 | bytes48 | bytes48 | ```","params":{"aggrProof":"The aggregation proof for current batch.","batchHeader":"The header of current batch, see the encoding in comments of `commitBatch.","blobDataProof":"The proof for blob data.","postStateRoot":"The state root of current batch.","prevStateRoot":"The state root of parent batch.","withdrawRoot":"The withdraw trie root of current batch."}},"finalizeBundleWithProof(bytes,bytes32,bytes32,bytes)":{"params":{"aggrProof":"The aggregation proof for current bundle.","batchHeader":"The header of last batch in current bundle, see the encoding in comments of `commitBatch.","postStateRoot":"The state root after current bundle.","withdrawRoot":"The withdraw trie root after current batch."}},"importGenesisBatch(bytes,bytes32)":{"params":{"_batchHeader":"The header of the genesis batch.","_stateRoot":"The state root of the genesis block."}},"initialize(address,address,uint256)":{"details":"The parameters `_messageQueue` are no longer used.","params":{"_maxNumTxInChunk":"The maximum number of transactions allowed in each chunk.","_messageQueue":"The address of `L1MessageQueue` contract.","_verifier":"The address of zkevm verifier contract."}},"isBatchFinalized(uint256)":{"params":{"batchIndex":"The index of the batch."},"returns":{"_0":"Whether the batch is finalized by batch index."}},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"removeProver(address)":{"params":{"_account":"The address of account to remove."}},"removeSequencer(address)":{"params":{"_account":"The address of account to remove."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"revertBatch(bytes,bytes)":{"details":"If the owner want to revert a sequence of batches by sending multiple transactions, make sure to revert recent batches first.","params":{"firstBatchHeader":"The header of first batch to revert, see the encoding in comments of `commitBatch`.","lastBatchHeader":"The header of last batch to revert, see the encoding in comments of `commitBatch`."}},"setPause(bool)":{"params":{"_status":"The pause status to update."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateMaxNumTxInChunk(uint256)":{"params":{"_maxNumTxInChunk":"The new value of `maxNumTxInChunk`."}}},"version":1},"userdoc":{"kind":"user","methods":{"addProver(address)":{"notice":"Add an account to the prover list."},"addSequencer(address)":{"notice":"Add an account to the sequencer list."},"commitBatch(uint8,bytes,bytes[],bytes)":{"notice":"Commit a batch of transactions on layer 1."},"commitBatchWithBlobProof(uint8,bytes,bytes[],bytes,bytes)":{"notice":"Commit a batch of transactions on layer 1 with blob data proof."},"constructor":{"notice":"Constructor for `ScrollChain` implementation contract."},"finalizeBatchWithProof4844(bytes,bytes32,bytes32,bytes32,bytes,bytes)":{"notice":"Finalize a committed batch (with blob) on layer 1."},"finalizeBundleWithProof(bytes,bytes32,bytes32,bytes)":{"notice":"Finalize a list of committed batches (i.e. bundle) on layer 1."},"importGenesisBatch(bytes,bytes32)":{"notice":"Import layer 2 genesis block"},"initialize(address,address,uint256)":{"notice":"Initialize the storage of ScrollChain."},"isProver(address)":{"notice":"Whether an account is a prover."},"isSequencer(address)":{"notice":"Whether an account is a sequencer."},"layer2ChainId()":{"notice":"The chain id of the corresponding layer 2 chain."},"maxNumTxInChunk()":{"notice":"The maximum number of transactions allowed in each chunk."},"messageQueue()":{"notice":"The address of L1MessageQueue contract."},"removeProver(address)":{"notice":"Add an account from the prover list."},"removeSequencer(address)":{"notice":"Remove an account from the sequencer list."},"revertBatch(bytes,bytes)":{"notice":"Revert pending batches."},"setPause(bool)":{"notice":"Pause the contract"},"updateMaxNumTxInChunk(uint256)":{"notice":"Update the value of `maxNumTxInChunk`."},"verifier()":{"notice":"The address of RollupVerifier."}},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/L1/rollup/ScrollChain.sol":"ScrollChain"},"evmVersion":"cancun","libraries":{}},"sources":{"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98","urls":["bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8","dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"keccak256":"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250","urls":["bzz-raw://9c7d1f5e15633ab912b74c2f57e24559e66b03232300d4b27ff0f25bc452ecad","dweb:/ipfs/QmYTJkc1cntYkKQ1Tu11nBcJLakiy93Tjytc4XHELo4GmR"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"src/L1/rollup/IL1MessageQueue.sol":{"keccak256":"0x12004e1269374a9b58604c84c161ae7c94de0b5b7cd2167441c2c23fc790929c","urls":["bzz-raw://04709bb7ddff34f9bb076bc76cadc281b190e71e0913bdcf15c0934f1e5ae660","dweb:/ipfs/Qmcyfkw9rFSf7rM778vRnsynohGW1A6rqAqDZJ4D7xpA74"],"license":"MIT"},"src/L1/rollup/IScrollChain.sol":{"keccak256":"0xa43f6c16c56914af6050cb5c4c31d3d81ed7dcffaeccabf7f123da3bb9d0fa04","urls":["bzz-raw://f0adaaaa4cc500aed3b74725d367f047465eb9c8d917e602d59e254d5df53ae4","dweb:/ipfs/QmbgWq7jcrxnZiqyWYtyNrTEaUvQtXA9efocj9LaetBov4"],"license":"MIT"},"src/L1/rollup/ScrollChain.sol":{"keccak256":"0x37fe716be23bd58680b4b8148d3f9a14392966f2b63822e36dfc4f20bae4cdcf","urls":["bzz-raw://5e833008facb3da42c62fde8516c2f3c275a3f706fd77fffdb8058c9e348abc9","dweb:/ipfs/QmRXjQcB8KxSAb5tDJSV43VTmb96vFSPx5nPdk3819suax"],"license":"MIT"},"src/libraries/codec/BatchHeaderV0Codec.sol":{"keccak256":"0x31426149d733acdb945595db8e4bd88694904a50dff15afa681d4f0b0bbaac1f","urls":["bzz-raw://f6904ed476707011a8c6766ddca1f251bce0b6f0b08c338f1cd270d51ee235b7","dweb:/ipfs/QmV49Rt3crrC61Wt45xXhiLRx2fK1tfHw8KCe7g4SU4Ret"],"license":"MIT"},"src/libraries/codec/BatchHeaderV1Codec.sol":{"keccak256":"0x99d8c56b185f3774f0f88edd55c30811a2be5c8890e439107bc928cd5bd6e893","urls":["bzz-raw://9732edf0dad89effbe903c7a3aa5fb395c9edc14fe16b8764cc13830f6b594ee","dweb:/ipfs/QmQTnZTbpF1avHfj9PUtDaGurpgkaT6PEmxUsHmG2SwNgi"],"license":"MIT"},"src/libraries/codec/BatchHeaderV3Codec.sol":{"keccak256":"0xba330884ea1095fea56333f7f20f2896b993963a77ba66eb403ad22e2f5776e8","urls":["bzz-raw://27641d2667ff0f58c638f35295b5996bd5caa30501a92fa4860a78179a00119d","dweb:/ipfs/QmaaKmtTNVShdSvVBrUT1uMoZmgTbhM89mtNbJYpYs6DXZ"],"license":"MIT"},"src/libraries/codec/ChunkCodecV0.sol":{"keccak256":"0xe4d0e5b3136937dc7c61ae205ca8b345b22f60d10a5bea8f3d49210384c24530","urls":["bzz-raw://599bc4f2f58abfae7ad238c1fb6e0e01cca587a1a853c7126c0bf629f6c201be","dweb:/ipfs/QmeWH7eV8VWgkfnxd1K9DexWuofuEX7rx1WnnFHgytmX5p"],"license":"MIT"},"src/libraries/codec/ChunkCodecV1.sol":{"keccak256":"0x421513cdb84d736ea0ecf5fe85988c35a2a77418c518f581de74e3a97dc3abb5","urls":["bzz-raw://e7a774b055c0a3e50b536360f01b0c3795094cb313ef8ae67d09e49b1f3272d7","dweb:/ipfs/QmWcC5GkPFdGDWptnKCVLAgzR9SKQf68JAHc5YKJWf4kXY"],"license":"MIT"},"src/libraries/verifier/IRollupVerifier.sol":{"keccak256":"0x37127d869f15c26361903f190ec3f1880e4e913b06bdaaeeb4fd55fdf7a352ec","urls":["bzz-raw://1a80471581647b554af6cb434afe9ef45b9bac407a1611e04df062ce1acc4663","dweb:/ipfs/QmQDrn3vxzciaKU9R3vkiizPRyyd5pTZZW2faKN29YRqFt"],"license":"MIT"}},"version":1},"id":162} \ No newline at end of file diff --git a/crates/l1/src/abi.rs b/crates/l1/src/abi.rs new file mode 100644 index 00000000..81b1bf40 --- /dev/null +++ b/crates/l1/src/abi.rs @@ -0,0 +1,15 @@ +use alloy_sol_types::sol; + +// L1 Message Queue Contract +sol!( + #[allow(missing_docs)] + L1MessageQueue, + "abi/L1MessageQueue.json", +); + +// Scroll Chain Contract +sol!( + #[allow(missing_docs)] + ScrollChain, + "abi/ScrollChain.json", +); diff --git a/crates/l1/src/constants.rs b/crates/l1/src/constants.rs new file mode 100644 index 00000000..e6208272 --- /dev/null +++ b/crates/l1/src/constants.rs @@ -0,0 +1,11 @@ +use alloy_primitives::{address, Address}; + +// TODO: Update the addresses. + +/// The address of the L1 Message Queue contract on mainnet. +pub const MAINNET_L1_MESSAGE_QUEUE_ADDRESS: Address = + address!("0000000000000000000000000000000000000000"); + +/// The address of the Scroll Chain contract on mainnet. +pub const MAINNET_L1_SCROLL_CHAIN_ADDRESS: Address = + address!("0000000000000000000000000000000000000000"); diff --git a/crates/l1/src/event.rs b/crates/l1/src/event.rs new file mode 100644 index 00000000..c4e1b324 --- /dev/null +++ b/crates/l1/src/event.rs @@ -0,0 +1,17 @@ +use scroll_primitives::{BatchInput, L1Message}; +use std::sync::Arc; + +/// An observation from the L1. +#[derive(Debug)] +pub enum L1Event { + /// A new batch input has been committed to L1 with the given [`BatchInput`]. + CommitBatch(Arc), + /// A new [`L1Message`] has been added to the L1 message queue. + L1Message(Arc), + /// A new block has been added to the L1. + NewBlock(u64), + /// A reorg has occurred at the given block number. + Reorg(u64), + /// The L1 has been finalized at the given block number. + Finalized(u64), +} diff --git a/crates/l1/src/lib.rs b/crates/l1/src/lib.rs new file mode 100644 index 00000000..4f48bb4f --- /dev/null +++ b/crates/l1/src/lib.rs @@ -0,0 +1,10 @@ +//! A library containing the logic required to interact with L1. + +mod abi; +mod constants; +mod event; +mod watcher; + +pub use constants::*; +pub use event::L1Event; +pub use watcher::L1Watcher; diff --git a/crates/l1/src/watcher.rs b/crates/l1/src/watcher.rs new file mode 100644 index 00000000..b31e0210 --- /dev/null +++ b/crates/l1/src/watcher.rs @@ -0,0 +1,17 @@ +use super::L1Event; +use futures::Stream; + +/// A watcher for observing events from the L1. +#[derive(Debug)] +pub struct L1Watcher; + +impl Stream for L1Watcher { + type Item = L1Event; + + fn poll_next( + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + todo!() + } +} diff --git a/crates/network/src/manager.rs b/crates/network/src/manager.rs index d2e20b7d..a9a95110 100644 --- a/crates/network/src/manager.rs +++ b/crates/network/src/manager.rs @@ -124,7 +124,11 @@ impl NetworkManager { match event { ScrollWireEvent::NewBlock { peer_id, block, signature } => { trace!(target: "scroll::network::manager", peer_id = ?peer_id, block = ?block.hash_slow(), signature = ?signature, "Received new block"); - NetworkManagerEvent::NewBlock(NewBlockWithPeer { peer_id, block, signature }) + NetworkManagerEvent::NewBlock(NewBlockWithPeer { + peer_id, + block: *block, + signature, + }) } // Only `NewBlock` events are expected from the scroll-wire protocol. _ => { diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 290f8c30..cbda026e 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -28,7 +28,10 @@ reth-scroll-primitives.workspace = true # scroll scroll-engine.workspace = true +scroll-indexer.workspace = true +scroll-l1.workspace = true scroll-network.workspace = true +scroll-pipeline.workspace = true scroll-wire.workspace = true # misc diff --git a/crates/node/src/config.rs b/crates/node/src/config.rs new file mode 100644 index 00000000..55bc8255 --- /dev/null +++ b/crates/node/src/config.rs @@ -0,0 +1,25 @@ +/// The configuration of the rollup node. +#[derive(Debug)] +pub struct Config { + /// If it is a sequencer node. + is_sequencer: bool, + /// The block time in milliseconds. + block_time: u64, +} + +impl Config { + /// Creates a new configuration. + pub const fn new(is_sequencer: bool, block_time: u64) -> Self { + Self { is_sequencer, block_time } + } + + /// Returns a boolean representing if the node is a sequencer. + pub const fn is_sequencer(&self) -> bool { + self.is_sequencer + } + + /// Returns the block time in milliseconds. + pub const fn block_time(&self) -> u64 { + self.block_time + } +} diff --git a/crates/node/src/lib.rs b/crates/node/src/lib.rs index 8375ac32..d87c6115 100644 --- a/crates/node/src/lib.rs +++ b/crates/node/src/lib.rs @@ -11,10 +11,13 @@ use scroll_alloy_provider::ScrollEngineApi; use scroll_engine::{ BlockInfo, EngineDriver, EngineDriverError, ExecutionPayloadProvider, ForkchoiceState, }; +use scroll_indexer::Indexer; +use scroll_l1::{L1Event, L1Watcher}; use scroll_network::{ BlockImportError, BlockImportOutcome, BlockValidation, BlockValidationError, NetworkManager, NetworkManagerEvent, NewBlockWithPeer, }; +use scroll_pipeline::Pipeline; use scroll_wire::NewBlock; use std::{ future::Future, @@ -33,6 +36,12 @@ mod consensus; use consensus::Consensus; pub use consensus::PoAConsensus; +mod config; +pub use config::Config; + +mod state; +pub use state::State; + /// The size of the event channel. const EVENT_CHANNEL_SIZE: usize = 100; @@ -55,12 +64,23 @@ type PendingBlockImportFuture = /// - `event_sender`: An event sender for sending events to subscribers of the rollup node manager. #[derive(Debug)] pub struct RollupNodeManager { + /// The configuration of the rollup node. + #[allow(dead_code)] + config: Config, /// The network manager that manages the scroll p2p network. network: NetworkManager, /// The engine driver used to communicate with the engine. engine: Arc>, /// The consensus algorithm used by the rollup node. consensus: C, + /// The L1 watcher for observing events from the L1. + l1_watcher: L1Watcher, + /// The indexer for indexing rollup node data. + #[allow(dead_code)] + indexer: Indexer, + /// The pipeline that derives the scroll chain from L1 events. + #[allow(dead_code)] + pipeline: Pipeline, /// The receiver for new blocks received from the network (used to bridge from eth-wire). new_block_rx: UnboundedReceiverStream, /// The forkchoice state of the rollup node. @@ -78,17 +98,26 @@ where P: ExecutionPayloadProvider + Unpin + Send + Sync + 'static, { /// Create a new [`RollupNodeManager`] instance. + #[allow(clippy::too_many_arguments)] pub fn new( + config: Config, network: NetworkManager, engine: EngineDriver, - forkchoice_state: ForkchoiceState, consensus: C, + l1_watcher: L1Watcher, + indexer: Indexer, + pipeline: Pipeline, + forkchoice_state: ForkchoiceState, new_block_rx: UnboundedReceiver, ) -> Self { Self { + config, network, engine: Arc::new(engine), consensus, + l1_watcher, + indexer, + pipeline, new_block_rx: new_block_rx.into(), forkchoice_state, pending_block_imports: FuturesOrdered::new(), @@ -194,6 +223,11 @@ where } } + /// Handles an L1 event from the L1 watcher. + fn handle_l1_event(&self, _event: L1Event) { + todo!() + } + /// Handles a block import outcome. fn handle_block_import_outcome( &mut self, @@ -225,6 +259,11 @@ where fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.get_mut(); + // Handle observations from the L1 watcher. + while let Poll::Ready(Some(event)) = this.l1_watcher.poll_next_unpin(cx) { + this.handle_l1_event(event); + } + // Handle pending block imports. while let Poll::Ready(Some((block_info, outcome))) = this.pending_block_imports.poll_next_unpin(cx) diff --git a/crates/node/src/state.rs b/crates/node/src/state.rs new file mode 100644 index 00000000..51fbd16b --- /dev/null +++ b/crates/node/src/state.rs @@ -0,0 +1,27 @@ +use scroll_engine::ForkchoiceState; + +/// The state of the node. +#[derive(Debug)] +pub struct State { + /// The forkchoice state of the node. + fcs: ForkchoiceState, + /// Whether the node is syncing. + is_syncing: bool, +} + +impl State { + /// Create a new [`State`] instance. + pub const fn new(fcs: ForkchoiceState, is_syncing: bool) -> Self { + Self { fcs, is_syncing } + } + + /// Get a reference to the [`ForkchoiceState`] of the node. + pub const fn fcs(&self) -> &ForkchoiceState { + &self.fcs + } + + /// Returns a bool indicating whether the node is syncing. + pub const fn is_syncing(&self) -> bool { + self.is_syncing + } +} diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml new file mode 100644 index 00000000..d9ca9139 --- /dev/null +++ b/crates/pipeline/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "scroll-pipeline" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] +# scroll-alloy +scroll-alloy-rpc-types-engine.workspace = true + +# rollup-node +scroll-primitives.workspace = true + +# misc +futures.workspace = true + +[lints] +workspace = true diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs new file mode 100644 index 00000000..3bbe8272 --- /dev/null +++ b/crates/pipeline/src/lib.rs @@ -0,0 +1,36 @@ +//! Pipeline for processing batch inputs. + +use futures::Stream; +use scroll_alloy_rpc_types_engine::ScrollPayloadAttributes; +use scroll_primitives::BatchInput; + +/// A pipeline for processing batch inputs and producing scroll payloads. +#[derive(Debug, Default)] +pub struct Pipeline; + +impl Pipeline { + /// Handles a batch input. + pub fn handle_batch_input(&mut self, _batch_input: BatchInput) { + // Handle the batch input. + todo!() + } + + /// Gets the next scroll payload. + pub fn next_attributes(&mut self) -> Option { + // Get the next scroll payload. + todo!() + } +} + +impl Stream for Pipeline { + type Item = ScrollPayloadAttributes; + + fn poll_next( + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + let _this = self.get_mut(); + + todo!() + } +} diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml new file mode 100644 index 00000000..92ab87a2 --- /dev/null +++ b/crates/primitives/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "scroll-primitives" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] +# alloy +alloy-consensus = { version = "0.11.1", default-features = false } +alloy-primitives.workspace = true + +# scroll-alloy +scroll-alloy-consensus = { git = "https://github.com/scroll-tech/reth.git", branch = "feat/add-deref-blanket-engine-api" } + +# reth-scroll +reth-scroll-primitives.workspace = true + +[lints] +workspace = true diff --git a/crates/primitives/src/batch/input.rs b/crates/primitives/src/batch/input.rs new file mode 100644 index 00000000..3818dfe0 --- /dev/null +++ b/crates/primitives/src/batch/input.rs @@ -0,0 +1,41 @@ +use alloy_primitives::B256; + +/// The input data for a batch. +/// +/// This is used as input for the derivation pipeline. All data remains in its raw serialized form. +/// The data is then deserialized, enriched and processed in the derivation pipeline. +#[derive(Debug)] +pub enum BatchInput { + /// The input data for a batch. + BatchInputDataV1(BatchInputV1), + /// The input data for a batch including the L1 blob. + BatchInputDataV2(BatchInputV2), +} + +/// The input data for a batch. +#[derive(Debug)] +pub struct BatchInputV1 { + /// The version of the batch input data. + pub version: u8, + /// The index of the batch. + pub batch_index: u64, + /// The batch hash. + pub batch_hash: B256, + /// The L1 block number at which the batch was committed. + pub block_number: u64, + /// The parent batch header. + pub parent_batch_header: Vec, + /// The chunks in the batch. + pub chunks: Vec>, + /// The skipped L1 message bitmap. + pub skipped_l1_message_bitmap: Vec, +} + +/// The input data for a batch including the L1 blob hash. +#[derive(Debug)] +pub struct BatchInputV2 { + /// The base input data for the batch. + pub batch_input_data: BatchInputV1, + /// The L1 blob hash associated with the batch. + pub blob_hash: B256, +} diff --git a/crates/primitives/src/batch/mod.rs b/crates/primitives/src/batch/mod.rs new file mode 100644 index 00000000..b2538c5e --- /dev/null +++ b/crates/primitives/src/batch/mod.rs @@ -0,0 +1,50 @@ +use super::{BlockCommitment, Chunk}; +use alloy_primitives::B256; + +mod input; +pub use input::BatchInput; + +/// A batch is the unit of settlement to L1 for the scroll rollup. +/// +/// A batch contains a list of chunks, which contain a list of block commitments. +/// A batch additionally contains metadata related to the batch. +#[derive(Debug)] +pub struct Batch { + /// The index of the batch. + pub index: u64, + /// The total number of L1 messages popped before this batch. + pub total_l1_messages_popped_before: u64, + /// The hash of the parent batch. + pub parent_hash: B256, + /// The chunks in the batch. + pub chunks: Vec, + /// The hash of the L1 message queue before the batch. + pub prev_l1_message_queue_hash: B256, + /// The hash of the L1 message queue after the batch. + pub post_l1_message_queue_hash: B256, + /// The block commitments in the batch. + pub blocks: Vec, +} + +impl Batch { + /// Creates a new [`Batch`] instance. + pub const fn new( + index: u64, + total_l1_messages_popped_before: u64, + parent_hash: B256, + chunks: Vec, + prev_l1_message_queue_hash: B256, + post_l1_message_queue_hash: B256, + blocks: Vec, + ) -> Self { + Self { + index, + total_l1_messages_popped_before, + parent_hash, + chunks, + prev_l1_message_queue_hash, + post_l1_message_queue_hash, + blocks, + } + } +} diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs new file mode 100644 index 00000000..07c1f519 --- /dev/null +++ b/crates/primitives/src/block.rs @@ -0,0 +1,29 @@ +use alloy_consensus::Header; +use alloy_primitives::B256; +use reth_scroll_primitives::ScrollTransactionSigned; + +/// A [`BlockCommitment`] is a single block commitment that is settled to L1. +#[derive(Debug)] +pub struct BlockCommitment { + /// The header of the block commitment. + pub header: Header, + /// The transactions in the block commitment. + pub transactions: Vec, + /// The withdrawal root of the block commitment. + pub withdraw_root: B256, + /// The prover row consumption of the block commitment. + pub row_consumption: RowConsumption, +} + +/// The row consumption of a block commitment. +#[derive(Debug)] +pub struct RowConsumption(pub Vec); + +/// The row consumption of a sub-circuit. +#[derive(Debug)] +pub struct SubCircuitRowConsumption { + /// The name of the sub-circuit. + pub name: String, + /// The number of rows consumed by the sub-circuit. + pub row_number: u64, +} diff --git a/crates/primitives/src/chunk.rs b/crates/primitives/src/chunk.rs new file mode 100644 index 00000000..ce2591b2 --- /dev/null +++ b/crates/primitives/src/chunk.rs @@ -0,0 +1,16 @@ +use super::BlockCommitment; +use alloy_primitives::B256; + +/// A [`Chunk`] is a series of block commitments that are settled to L1. +/// +/// A [`Chunk`] is series of blocks that are proven by a single prover. A collection of [`Chunk`]s +/// are grouped into a [`super::Batch`]. +#[derive(Debug)] +pub struct Chunk { + /// A collection of block commitments. + pub blocks: Vec, + /// The hash of the L1 message queue before the chunk. + pub prev_l1_message_queue_hash: B256, + /// The hash of the L1 message queue after the chunk. + pub post_l1_message_queue_hash: B256, +} diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs new file mode 100644 index 00000000..4cd432ab --- /dev/null +++ b/crates/primitives/src/lib.rs @@ -0,0 +1,11 @@ +//! The primitive types of the Scroll Rollup Node. + +mod batch; +mod block; +mod chunk; +mod transaction; + +pub use batch::{Batch, BatchInput}; +pub use block::BlockCommitment; +pub use chunk::Chunk; +pub use transaction::L1Message; diff --git a/crates/primitives/src/transaction.rs b/crates/primitives/src/transaction.rs new file mode 100644 index 00000000..4d103dd2 --- /dev/null +++ b/crates/primitives/src/transaction.rs @@ -0,0 +1,12 @@ +use scroll_alloy_consensus::TxL1Message; + +/// A L1 message that is part of the L1 message queue. +#[derive(Debug)] +pub struct L1Message { + /// The index of the L1 message in the L1 message queue. + pub queue_index: u64, + /// The L1 block number at which the L1 message was generated. + pub block_number: u64, + /// The L1 transaction. + pub transaction: TxL1Message, +} diff --git a/crates/provider/Cargo.toml b/crates/provider/Cargo.toml new file mode 100644 index 00000000..c0df2b7f --- /dev/null +++ b/crates/provider/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "provider" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] + +[lints] +workspace = true diff --git a/crates/provider/src/lib.rs b/crates/provider/src/lib.rs new file mode 100644 index 00000000..5f16e23f --- /dev/null +++ b/crates/provider/src/lib.rs @@ -0,0 +1,7 @@ +//! This library provides the traits for retrieving data from various sources. + +// TODO: Move the implementations to a different crate so this crate will only contain the trait +// definitions / API. +/// A provider that implements the traits for retrieving data from various sources. +#[derive(Debug, Default)] +pub struct Provider; diff --git a/crates/scroll-wire/src/connection/mod.rs b/crates/scroll-wire/src/connection/mod.rs index 418d5497..6b879094 100644 --- a/crates/scroll-wire/src/connection/mod.rs +++ b/crates/scroll-wire/src/connection/mod.rs @@ -85,7 +85,7 @@ impl Stream for ScrollWireConnection { if let Ok(signature) = Signature::from_compact(&new_block.signature[..]) { this.events .send(ScrollWireEvent::NewBlock { - block: new_block.block, + block: Box::new(new_block.block), signature, peer_id: this.peer_id, }) diff --git a/crates/scroll-wire/src/protocol/event.rs b/crates/scroll-wire/src/protocol/event.rs index e3ff4774..3ff8e1e2 100644 --- a/crates/scroll-wire/src/protocol/event.rs +++ b/crates/scroll-wire/src/protocol/event.rs @@ -21,7 +21,7 @@ pub enum ScrollWireEvent { /// The peer id the block was received from. peer_id: PeerId, /// The block that was received. - block: reth_scroll_primitives::ScrollBlock, + block: Box, /// The signature of the block. signature: Signature, }, @@ -38,11 +38,11 @@ impl ScrollWireEvent { } /// Creates a new [`ScrollWireEvent::NewBlock`] event. - pub const fn new_block( + pub fn new_block( peer_id: PeerId, block: reth_scroll_primitives::ScrollBlock, signature: Signature, ) -> Self { - Self::NewBlock { peer_id, block, signature } + Self::NewBlock { peer_id, block: Box::new(block), signature } } } diff --git a/crates/sequencer/Cargo.toml b/crates/sequencer/Cargo.toml new file mode 100644 index 00000000..0b505df1 --- /dev/null +++ b/crates/sequencer/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "sequencer" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +exclude.workspace = true + +[dependencies] +# scroll-alloy +scroll-alloy-rpc-types-engine.workspace = true + +# reth-scroll +reth-scroll-primitives.workspace = true + +# rollup-node +scroll-engine.workspace = true +scroll-primitives.workspace = true + +# misc +futures.workspace = true +tokio.workspace = true + +[lints] +workspace = true diff --git a/crates/sequencer/src/lib.rs b/crates/sequencer/src/lib.rs new file mode 100644 index 00000000..e8e3047c --- /dev/null +++ b/crates/sequencer/src/lib.rs @@ -0,0 +1,68 @@ +//! Sequencer is a library that +use futures::Stream; +use std::{collections::VecDeque, sync::Arc}; +use tokio::time::Interval; + +use reth_scroll_primitives::ScrollBlock; +use scroll_engine::EngineDriver; +use scroll_primitives::L1Message; + +/// The sequencer is responsible for creating new [`ScrollBlock`]s. +#[derive(Debug)] +pub struct Sequencer { + // TODO: Replace with appropriate buffer type that is reorg aware. + /// A transaction queue for L1 messages. + #[allow(dead_code)] + tx_queue: VecDeque, + // TODO: Move to a rollup node manager. + /// The interval at which the sequencer creates new [`ScrollBlock`]s. + block_interval: Interval, + /// The [`EngineDriver`] that the sequencer uses to interact with the `EngineAPI` of the + /// execution client. + #[allow(dead_code)] + engine: Arc>, +} + +impl Sequencer { + /// Creates a new [`Sequencer`] instance. + pub fn new( + tx_queue: impl IntoIterator, + block_interval: Interval, + engine: EngineDriver, + ) -> Self { + Self { tx_queue: tx_queue.into_iter().collect(), block_interval, engine: Arc::new(engine) } + } + + /// Creates a new [`ScrollBlock`] based on the current state of the sequencer. + pub fn new_block(&mut self) -> ScrollBlock { + todo!() + } + + /// Handles a L1 message. + pub fn handle_l1_message(&mut self, _l1_message: L1Message) { + todo!() + } + + /// Handles a reorg at the provided block number. + pub fn handle_reorg(&mut self, _block_number: u64) { + todo!() + } +} + +impl Stream for Sequencer { + type Item = ScrollBlock; + + fn poll_next( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + let this = self.get_mut(); + + if this.block_interval.poll_tick(cx).is_ready() { + let block = this.new_block(); + std::task::Poll::Ready(Some(block)) + } else { + std::task::Poll::Pending + } + } +}